这是一个本地会议音频转录 API 服务,支持上传一个或多个音频文件,离线生成 txt、md、json、srt 结果,并可选使用 pyannote.audio 做说话人分离。
推荐环境:
- macOS + Apple Silicon
- Python 3.12
- Homebrew
ffmpeg- Hugging Face 账号与 read token
当前 Mac 推荐 backend:
- ASR:
mlx-whisper - Speaker diarization:
pyannote.audio
brew install ffmpeg python@3.12确认安装:
ffmpeg -version
/opt/homebrew/bin/python3.12 --version/opt/homebrew/bin/python3.12 -m venv .venv312
.venv312/bin/python -m pip install --upgrade pip setuptools wheel
.venv312/bin/python -m pip install -e '.[dev,asr,diarization]'如果只需要文字转录、不需要说话人分离,可只安装:
.venv312/bin/python -m pip install -e '.[dev,asr]'pyannote.audio 需要访问 Hugging Face gated model。先在网页接受模型条款:
pyannote/speaker-diarization-community-1
然后登录:
.venv312/bin/hf auth login
.venv312/bin/hf auth whoami不要把 token 写进 Git 仓库。
复制配置模板:
cp .env.example .env只做 ASR:
MEETING_TRANSCRIPT_ASR_BACKEND=mlx_whisper
MEETING_TRANSCRIPT_DIARIZATION_BACKEND=none
MEETING_TRANSCRIPT_ASR_MODEL=mlx-community/whisper-large-v3-turbo
MEETING_TRANSCRIPT_ASR_LANGUAGE=zh启用说话人分离:
MEETING_TRANSCRIPT_DIARIZATION_BACKEND=pyannote
MEETING_TRANSCRIPT_PYANNOTE_MODEL=pyannote/speaker-diarization-community-1
MEETING_TRANSCRIPT_MIN_SPEAKERS=2
MEETING_TRANSCRIPT_MAX_SPEAKERS=8VENV_DIR=.venv312 ./scripts/dev-start.sh默认监听:
http://127.0.0.1:8000
健康检查:
curl http://127.0.0.1:8000/health上传音频:
curl -X POST http://127.0.0.1:8000/transcriptions \
-F "files=@/path/to/meeting.m4a"查询任务:
curl http://127.0.0.1:8000/jobs/{job_id}
curl http://127.0.0.1:8000/jobs/{job_id}/files查询结果 manifest:
curl http://127.0.0.1:8000/jobs/{job_id}/result下载结果包:
curl -L http://127.0.0.1:8000/jobs/{job_id}/result.zip -o result.zip运行数据默认写入 data/:
data/uploads/ 原始上传文件
data/jobs/ 任务状态 JSON
data/results/ txt、md、json、srt 结果
这些目录是本地运行产物,不应提交。
.venv312/bin/python -m pytest -q单元测试会 mock 大模型路径,避免测试阶段下载模型或依赖 Metal GPU。
确认已完成:
- 在 Hugging Face 网页接受模型条款
.venv312/bin/hf auth login- 不要覆盖
XDG_CACHE_HOME导致 SDK 读不到默认 token
mlx-whisper 需要访问 Metal。若在受限或 headless 环境报错,请在正常 macOS 终端启动服务。
调整:
MEETING_TRANSCRIPT_MIN_SPEAKERS=5
MEETING_TRANSCRIPT_MAX_SPEAKERS=8然后重启服务并重新转录。