本仓库已新增一个可 Docker 部署的转录 API 服务,接口兼容 OpenAI Whisper 的 POST /v1/audio/transcriptions。
运行环境:需要 NVIDIA GPU + CUDA,Docker 部署仅支持 CUDA(NVIDIA Container Toolkit 必须可用)。
- Whisper API 兼容:支持
multipart/form-data上传音频文件(字段file),并要求model字段存在(但本服务不依赖该字段)。 - 可自定义 API Key:通过环境变量
API_KEY设置,使用Authorization: Bearer <API_KEY>访问。 - 懒加载模型:首次请求才加载模型权重。
- 空闲超时自动释放显存:超过
IDLE_UNLOAD_SECONDS未调用会自动卸载模型并尝试释放 CUDA 显存。 - 字幕输出:支持
response_format=json/text/srt/vtt/verbose_json输出,verbose_json结构与 OpenAI Whisper 对齐(segments 为粗时间戳)。- 说明:当前字幕时间戳为“按 chunk 的粗时间戳”(默认 30 秒一段),不提供逐词对齐。
- 语言参数(纯语言码):
language仅支持纯语言码(小写 2-3 位字母,如zh/en/yue)。- 不传
language:不提示语言,让模型自行推断。 - 不支持:国家码(如
CN/US)或 locale(如zh-CN)。
- 不传
- 构建并启动:
export API_KEY=your_key
docker compose up -d --build- 健康检查:
curl -fsS http://127.0.0.1:9092/health- 发起转录请求(JSON):
curl -X POST http://127.0.0.1:9092/v1/audio/transcriptions \
-H "Authorization: Bearer ${API_KEY}" \
-F "file=@test/OSR_us_000_0059_8k.wav" \
-F "model=glmasr" \
-F "language=en" \
-F "response_format=json"
说明:当你传入 `language` 时,JSON 响应会回显该字段(例如 `{"text":"...","language":"en"}`)。- 输出字幕(SRT / VTT / verbose_json):
curl -X POST http://127.0.0.1:9092/v1/audio/transcriptions \
-H "Authorization: Bearer ${API_KEY}" \
-F "file=@test/OSR_us_000_0059_8k.wav" \
-F "model=glmasr" \
-F "response_format=srt" > out.srt
curl -X POST http://127.0.0.1:9092/v1/audio/transcriptions \
-H "Authorization: Bearer ${API_KEY}" \
-F "file=@test/OSR_us_000_0059_8k.wav" \
-F "model=glmasr" \
-F "response_format=verbose_json" > out.json- 翻译(与 OpenAI
/v1/audio/translations同名接口,返回格式同上):
curl -X POST http://127.0.0.1:9092/v1/audio/translations \
-H "Authorization: Bearer ${API_KEY}" \
-F "file=@test/OSR_us_000_0059_8k.wav" \
-F "model=glmasr" \
-F "response_format=json"API_KEY:不设置则不鉴权(便于本地调试)。MODEL_DIR:模型目录,默认./model(包含 config.json / model.safetensors / tokenizer.json)。DEVICE:cuda/auto(默认cuda,Docker 环境仅支持 CUDA)。DTYPE:bfloat16/float16/float32/auto(默认auto)。IDLE_UNLOAD_SECONDS:空闲多少秒后卸载模型(默认 600)。CHUNK_SECONDS:分段时长(默认 0 表示不分段,长音频可设为 30 获得粗粒度时间戳)。MAX_NEW_TOKENS:每段音频最大生成 token(默认 256)。MAX_CONCURRENCY:并发限制(默认 1,GPU 建议保持 1)。ATTN_IMPL:当flash_attention_2缺失导致加载失败时,可设置为sdpa或eager。
仓库提供了测试脚本:
chmod +x test/test_api.sh
API_KEY=your_key ./test/test_api.sh如果你当前环境无法访问 Docker daemon(例如没有 /var/run/docker.sock 权限),可以用本地虚拟环境启动服务并测试:
chmod +x tools/run_local_test.sh
./tools/run_local_test.sh- 如果你使用多 worker(例如
uvicorn --workers 2),每个 worker 会各自加载一份模型,显存会成倍占用。 - Docker 部署仅支持 CUDA:需要宿主机已正确安装 NVIDIA Container Toolkit,并确保容器可访问 GPU(可在 docker-compose 中按需启用
gpus: all)。