
  --> Wav2Vec2 (对齐) --> Pyannote (说话人ID) --> 输出
该服务支持两种服务模式:
@serve.batch)。可从1个GPU扩展到多GPU。提供两种管道策略:
GPU内存要求因模型大小而异:
| Whisper模型 | 需要的VRAM(带分离功能) | 推荐GPU |
|---|---|---|
| tiny, base | ~4-5GB | RTX 3060 8GB, RTX 2060, GTX 1660 Ti |
| small | ~6GB | RTX 3060, RTX 2070, RTX 2080 |
| medium | ~10GB | RTX 3080, RTX 3060 12GB, RTX 2080 Ti |
| large-v2, large-v3 | ~14GB | RTX 3090, RTX 4090, A6000, A100 |
注:在RTX 3090上使用预加载模型+对齐+pyannote community-1分离测量
最低配置(小型/中型模型):
推荐配置(带分离功能的large-v3):
使用预构建的Docker镜像,通过3个步骤即可启动并运行:
说话人分离需要Hugging Face令牌和模型访问权限:
a) 创建Hugging Face账户:
b) 接受模型用户协议(全部必需):
您需要接受所有三个模型的协议:
c) 生成访问令牌:
hf_...开头)⚠️ 重要提示: 如果不接受所有模型协议,将收到"403 Access Denied"错误。
创建包含Hugging Face令牌的.env文件:
bash# 创建.env文件 cat > .env << 'EOF' HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx DEVICE=cuda COMPUTE_TYPE=float16 BATCH_SIZE=16 PRELOAD_MODEL=large-v3 MAX_FILE_SIZE_MB=1000 # 服务模式:simple(默认)或ray(带批处理的Ray Serve) SERVE_MODE=simple EOF
将hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx替换为您的实际令牌。
下载docker-compose.yml文件并启动服务:
bash# 下载docker-compose.yml curl -O https://raw.githubusercontent.com/murtaza-nasir/whisperx-asr-service/main/docker-compose.yml # 启动服务(自动拉取预构建镜像) docker compose up -d # 查看日志 docker compose logs -f
或使用Docker命令运行:
bashdocker run -d \ --name whisperx-asr-api \ --gpus all \ -p 9000:9000 \ -e DEVICE=cuda \ -e COMPUTE_TYPE=float16 \ -e BATCH_SIZE=16 \ -e HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ -e PRELOAD_MODEL=large-v3 \ -v whisperx-cache:/.cache \ --restart unless-stopped \ learnedmachine/whisperx-asr-service:latest
服务将在http://localhost:9000可用
bash# 健康检查 curl http://localhost:9000/health # 测试转录 curl -X POST http://localhost:9000/asr \ -F "audio_file=@your_audio.mp3" \ -F "language=en"
用于开发或如果您想从源代码构建:
bashgit clone https://github.com/murtaza-nasir/whisperx-asr-service.git cd whisperx-asr-service
bash# 复制示例环境文件 cp .env.example .env # 编辑.env并添加您的Hugging Face令牌 nano .env
使用docker-compose.dev.yml(带实时代码挂载):
bash# 构建并启动 docker compose -f docker-compose.dev.yml up -d --build # 查看日志 docker compose -f docker-compose.dev.yml logs -f
或手动构建:
bash# 构建镜像 docker build -t whisperx-asr-service . # 运行容器 docker run -d \ --name whisperx-asr-api \ --gpus all \ -p 9000:9000 \ --env-file .env \ -v whisperx-cache:/.cache \ whisperx-asr-service
注意: docker-compose.dev.yml文件挂载./app目录,以便无需重建即可进行实时代码更改。
运行后,访问http://localhost:9000/docs获取交互式API文档。
参数:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
audio_file | 文件 | 必需 | 要转录的音频文件 |
task | 字符串 | transcribe | 任务类型:transcribe(转录)或translate(翻译) |
language | 字符串 | 自动检测 | 语言代码(例如en、es、fr) |
model | 字符串 | large-v3 | Whisper模型:tiny、base、small、medium、large-v2、large-v3 |
initial_prompt | 字符串 | 无 | 用于引导模型的上下文或拼写指南 |
hotwords | 字符串 | 无 | 用于偏向转录的逗号分隔词 |
output_format | 字符串 | json | 输出格式:json、text、srt、vtt、tsv |
word_timestamps | 布尔值 | true | 返回单词级时间戳 |
diarize | 布尔值 | true | 启用说话人分离 |
num_speakers | 整数 | 自动 | 确切的说话人数(如果已知,覆盖最小/最大值) |
min_speakers | 整数 | 自动 | 最小说话人数 |
max_speakers | 整数 | 自动 | 最大说话人数 |
示例请求(JSON输出):
bashcurl -X POST http://localhost:9000/asr \ -F "audio_file=@meeting.mp3" \ -F "language=en" \ -F "model=large-v3" \ -F "output_format=json" \ -F "diarize=true" \ -F "min_speakers=2" \ -F "max_speakers=5"
示例请求(SRT字幕):
bashcurl -X POST http://localhost:9000/asr \ -F "audio_file=@video.mp4" \ -F "language=en" \ -F "output_format=srt" \ -F "diarize=false"
示例响应(JSON):
json{ "text": [ { "start": 0.5, "end": 2.3, "text": " 你好,欢迎参加会议。", "speaker": "SPEAKER_00", "words": [ {"word": "你好", "start": 0.5, "end": 0.8, "score": 0.95}, {"word": "欢迎", "start": 0.9, "end": 1.2, "score": 0.93} ] } ], "language": "en", "segments": [...], "word_segments": [...] }
确切说话人数
当您知道确切的说话人数时,使用num_speakers可以获得更准确的分离结果:
bashcurl -X POST http://localhost:9000/asr \ -F "audio_file=@interview.mp3" \ -F "num_speakers=2" \ -F "diarize=true"
这会覆盖min_speakers和max_speakers,并且通常比基于范围的检测提供更好的准确性。
独占说话人分离
当pyannote community-1模型可用时,此服务自动使用独占说话人分离。此功能简化了细粒度说话人分离时间戳和转录时间戳之间的协调,非常适合像https://github.com/murtaza-nasir/speakr%E8%BF%99%E6%A0%B7%E9%9C%80%E8%A6%81%E5%B0%86%E8%BD%AC%E5%BD%95%E4%B8%8E%E8%AF%B4%E8%AF%9D%E4%BA%BA%E7%89%87%E6%AE%B5%E5%AF%B9%E9%BD%90%E7%9A%84%E5%BA%94%E7%94%A8%E3%80%82
优点:
Whisper经常拼错品牌名称、首字母缩写词和特定领域术语。您可以使用hotwords和initial_prompt提高准确性:
hotwords在解码过程中偏向模型的束搜索以支持特定单词initial_prompt提供上下文句子,引导模型预期某些拼写示例: 转录包含"我们使用CTranslate2在Kubernetes集群上部署了Speakr进行推理。PyAnnote处理分离。"的音频
bash# 基准(无提示) curl -X POST "http://localhost:9000/asr?language=en" \ -F "audio_file=@meeting.mp3" # 结果:"我们部署了Speaker...使用ctranslate2...PnNote处理分离。" # 使用热词 curl -X POST "http://localhost:9000/asr?language=en&hotwords=Speakr,CTranslate2,PyAnnote" \ -F "audio_file=@meeting.mp3" # 结果:"我们部署了Speaker...使用CTranslate2...PyAnnote处理分离。" # 使用热词+初始提示(最佳结果) curl -X POST "http://localhost:9000/asr?language=en&hotwords=Speakr,CTranslate2,PyAnnote&initial_prompt=Speakr是一个转录应用。" \ -F "audio_file=@meeting.mp3" # 结果:"我们部署了Speakr...使用CTranslate2...PyAnnote处理分离。"
| 单词 | 无提示 | 仅热词 | 热词+初始提示 |
|---|---|---|---|
| CTranslate2 | ctranslate2 | CTranslate2 | CTranslate2 |
| PyAnnote | PnNote | PyAnnote | PyAnnote |
| Speakr | Speaker | Speaker | Speakr |
单独使用hotwords可以修复大多数拼写问题。与常见英语单词发音相同的单词(如"Speakr"与"Speaker")可能还需要initial_prompt来提供足够的上下文,使模型覆盖其默认值。
OpenAI兼容端点(/v1/audio/transcriptions)也支持hotwords表单字段。如果只提供prompt,它将用作热词。
包含一个测试脚本,用于验证您自己音频的热词:
bash./tests/test_hotwords.sh testfiles/your_audio.flac # 自定义热词 HOTWORDS="MyBrand,TechTerm" INITIAL_PROMPT="MyBrand是一个产品。" \ ./tests/test_hotwords.sh testfiles/your_audio.flac
要将此服务与https://github.com/murtaza-nasir/speakr%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E9%BB%98%E8%AE%A4%E7%9A%84ASR%E7%AB%AF%E7%82%B9%EF%BC%9A
更新Speakr的.env文件:
bash# 启用ASR端点 USE_ASR_ENDPOINT=true # 指向WhisperX服务 ASR_BASE_URL=http://whisperx-asr-api:9000
如果Speakr和WhisperX在同一个Docker Compose堆栈中,使用容器名称。否则,使用http://localhost:9000。
bash#

探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务