lintoai/linto-diarization-simpleLinTO-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 [***] 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文件
simple/.envdefault提供了.env文件示例。
环境变量参数:
| 变量名 | 描述 | 示例 |
|---|---|---|
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文件
simple/.envdefault提供了.env文件示例。
环境变量参数: 参数与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 }
返回API状态
方法:GET
健康检查通过时返回"1"。
说话人分离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路由提供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 "[***]" -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)。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务