RDK X5 边端同声传译系统 — 消费级、低延迟、多语种、Web 分发。
一台板卡(或一台 PC),一个手机浏览器,就能做多人同声传译: 说话人对着麦讲话,其他人扫码进入 Web 页面,实时看到译文字幕 + 听到 TTS 语音。
- 🎙️ 多语识别 ASR:FunASR SenseVoice-Small(中/英/日/韩/粤等 50+ 语,非自回归,RTF 0.03-0.07)
- 🌐 200 语向翻译 MT:Meta NLLB-200-distilled-600M
- 🔊 本地/在线 TTS:Kokoro-82M(英/中/日/西/法/意/葡/印,带
misaki[zh/ja]phonemizer 修正声调)+ edge-tts 兜底(覆盖 100+ 语) - 🌐 WiFi + 浏览器分发:FastAPI + WebSocket,一对多广播,无需 Auracast 耳机;HTTPS + 自签证书解锁手机麦克风
- 📱 手机端也能当麦:
AudioWorklet采集 → 重采样 → WebSocket 上传 PCM,PC 或 X5 侧只跑翻译 - 🧪 两种流式策略:
per_segment(低延迟、每段独立)/accumulate(累积重译 + stable-prefix 抗字幕跳变)
| 阶段 | 典型延迟 |
|---|---|
| VAD 触发段结束 → 收到译文文本 | 1.0-1.5 s |
| 说完 → 听到译文语音 | ~3-4 s |
| ASR (SenseVoice) | 150-400 ms |
| MT (NLLB-600M, num_beams=1) | 300-800 ms |
| TTS (Kokoro / edge-tts) | 200-500 ms |
conda create -n sim_interp python=3.10 -y
conda activate sim_interp
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 中文/日文 TTS 走 IPA 音素路径(避免"烫嘴"腔):
pip install "misaki[zh]" fugashi unidic-lite mojimoji pyopenjtalk-plus \
-i https://pypi.tuna.tsinghua.edu.cn/simpleWindows 上
pyopenjtalk原版需要从源码编译;pyopenjtalk-plus是 API 兼容的社区 fork,带预编译 wheel,直接用。
# 国内推荐用镜像
set HF_ENDPOINT=https://hf-mirror.com # Windows CMD
# export HF_ENDPOINT=https://hf-mirror.com # Linux/macOS/git-bash
# Kokoro 权重 & 音色:
# 放到 models/kokoro/kokoro-v1.0.onnx
# models/kokoro/voices-v1.0.bin
# 下载页 https://huggingface.co/hexgrad/Kokoro-82M/tree/main
# SenseVoice、NLLB 首次运行会自动拉(分别走 ModelScope / HuggingFace)具体见 models/README.md.
(a) 命令行离线跑一段 wav
python -m src.pipeline --input samples/zh_test.wav --src zh --tgt en --output out_en.wav(b) 流式跑麦克风或 wav(终端字幕 + 本地播放)
python -m src.interpret --mic --src zh --tgt en --seconds 30
python -m src.interpret --wav samples/zh_test.wav --src zh --tgt en --realtime(c) Web 分发(推荐、支持手机端)
# HTTP:只有 PC 麦模式可用
python -m src.server --port 8000
# HTTPS:手机也能当麦、能收听
python -m src.server --port 8000 --ssl
# → 手机浏览器打开 https://<PC-IP>:8000,接受自签证书告警Web UI 里:
- 选源语 / 目标语 / 音色速度 / VAD 断句间隔
- 选择"本地麦"或"本手机录音"
- 播放译文 checkbox
- 历史 20 条字幕,可导出
| 语种 | MT (NLLB) | TTS 本地 (Kokoro) | TTS 联网 (edge-tts) |
|---|---|---|---|
| 中文 zh | ✅ | ✅ (需 misaki[zh]) |
✅ |
| 英语 en | ✅ | ✅ | ✅ |
| 日语 ja | ✅ | ✅ (需 misaki[ja] + pyopenjtalk-plus) |
✅ |
| 西班牙 es / 法 fr / 意 it / 葡 pt / 印地 hi | ✅ | ✅ | ✅ |
| 韩 ko / 德 de / 俄 ru / 阿 ar / 泰 th / 越 vi | ✅ | ❌ | ✅ (自动 fallback) |
MT 覆盖 NLLB-200 的 200 语,实际可用的下拉框里目前列了 14 种,可以在 web/index.html 加。
[PC 或 RDK X5] [手机 / 浏览器]
┌──────────────┐
│ 音频源 │ local mic (sounddevice)
│ │ OR
│ │ ← /ws/audio ← WebAudio (手机端)
└──────┬───────┘
↓
┌──────────────┐
│ Silero VAD │ ← 断句 (min_silence_ms 可调)
└──────┬───────┘
↓ Segment
┌──────────────┐
│ SenseVoice │ ASR
└──────┬───────┘
↓ text + detected_lang
┌──────────────┐
│ NLLB-200 │ MT (forced_bos_token_id = tgt lang)
└──────┬───────┘
↓ translation
┌──────────────┐ ┌───────────────┐
│ Kokoro │ TTS ───│ misaki[zh/ja] │ 可选 IPA phonemizer
│ or edge-tts │ └───────────────┘
└──────┬───────┘
↓ PCM/WAV
┌──────────────┐ broadcast_from_thread
│ Broadcaster │ ─────────→ {asr,mt,tts,break,status} 事件
└──────┬───────┘ WebSocket /ws
↓
FastAPI + WebSocket
- M1 离线通路:wav → 译文 wav
- M2 流式核心:VAD + 增量翻译 + stable-prefix(
accumulate)+ per_segment 低延迟策略 - M3 Web UI + WebSocket 分发 + 手机端录音(HTTPS)+ 多语切换
- M4 RDK X5 上跑:SenseVoice / NLLB → ONNX INT8 → BPU 加速;系统服务化;WiFi 热点自组网
- M5 (可选)Auracast 分发;音色克隆;对讲双向翻译
src/
├── audio/ # 采集、VAD (Silero)、AEC/降噪
├── asr/ # SenseVoice-Small 封装
├── mt/ # NLLB translator + stable-prefix streaming
├── tts/ # Kokoro (含 misaki 分派) + edge-tts + 单例复用
├── server/ # FastAPI + WebSocket + 自签证书 + 手机音频上传
│ ├── app.py
│ ├── broadcast.py
│ └── tls.py
├── pipeline.py # 离线一次性 pipeline
├── pipeline_streaming.py # 流式协调(worker 线程 + backpressure)
└── interpret.py # CLI 入口
web/ # 单页前端(原生 JS + AudioWorklet + WebSocket)
models/ # 权重(不入库,见 models/README.md)
scripts/ # export_models.py, mic_diagnose.py 等
tests/ # pytest 单元测试
docs/ # architecture.md, bpu-porting-notes.md
- TTS 走
auto,Kokoro 只处理它训练过的 8 种语言,其余语种直接走 edge-tts。 - 中日 TTS 用
misaki生成 IPA 音素、kokoro.create(is_phonemes=True),绕开 kokoro-onnx 内置 espeak-ng 对中日的粗糙处理(否则听感"一字一顿的烫嘴")。 per_segment才是真同传,accumulate每次全句重译,字幕稳定但会累加延迟。- TTS 单例(
_kokoro_singleton)+ 模型 warmup 只做一次:REST/api/start只切音频源、不重建 pipeline,避免每次 5-30 s 冷启动。 - stable-prefix 只前进不回滚:即使 MT 输出抖动,已提交给 TTS 的部分保留(避免播出去后又收回来)。
- MT worker 后台线程:VAD 主线程不阻塞,防止麦克风 input overflow。
- 手机端
AudioWorklet+ 线性重采样:44.1/48 kHz → 16 kHz,40 ms/片 WS 上传,兼容 iOS Safari。 - HTTPS 自签(
.certs/自动生成,SAN 里含所有本机 IPv4):手机 Safari 需要 HTTPS 才允许getUserMedia。
| 项 | 型号 | 用途 |
|---|---|---|
| 主控 | RDK X5(10 TOPS BPU + 8 GB LPDDR4,8 核 A55) | 全流水线 |
| 麦克风 | ReSpeaker 4-Mic Linear Array(USB) | 拾音 + 硬件 AEC |
| 网络 | 板载 Wi-Fi 6 | 手机热点分发 |
| 显示(可选) | HDMI 屏 或 无 | 主字幕 |
PC 上开发调通了整套栈,M4 正在把它搬到 RDK X5。
MIT — 随便用、随便改、随便商用,注明版权就行。
- FunASR / SenseVoice
- Meta AI / NLLB-200
- hexgrad / Kokoro-82M & misaki
- Silero / VAD
- Horizon Robotics / RDK X5