LinTO-diarization是LinTO的说话人分离服务,具备猜测说话人数的能力,若提供目标说话人的语音样本,还可进行说话人识别。该服务既可作为独立的说话人分离服务使用,也可部署为微服务。
此Docker镜像基于_nvidia/cuda:12.3.2-runtime-ubuntu22.04_构建
分离服务需要Docker环境正常运行。
若需启用GPU功能,还需安装nvidia-container-toolkit。
使用GPU时,每个工作进程消耗的显存约为1GB。
任务模式下,分离服务的唯一入口是发布到Redis消息代理的任务。此外,为避免大型音频文件通过消息代理传输,分离服务使用挂载到/opt/audio的共享存储文件夹。
linto-diarization支持两种部署方式:
1- 第一步:构建或拉取镜像
bashgit clone https://github.com/linto-ai/linto-diarization.git cd linto-diarization docker build . -t linto-diarization-simple:latest -f simple/Dockerfile
或
bashdocker pull lintoai/linto-diarization-simple
若需启用说话人识别,需运行Qdrant:
bashdocker run \ -p 6333:6333 \ # Qdrant默认端口 -v ./qdrant_storage:/qdrant/storage:z \ qdrant/qdrant
1- 配置.env文件
https://github.com/linto-ai/linto-diarization/blob/master/simple/.envdefault%E6%8F%90%E4%BE%9B%E4%BA%86.env%E6%96%87%E4%BB%B6%E7%A4%BA%E4%BE%8B%E3%80%82
环境变量参数:
| 变量名 | 描述 | 示例 |
|---|---|---|
SERVING_MODE | (必填)指定启动模式 | http |
CONCURRENCY | 主工作进程之外的额外工作进程数 | 0 | 1 | 2 | ... |
DEVICE | 嵌入模型使用的设备(默认:若GPU/CUDA可用则使用,否则使用CPU) | cpu | cuda | cuda:0 |
DEVICE_CLUSTERING | 聚类使用的设备(默认与DEVICE相同) | cpu | cuda | cuda:0 |
DEVICE_IDENTIFICATION | 说话人识别(若启用)使用的设备(默认与DEVICE相同) | cpu | cuda | cuda:0 |
NUM_THREADS | CPU运行任务的最大线程数 | 1 | 4 | ... |
CUDA_VISIBLE_DEVICES | 使用GPU/CUDA时的设备索引。多GPU机器建议同时设置CUDA_DEVICE_ORDER=PCI_BUS_ID | 0 | 1 | 2 | ... |
SPEAKER_SAMPLES_FOLDER | (默认:/opt/speaker_samples)目标说话人语音样本文件所在文件夹 | /path/to/folder |
SPEAKER_PRECOMPUTED_FOLDER | (默认:/opt/speaker_precomputed)存储预计算说话人嵌入向量的文件夹 | /path/to/folder |
QDRANT_HOST | Qdrant实例的主机地址 | localhost |
QDRANT_PORT | Qdrant实例的端口号 | 6333 |
QDRANT_COLLECTION | Qdrant中存储嵌入向量的集合名称 | speaker_embeddings |
QDRANT_RECREATE_COLLECTION | 是否重建集合,或使用挂载卷中的现有集合 | true |
2- 运行容器
以下命令启动容器,提供绑定到主机<HOST_SERVING_PORT>端口(如8080)的HTTP API:
bashdocker run --rm \ -v <SHARED_FOLDER>:/opt/audio \ -p <HOST_SERVING_PORT>:80 \ --env-file .env \ linto-diarization-simple:latest
若需启用说话人识别,需提供目标说话人的语音样本:样本可放在以说话人名称命名的独立文件夹中,或命名为说话人名称的独立文件中。然后将样本的父文件夹作为卷挂载到容器的/opt/speaker_samples(或通过SPEAKER_SAMPLES_FOLDER环境变量自定义的文件夹):
bashdocker run ... -v </path/to/speaker/samples/folder>:/opt/speaker_samples
启用说话人识别时,若要使用挂载到Qdrant容器卷中的现有集合,可设置环境变量QDRANT_RECREATE_COLLECTION=false,避免每次启动容器时的初始化时间。
如需启用GPU功能,可添加--gpus all参数;若有多块GPU,可设置CUDA_VISIBLE_DEVICES指定使用的GPU索引。
LinTO-diarization可作为微服务使用Celery部署。这种方式下,容器启动Celery工作进程,等待消息代理上的分离任务。
需在SERVICES_BROKER地址运行消息代理。
1- 配置.env文件
https://github.com/linto-ai/linto-diarization/blob/master/simple/.envdefault%E6%8F%90%E4%BE%9B%E4%BA%86.env%E6%96%87%E4%BB%B6%E7%A4%BA%E4%BE%8B%E3%80%82
环境变量参数: 参数与HTTP API相同,新增以下参数:
| 变量名 | 描述 | 示例 |
|---|---|---|
SERVING_MODE | (必填)指定启动模式 | task |
SERVICES_BROKER | 消息代理URI | redis://my_redis_broker:6379 |
BROKER_PASS | 消息代理密码(无密码则留空) | my_password |
QUEUE_NAME | 覆盖生成的队列名称(见下文队列名称) | my_queue |
SERVICE_NAME | 服务名称 | diarization-ml |
LANGUAGE | BCP-47语言代码 | en-US 或 * 或用|分隔的多种语言 |
MODEL_INFO | 模型的人类可读描述 | Multilingual diarization model |
2- 配置docker-compose.yml
#docker-compose.yml
yamlversion: '3.7' services: punctuation-service: image: linto-diarization-simple:latest volumes: - /path/to/shared/folder:/opt/audio env_file: .env deploy: replicas: 1 networks: - your-net networks: your-net: external: true
3- 使用docker compose启动
bashdocker stack deploy --resolve-image always --compose-file docker-compose.yml your_stack
队列名称:
默认服务队列名称为SERVICE_NAME。可通过QUEUE_NAME环境变量覆盖。
服务发现:
作为微服务时,实例会在服务注册中心注册自身信息以供发现。服务信息以JSON对象形式存储在Redis的db0中,键为service:{HOST_NAME}。
注册信息如下:
json{ "service_name": $SERVICE_NAME, "host_name": $HOST_NAME, "service_type": "diarization", "service_language": $LANGUAGE, "queue_name": $QUEUE_NAME, "version": "1.2.0", # 此仓库版本 "info": $MODEL_INFO, "last_alive": 65478213, "concurrency": 1 }
/healthcheck
返回API状态
方法:GET
健康检查通过时返回"1"。
/diarization
说话人分离API。
输入参数:
file:WAV音频文件speaker_count:(整数,可选)说话人数。若为空,分离服务将自动聚类。max_speaker:(整数,可选)说话人数未知时的最大说话人数。speaker_names:(字符串,可选)目标说话人名称列表,用于说话人识别(仅提供说话人样本时可用)。可能值:
响应(application/json)为以下结构的JSON对象:
json{ "speakers": [ {"spk_id": "spk5", "duration": 2.2, "nbr_seg": 1}, ... ], "segments": [ {"seg_id": 1, "spk_id": "spk5", "seg_begin": 0.0, "seg_end": 2.2}, ... ] }
/docs
/docs路由提供OpenAPI/swagger接口文档。
分离工作进程接受包含以下参数的请求:
file:(字符串)共享文件夹中的文件相对路径。speaker_count:(整数,默认None)固定说话人数。max_speaker:(整数,默认None)说话人数未知时的最大说话人数。speaker_names:(字符串,默认None)目标说话人名称列表,用于说话人识别(仅提供说话人样本时可用)。可能值:
返回格式
成功分离后返回以下结构的JSON对象:
json{ "speakers": [ {"spk_id": "spk5", "duration": 2.0, "nbr_seg": 1}, ... ], "segments": [ {"seg_id": 1, "spk_id": "spk5", "seg_begin": 0.0, "seg_end": 2.0}, ... ] }
speakers字段包含说话人数组,每个说话人有总时长和段数。segments字段包含每个音频段,包含段ID、说话人ID、开始时间和结束时间。可使用以下curl命令测试HTTP API:
bashcurl -X POST "http://YOUR_SERVICE:PORT/diarization" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@YOUR_FILE.wav;type=audio/x-wav" -F "speaker_count=NUMBER_OF_SPEAKERS"
本项目基于AGPLv3许可证开发(见LICENSE)。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务