V2VRT 是一个本地化的实时语音到语音翻译系统管线,包含 ASR(语音识别)、NLP/翻译 和 TTS(文本到语音)模块。系统支持前端或后端任意一端完成 ASR 或 NLP,并保证:在“最后一次通信”中,响应必定包含 asr_result 与 nlp_result(无论这些结果来自前端透传还是后端生成)。
在 /api/v1/execute 的成功响应(status: "ok")的 results 字段中至少包含:
- text: 最终用于合成或展示的文本(翻译后或透传)
- audio_base64: 若触发后端 TTS,则返回 base64 编码的音频(wav)
- asr_result: 一定存在的 ASR 结果对象
- text, lang, segments(可选), provider ("backend" 或 "frontend")
- nlp_result: 一定存在的 NLP/翻译 结果对象
- text, source_lang, target_lang(可选), provider ("backend"、"frontend" 或 "passthrough")
- meta: 包含 mode、耗时统计等元信息
- 无论 ASR/NLP 在前端或后端执行,NetworkCoordinator 会在最终响应中返回 asr_result 与 nlp_result,保证前端能在最后一次通信中获取完整信息。
- 错误响应会返回 transaction_id(如有),便于前端定位事务。
系统支持 7 种典型职责切分模式(0-6),例如:
- 后端全流程:后端负责 ASR → 翻译 → TTS
- 前端 ASR / 后端 翻译+TTS:前端发送 asr_text,后端完成翻译与合成
- 前端文本输入:前端直接发送文本,后端可执行翻译或仅执行 TTS
-
POST /api/v1/negotiate
- 请求:{ "mode": <0-6> }
- 响应:{ "status": "ok", "transaction_id": "...", "next_action": "send_audio"|"send_text", "execute_endpoint": "/api/v1/execute" }
-
POST /api/v1/execute
- 请求:{ "transaction_id": "...", "payload": { ... } }
- payload 中可包含:
- audio_base64(当 next_action 为 send_audio)
- text(当 next_action 为 send_text)
- source_lang / target_lang
- asr_text / asr_lang / asr_segments(前端已完成 ASR 时)
- nlp_text / nlp_source_lang / nlp_target_lang(前端已完成翻译时)
- 响应:参见“主要产出”部分,最终响应包含 asr_result 与 nlp_result。
- 语言与框架
- Python 3.8+
- Flask — 提供 HTTP API(app.py)
- ASR
- faster-whisper(WhisperModel)
- numpy, soundfile, scipy(重采样)
- 翻译(NLP)
- CTranslate2(ctranslate2) + transformers 的 M2M100Tokenizer(本地 tokenizer)
- TTS
- Piper(本地可执行或二进制),输出 wav
- soundfile(读取/验证 wav)
- 日志与工具
- logging,base64,uuid,subprocess 等标准库
- app.py — Flask 启动与路由
- network_handler.py — 协调器,保证最终响应包含 asr_result 与 nlp_result
- asr.py — ASR 引擎封装(faster-whisper)
- trnsltr.py — 翻译封装(CTranslate2 + 本地 tokenizer)
- tts.py — TTS 封装(piper)
- API_DOCUMENT.md — 对外接口说明(已同步保证语义)
-
模型准备
- ASR: faster-whisper 使用模型名或本地路径(例如 "small")
- 翻译: 将 CTranslate2 转换后的 m2m100 模型放置于 models/nlp/,同时将 tokenizer 的 vocab.json 和 sentencepiece.bpe.model 放入同一目录
- TTS: 将 piper 的 onnx 模型放在 models/tts/ 下(文件名建议包含语言前缀,如 en_US.onnx)
-
安装依赖(示例)
- pip install flask faster-whisper ctranslate2 transformers soundfile scipy numpy
-
配置
- 如需修改模型路径或 piper 可执行路径,请在 app.py / tts.py 中相应调整。
-
启动服务
- python app.py
- 默认监听 0.0.0.0:8000
{
"transaction_id": "uuid",
"status": "ok",
"results": {
"text": "Bonjour, comment allez-vous?",
"audio_base64": "...",
"asr_result": {
"text": "Hello, how are you?",
"lang": "en",
"segments": [],
"provider": "frontend"
},
"nlp_result": {
"text": "Bonjour, comment allez-vous?",
"source_lang": "en",
"target_lang": "fr",
"provider": "backend"
},
"meta": { "mode": 1, "timing_ms": { "asr": 12.3, "translator": 45.6, "tts": 30.1, "total": 88.0 } }
}
}- 针对各模块(ASR、Translator、TTS)编写单元与集成测试并使用 mock。
- 端到端测试:使用已知语音样本验证转写、翻译与合成流程。
- 记录 timing_ms 用于性能调优。
欢迎提交 PR:
- 替换或新增 ASR/TTS 实现(请保持 NetworkCoordinator 返回结构不变)
- 增加流式支持或消息队列(注意最终响应仍需包含 asr_result 与 nlp_result)
请在仓库根目录添加 LICENSE 与作者信息。