Skip to content

Willian-Marshell/rdkx5-simultaneous-interpret

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sim_Interpret_System

RDK X5 边端同声传译系统 — 消费级、低延迟、多语种、Web 分发。

中文说明 · License: MIT

一台板卡(或一台 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 抗字幕跳变)

端到端延迟(Windows PC, i7-13700, CPU-only,warmup 后)

阶段 典型延迟
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

快速开始

1) 环境(新装一个 conda 环境,不污染其他项目)

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/simple

Windows 上 pyopenjtalk 原版需要从源码编译;pyopenjtalk-plus 是 API 兼容的社区 fork,带预编译 wheel,直接用。

2) 下载模型

# 国内推荐用镜像
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.

3) 三种玩法

(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 × TTS)

语种 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

关键设计选择(避坑记)

  1. TTS 走 auto,Kokoro 只处理它训练过的 8 种语言,其余语种直接走 edge-tts。
  2. 中日 TTS 用 misaki 生成 IPA 音素、kokoro.create(is_phonemes=True),绕开 kokoro-onnx 内置 espeak-ng 对中日的粗糙处理(否则听感"一字一顿的烫嘴")。
  3. per_segment 才是真同传accumulate 每次全句重译,字幕稳定但会累加延迟。
  4. TTS 单例_kokoro_singleton)+ 模型 warmup 只做一次:REST /api/start 只切音频源、不重建 pipeline,避免每次 5-30 s 冷启动。
  5. stable-prefix 只前进不回滚:即使 MT 输出抖动,已提交给 TTS 的部分保留(避免播出去后又收回来)。
  6. MT worker 后台线程:VAD 主线程不阻塞,防止麦克风 input overflow。
  7. 手机端 AudioWorklet + 线性重采样:44.1/48 kHz → 16 kHz,40 ms/片 WS 上传,兼容 iOS Safari。
  8. HTTPS 自签.certs/ 自动生成,SAN 里含所有本机 IPv4):手机 Safari 需要 HTTPS 才允许 getUserMedia

硬件(v1 目标平台)

型号 用途
主控 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 — 随便用、随便改、随便商用,注明版权就行。

致谢

About

RDK X5 边端同声传译系统 — SenseVoice + NLLB-200 + Kokoro TTS,Web 分发

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors