lintoai/linto-diarization-pyannoteLinTO-diarization 是 LinTO 平台的说话人分轨服务,具备猜测说话人数以及在提供目标说话人语音样本时识别特定说话人的能力。该服务可作为独立分轨服务部署,也可作为微服务集成到分布式系统中。
/opt/audio)存储音频文件,避免大文件通过消息代理传输若启用说话人识别功能,需部署 Qdrant 向量数据库存储说话人嵌入向量:
bashdocker run \ -p 6333:6333 \ # Qdrant 默认端口 -v ./qdrant_storage:/qdrant/storage:z \ qdrant/qdrant
bashgit clone [***] cd linto-diarization docker build . -t linto-diarization-pyannote:latest -f pyannote/Dockerfile
bashdocker pull lintoai/linto-diarization-pyannote
通过 HTTP API 提供独立分轨服务。
参考 pyannote/.envdefault 创建 .env 文件,配置参数见 6. 配置参数说明。
bashdocker run --rm \ -v <宿主机共享文件夹路径>:/opt/audio \ # 挂载共享音频文件夹 -p <宿主机端口>:80 \ # 映射容器 80 端口到宿主机(如 8080:80) --env-file .env \ # 加载环境变量 # 启用 GPU(如有) --gpus all \ # 可选,启用所有 GPU linto-diarization-pyannote:latest
需挂载说话人语音样本文件夹(样本需按说话人名称命名文件/文件夹):
bashdocker run ... -v </path/to/speaker/samples>:/opt/speaker_samples # 或自定义路径(通过 SPEAKER_SAMPLES_FOLDER 指定)
若需复用 Qdrant 现有向量集合,设置环境变量 QDRANT_RECREATE_COLLECTION=false。
作为微服务部署,通过 Celery 监听消息代理中的分轨任务。
SERVICES_BROKER 配置基础参数同 HTTP 模式,额外添加微服务特有参数(见 6. 配置参数说明)。
创建 docker-compose.yml:
yamlversion: '3.7' services: diarization-service: image: linto-diarization-pyannote:latest volumes: - /path/to/shared/folder:/opt/audio # 共享音频文件夹 env_file: .env # 加载环境变量 deploy: replicas: 1 # 根据需求调整副本数 networks: - your-net # 连接至微服务网络 networks: your-net: external: true # 使用现有网络
启动服务:
bashdocker stack deploy --resolve-image always --compose-file docker-compose.yml your_stack
| 变量名 | 描述 | 示例值 |
|---|---|---|
SERVING_MODE | 部署模式(必填):http(独立服务)或 task(微服务) | http 或 task |
CONCURRENCY | 主工作进程外的额外工作进程数 | 0 | 1 | 2 |
DEVICE | 嵌入模型运行设备(默认:优先 GPU,否则 CPU) | cpu | cuda | cuda:0 |
DEVICE_CLUSTERING | 聚类模型运行设备(默认同 DEVICE) | cpu | cuda |
DEVICE_IDENTIFICATION | 说话人识别模型运行设备(默认同 DEVICE) | cpu | cuda |
NUM_THREADS | CPU 最大线程数 | 4 |
CUDA_VISIBLE_DEVICES | GPU 设备索引(多 GPU 时指定,需配合 --gpus 参数) | 0 | 1,2 |
SPEAKER_SAMPLES_FOLDER | 说话人语音样本文件夹路径(默认:/opt/speaker_samples) | /path/to/samples |
SPEAKER_PRECOMPUTED_FOLDER | 预计算嵌入向量存储路径(默认:/opt/speaker_precomputed) | /path/to/precomputed |
QDRANT_HOST | Qdrant 服务地址(说话人识别时必填) | localhost |
QDRANT_PORT | Qdrant 服务端口(默认 6333) | 6333 |
QDRANT_COLLECTION | Qdrant 向量集合名称(默认 speaker_embeddings) | my_collection |
QDRANT_RECREATE_COLLECTION | 是否重建 Qdrant 集合(默认 true,复用集合时设为 false) | true | false |
| 变量名 | 描述 | 示例值 |
|---|---|---|
SERVICES_BROKER | 消息代理地址(如 Redis) | redis://my_redis_broker:6379 |
BROKER_PASS | 消息代理密码(可选) | my_password |
QUEUE_NAME | 任务队列名称(默认自动生成) | diarization_queue |
SERVICE_NAME | 服务名称 | diarization-ml |
LANGUAGE | BCP-47 语言代码 | en-US | *(多语言) |
MODEL_INFO | 模型描述信息 | Multilingual diarization model |
/healthcheck"1"(服务正常)/diarization方法:POST
请求参数:
file:WAV 音频文件(必填)speaker_count:固定说话人数(可选,整数,自动聚类时留空)max_speaker:最大说话人数(可选,整数,当 speaker_count 未指定时生效)speaker_names:目标说话人名称(可选,仅在提供语音样本时生效):
"":禁用识别"*":识别所有说话人| 分隔字符串:指定说话人列表(如 ["spk1","spk2"] 或 "spk1|spk2")响应示例(application/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通过消息代理(如 Redis)提交分轨任务,参数同 HTTP API,区别在于 file 为共享文件夹中的相对路径。
file:共享文件夹中音频文件的相对路径(字符串,必填)speaker_count、max_speaker、speaker_names:同 HTTP API(可选)同 /diarization 接口响应(JSON 结构)。
bashcurl -X POST "http://<服务地址>:<端口>/diarization" \ -H "accept: application/json" \ -H "Content-Type: multipart/form-data" \ -F "file=@test.wav;type=audio/x-wav" \ -F "speaker_count=2"
本项目基于 AGPLv3 许可证开源(详见 LICENSE)。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务