每日文摘
深挖 · sokuji:开源实时语音同传,工程答案比算法更值得抄
sokuji(日语「即時」)是一个开源的实时双向语音同传应用:两个人各说一种语言,它边听边译边合成对方的语言,还能伪装成虚拟麦克风直接接入 Zoom/Meet/Teams。它最近连日发版、热度攀升,但真正值得深挖的原因是:它没有用什么惊人的同传算法,却把延迟、分段、回声、显存这几类工程问题解得非常系统——对想自己做一个同传功能的人来说,这恰好是最值得抄的部分。
是什么
先回答最直接的问题:是的,sokuji 的重点就是同声传译。官方定位是「Real-time two-way speech translation for bilingual meetings」——双语会议实时双向语音翻译。它不是转写工具,也不是翻译 API 库,而是一个完整的端到端同传产品:
- 产品形态:Electron 桌面应用(Windows/macOS/Linux)+ Chrome/Edge 浏览器扩展,AGPL-3.0 开源,当前 1.2k stars、3174 commits,2026 年 8 月底到 9 月初连日发版(仓库主页)
- 核心场景:「两人两语言一对话」——同时采集麦克风和系统音频,自动检测当前说的是语言 A 还是 B,翻成另一种,经虚拟麦克风注入会议软件,还能出可分享的实时字幕(README)
- 双轨供给:云端 9 个 provider(OpenAI、Gemini、Soniox 等,自备 API key),或完全离线的本地推理——无 API key、无网络、隐私不出本机(README)
- 模型池惊人地大:ASR 44 个模型(Whisper、Voxtral、SenseVoice 等,99+ 语言)、翻译 75 个(69 个 Opus-MT 语言对 + Qwen 系/Hunyuan-MT/TranslateGemma)、TTS 137 个(Piper、Matcha、Supertonic 等)(仓库主页)
核心机制:它做同传的要点在哪
朴素做法是「录一段 → 整句 Whisper → 整句翻译 → 整段 TTS」,延迟以句为单位,而且句首经常被吃掉。sokuji 的源码(sidecar/sokuji_sidecar/)展示了一套很有参考价值的解法,六个要点:
① VAD 分段权在客户端,与 ASR 解耦。 silero VAD 跑在客户端 worker 里,由它决定语音从哪开始、到哪结束,向 ASR 引擎只发 start/end/cancel 三种边缘事件;ASR 引擎本身不做服务端 VAD(asr_engine.py)。切分逻辑单点 owned,上下游职责干净。
② 0.7 秒预滚,补 VAD 迟确认。 silero 在真实语音起始后 300-600ms 才会确认「有人开始说话了」——如果直接从 VAD 触发那一刻开始喂音频,句首就没了。sokuji 的流式 ASR 在门控模式下每次开始说话都先重放 0.7s 预滚音频,源码注释里明说了这个原因(asr_engine.py)。这是自己动手做同传几乎必踩的第一个坑。
③ 流式 ASR 双模式 + 运行时降级自愈。 always_stream 模式维持一条长流持续喂音频(端点归客户端管,靠「Pause-cut」结束流来 flush 滞留尾部再重开);per_utterance 门控模式只在检测到说话时才喂音。更有意思的是自适应:队列滞后超过 3 秒就自动从长流降到门控模式,说完一段后如果实时率小于 1(处理比说话快)再升回去(asr_engine.py)。机器扛不住时优雅变慢,而不是崩掉。
④ 全链路 partial 流水线——但翻译本身是整句全量调用。 ASR 持续吐 partial 增量 → 翻译引擎发 translate_partial → TTS 按 chunk 流式合成播放;采集端 20ms 一片,播放端累积到 100ms 才开播防抖(audio-flow-analysis.md)。但注意:翻译阶段没有任何增量重译算法——每次翻译都是独立的全量整句调用,靠模型常驻显存换吞吐(translate_engine.py)。它的取舍是「用分段粒度控制延迟」,而不是上复杂的增量翻译算法。
⑤ 双向同传特有的回声组合拳。 译出来的声音会被自己的麦克风再次采到(「自己听到自己的翻译」),这是双向场景的硬问题。sokuji 的解法是一套组合:Chrome 系统级 AEC(echoCancellationType: 'system')+ suppressLocalAudioPlayback + 一个 gain=0 的 dummyGain 把回环静音 + passthrough 通道刻意加延迟辅助消除(audio-flow-analysis.md)。
⑥ 跨三引擎的显存预算(VRAM ledger)。 ASR、翻译、TTS 三个模型同时驻留一张卡,翻译引擎初始化前会通过 ledger 把 ASR/TTS 模型的尺寸计入预算、必要时释放旧模型,配合 catalog(模型目录卡)/planner(纯排序)/loader(有副作用)三层分离做模型选择与硬件回退(translate_engine.py、CONTEXT.md)。
架构层面还有一个值得注意的决策:本地推理有两条对等且刻意不合并的路线——浏览器路线用 sherpa-onnx WASM + Transformers.js/WebGPU(15 个 worker);桌面路线用 Python sidecar 加载在同一份 ggml 0.22 之上构建的三个 C++ 引擎(transcribe.cpp/llama.cpp/audio.cpp),统一 sk_* C ABI,Linux/Windows 走 Vulkan、mac 走 Metal,无 CUDA 依赖(CLAUDE.md、CONTEXT.md)。文档明令「不要在两者之间引入统一层」——浏览器和原生的约束差异太大,强行抽象只会两头受限。
一句话总结它的特别之处:核心竞争力不在任何单点算法(翻译阶段反而是最朴素的做法),而在分段、延迟、回声、显存四类工程问题的系统性解法。
怎么跑起来
- 安装三路径:①Releases 下安装包(v0.39.3,macOS pkg 约 126MB,也有 Windows exe 和 Linux deb/AppImage)②Chrome/Edge 商店装扩展 ③源码构建:
npm install && npm run electron:dev;本地原生推理再跑npm run sidecar:setup(需 Python 3.11/3.12,默认预取模型超过 1.5GB,--no-models可跳过)(Releases、setup.sh) - 注意形态:它是桌面应用+扩展,没有 Docker/服务端形态——云端模式也是直连各 provider API、无中间服务器。想「自托管一个同传 API 服务」的人要调整预期,它给不了 whisper.cpp server 那样的接口(README)
- 硬件口径有微妙差异:README 主打轻量(「CPU 和集显就能跑」),但 v0.39.0 设置向导的口径是「GB 级模型、强烈建议有 GPU」——两个说法并存,如实呈现(README、Releases)
- GPU 走 Vulkan 不走 CUDA:ggml 家族加速,官方实测设备是 RTX 4070 SUPER、NVIDIA GB10、Apple M4(native/README)。对 3090 这类 24GB 卡:默认本地模型都很小(ASR 用 sense-voice 或 voxtral-mini-4b-realtime,翻译用 qwen2.5-0.5b,TTS 用 moss-tts-nano),显存大幅富余,跑 Linux/Windows 的 Vulkan SKU 即在支持矩阵内,还有很大上调模型档位的空间
- 成本:本地推理零成本、可完全离线;云端 BYOK;Kizuna AI 托管模式(key 由后端管理)定价未公开
数据说话
- 官方没有给出任何端到端延迟数字——README 和 docs 都没有 latency 章节,只有「Real-time」的定性表述。仓库内唯一的真实基准是 ASR 组件的:Qwen3-ASR 0.6B 在 WebGPU 上 median RTF 0.075-0.095(转写速度约为音频时长的 13 倍)、mean CER 0.084-0.126(benchmark/summary)
- 没有翻译质量评测(无 BLEU/COMET 类指标),也没有与 Wordly/KUDO/Interprefy/Google 同传的第三方横评(精确检索 0 结果)
- 口碑样本还很小:HN 上 5 个 Show HN 帖全部 0 评论;Chrome 商店 3000 用户仅 8 条评分(4.6 分);Product Hunt 87 票、6 条评论全正面(有一条实测细节:「头戴麦效果优于笔记本麦」);知乎/B站没有找到实测内容
- 热度真实性:未发现任何刷 star 指控;用 Wayback 快照重建的 star 曲线是渐进式增长、无异常尖峰(2025-10 = 289 → 2026-02 = 821 → 2026-09 = 1,199)。自助推广痕迹明显(HN 5 连发、Reddit 营销风格帖),但推广本身合规
值不值得跟:想自己实现同传,从这里学什么
结合「自己做一个同传功能」这个目标,sokuji 的价值可以分三层:
- 算法层(最直接可抄):客户端 VAD 分段 + 0.7s 预滚 + 双模式降级状态机 + partial 三级流水线。
asr_engine.py一个文件就能看懂整套分段逻辑,是极好的参考实现 - 工程层(踩坑指南):WS-RPC 本地进程间协议(二进制音频帧直通、控制消息先二进制后 JSON 的定序);TTS 取消必须杀到 executor 线程(只取消 asyncio Task 会留下还在跑的 GPU 线程);流式输出时 UTF-8 跨 token 边界要增量解码(否则切出乱码);VRAM ledger 跨引擎预算。这些都是文档不写、只有踩过才知道的坑
- 架构层(设计参考):provider registry 的多后端扩展模式;两条本地推理路线刻意不合并的决策——如果只做一条路线(比如 3090 上的 Python 服务端),负担小得多
但要清楚它的边界:sokuji 没有解决「真增量翻译」的问题(整句全量调用,延迟下限受句长制约)。如果目标是更低延迟的同传,GitHub 上有更对口的参考:
- 工程脚手架首选 WhisperLiveKit(~11k★,Apache-2.0):流式策略 AlignAtt + LocalAgreement 双选,NLLB/LLM 流式翻译,OpenAI/Deepgram 兼容 API,部署和评测脚本齐全,当前最活跃
- 算法内核读 ufal/SimulStreaming(IWSLT 2025 同传共享任务最佳):AlignAtt 用注意力判断解码位置,LLM 翻译用「confirmed/unconfirmed 双缓冲区」协议实现真增量输出,代码量小,是最小可抄实现;配上 ufal/whisper_streaming(LocalAgreement 原始实现:连续两次转写前缀一致才确认)理解策略演进
- 端到端路线慎选:StreamSpeech 单模型任意延迟但语向只有欧洲语→英;seamless_communication 维护已停滞且权重 CC-BY-NC 禁商用。对以中文为目标语言的自研同传,级联路线(流式 Whisper + LLM 增量翻译)是务实选择——这正是 sokuji 本地模式走的路线,它证明不做增量翻译、靠精细分段也能做到产品级;要再压延迟,就往 SimulStreaming 式的增量协议上走
参考阅读
- kizuna-ai-lab/sokuji — 项目主页,README 覆盖定位/安装/provider/模型池
- sokuji CLAUDE.md — 开发指南:架构五支柱、native ggml 运行时设计
- sokuji sidecar/asr_engine.py — 分段-降级状态机源码,自建同传最值得精读的一个文件
- sokuji audio-flow-analysis — 音频链路与 AEC 组合拳文档
- ufal/SimulStreaming — AlignAtt + 双缓冲区流式翻译算法最小实现
- QuentinFuxa/WhisperLiveKit — 最活跃的流式语音翻译工程化脚手架
- ufal/whisper_streaming — LocalAgreement 策略的原始论文实现