六个 STT 后端怎么选:先看平台,再看语言
speech-to-speech 这条流水线是 VAD → STT → LLM → TTS 四段级联,每一级都能换后端。真正需要你在第一天就拍板的是 STT 那一级:换 TTS 换的是输出,换错了顶多重来一次;STT 选错,整条链路收到的就是错的文本,后面 LLM 和 TTS 再好也救不回来。
而这一级的默认值恰好是中文读者最容易踩空的地方——--stt 默认是 "parakeet-tdt",而 Parakeet TDT 在 README 的多语言表里写的是25 种欧洲语言。也就是说,你按官方最短路径装完、直接跑起来,它压根不打算听懂中文。
所以这篇不打算把六个后端的参数抄一遍,而是给一条决策路径:从你手上是什么机器、要不要中文、权重从哪来、要不要给多人用,一步步倒推到具体那个 --stt 取值。
先把这六个摆在一张表上
这是 README 的 Supported Components 表里 STT 那一段,只保留和选型直接相关的三列,外加一列我从参数导出里对出来的参数前缀——最后这一列后面会救你一次。
--stt 后端 | 平台栏写的是 | 安装方式 | 模型参数写在哪个前缀下 |
|---|---|---|---|
| Parakeet TDT(默认) | CUDA / CPU 走 nano-parakeet;Apple Silicon 走 MLX | 内置 | --parakeet_tdt_model_name |
| Whisper(通过 Transformers) | CUDA / CPU | 内置 | --stt_model_name |
| Faster Whisper | CUDA / CPU | faster-whisper extra | --faster_whisper_stt_model_name |
| Lightning Whisper MLX | Apple Silicon | whisper-mlx extra | --stt_model_name |
| MLX Audio Whisper | Apple Silicon | macOS 上内置 | --mlx_audio_whisper_model_name |
| Paraformer(FunASR) | CUDA / CPU | paraformer extra | --paraformer_stt_model_name |
表里有两件事值得先说清楚。
第一,平台这一列只区分「CUDA / CPU」和「Apple Silicon」两类,没有单独的 Windows 条目。两个 MLX 后端明确标着 Apple Silicon,非 macOS 环境直接出局;剩下四个的平台栏都带 CUDA / CPU。其中默认的 Parakeet TDT 那一栏还额外写了「Apple Silicon 走 MLX」,是唯一一个两边都占的后端。
第二,参数前缀那一列是乱的。Whisper 和 Lightning Whisper MLX 用的是没有前缀的 --stt_model_name(默认 "distil-whisper/distil-large-v3"),其余四个各带各的前缀。上游为什么这么设计我们不知道,但对使用者来说结果一样:你照着一篇讲 Faster Whisper 的文章敲 --faster_whisper_stt_model_name,切到 Whisper 后端时它会失效——原因见文末那条「静默忽略」。
第一步:按平台砍掉一半
这一步几乎不需要思考,照表划掉就行。
你在 Apple Silicon 的 Mac 上:六个全在候选里,两个 MLX 后端是你独有的选项。README 给的中文示例走的就是 whisper-mlx。另外模块级有个 --mac_optimal_settings(默认 False),README 说两条示例命令都能配合它使用,且显式写出的 --stt 会覆盖预设——所以你不用担心开了这个开关就选不了后端。
你在带 CUDA 的 Linux 机器上:候选是 Parakeet TDT、Whisper、Faster Whisper、Paraformer 四个。注意 --paraformer_stt_device 默认就是 "cuda"、--stt_device 默认也是 "cuda",而 --parakeet_tdt_device 和 --faster_whisper_stt_device 默认是 "auto"。这四个默认值不一致,换后端时别以为设备是全局统一的;模块级还有个 --device,它的 help 写的是「如果指定,覆盖所有 handler 的设备」。
你在 Windows 上:README 没有为 Windows 单列一栏,可选范围就是上面那四个「CUDA / CPU」的后端,MLX 那两个不用考虑。
你只有 CPU:Parakeet TDT、Whisper、Faster Whisper、Paraformer 的平台栏都带 CPU。但具体跑起来是什么体验,我们没有依据,这一点不比——README 没给任何吞吐或实时率数据,我们也没有运行过这个项目。
第二步:按语言定下具体那个
平台砍完,语言这一刀才是决定性的。README 里那句话要背下来:语言覆盖取决于你选的 STT 与 TTS,而不是流水线本身。
只做英文,那默认就够了,不用动 --stt。--language 默认是 en。
要做中文,默认的 Parakeet TDT 直接出局——它的 --parakeet_tdt_language help 里写得很明白,不指定就自动检测,支持的是 25 种欧洲语言。你的选项收敛成两条:
- Whisper 系(Whisper / Faster Whisper / Lightning Whisper MLX / MLX Audio Whisper):README 的说法是「广泛多语言,取决于所选 Whisper 检查点」。
whisper_stt_arguments.py里--language的可选值枚举里明确列了'zh' (chinese)。 - Paraformer(FunASR):README 的说法是「取决于所选 FunASR 检查点,默认那个偏中文」——
--paraformer_stt_model_name默认值就是"paraformer-zh"。
这两条怎么选?我们能给的判断依据只有一条,而且是安装成本层面的:Paraformer 要额外装 paraformer extra,默认检查点自带中文取向,不用你再挑模型;Whisper 系则要你自己指定检查点。至于哪个转中文更准,README 没给任何对比数据,我们没有运行过,这一点不比。
选 Faster Whisper 做中文的话,有个默认值必须改。 --faster_whisper_stt_model_name 默认是 "tiny.en",同时它还有一个自己的 --faster_whisper_stt_gen_language,默认也是 "en"——检查点名的 .en 后缀和这个默认语言码是一致的英文取向。这两个参数和全局的 --language 是三个不同的参数,改一个不等于改了全部;具体某个 FunASR 或 Whisper 检查点到底覆盖哪些语言,README 只给了「取决于所选检查点」这一句,剩下的要去模型页面自己确认。
README 给的中文示例(macOS 侧)是这样的:
speech-to-speech serve \
--stt whisper-mlx \
--stt_model_name large-v3 \
--language zh \
--llm_backend mlx-lm \
--model_name mlx-community/Qwen3-4B-Instruct-2507-bf16
注意 --stt whisper-mlx 配的是没有前缀的 --stt_model_name,这就是上面那张表最后一列的用处。
如果你的场景是多语种混说,README 还给了自动检测的用法:把 --language 设成 auto,STT 会检测每次说话的语言并转给 LLM。可以另外加 --enable_lang_prompt(默认 False),它会追加一句 “Please reply to my message in …” 的指令;README 给的判断依据是:大模型通常能从上下文推断语言,但对小模型来说这条显式指令可能有帮助。
第三步:确认「本地」到底本地到什么程度
选型时很多人以为换成本地 STT 就等于全链路离线,这里有两个要拆开看的点。
一是权重要下载。六个后端背后都是需要拉取的模型检查点,第一次跑必然要联网;从 Hugging Face 拉受限模型时用 $HF_TOKEN 这类环境变量传凭证,不要把 token 写进命令行历史。
二是LLM 那一级默认根本不本地。项目描述原文是 “Build local voice agents with open-source models”,但 --llm_backend 默认值是 "responses-api",也就是 OpenAI 兼容 API。你把 STT 换成了 Paraformer,LLM 却还在往外发请求,那这套系统仍然是联网的。要全本地,得同时把 --llm_backend 换成 transformers 或(macOS 上)mlx-lm,或者指向你自己起的 OpenAI 兼容服务。仓库的 docker compose up 就是这个思路:compose 文件会起一个跑 Gemma 4 的 llama.cpp 服务和实时服务,暴露 8080 与 8765 两个端口。
顺带一提,模块级还有个 --enable_live_transcription,默认是 True,但它的 help 原文写的是「works with parakeet-tdt」。所以当你按第二步换掉了默认 STT,这个开关还开着的时候能不能生效,请以 -h 的实际输出和你自己的观察为准,别默认它跟着走。
第四步:这套是给一个人用还是给一群人用
STT 选型和并发是绑在一起的,因为并发不是共享一个 STT 实例。--num_pipelines 的 help 原文说得很清楚:池子里每个 pipeline 实例各有自己的 VAD/STT/LM/TTS handler 和对话状态,一个 uvicorn 服务监听 --port,把每个新客户端路由到下一个空闲 pipeline;最大并发 WebSocket 会话数等于 num_pipelines,超出的连接会被拒绝。
而这个参数默认是 1。
这意味着两件事:你做多人部署时第一个要动的就是它;以及你选的 STT 后端会按 num_pipelines 被复制若干份。至于复制几份合适、每份要多少资源——这个我们没有依据,不给数字。
服务端另外两个默认值:--host 是 "127.0.0.1",--port 是 8765。要让别的机器连上就得改 --host;这里必须如实带出官方自己的声明:LLM proxy(--enable_llm_proxy,默认 False)自身不做认证、不做限流,只应在受信网络内或放在网关之后启用。把 --host 改成 0.0.0.0 同理需要谨慎。这篇不给「这样配就安全了」的结论——安全方案请结合你自己的环境评估。
哪些维度我们不比
选型文章最容易掺水的就是拿没有依据的东西排名。这里把不比的直接列出来:
- 识别准确率:README 没给任何对比数据,我们也没有对着麦克风说过一句话。
- 延迟:这个项目的 CLI 里确实有一堆毫秒值,但它们是参数默认值,是流水线自己引入的可配置等待,不含 STT / LLM / TTS 的推理耗时,把它们相加得出「端到端约多少毫秒」是错的。
- 模型体量:我们手上唯一硬的体量事实是模型名里自带的参数量。STT 这一级只有默认的
nvidia/parakeet-tdt-0.6b-v3名字里带了 0.6B,其余几个默认检查点(distil-whisper/distil-large-v3、mlx-community/whisper-large-v3-turbo、tiny.en、paraformer-zh)名字里都没有参数量。六个后端没法在这个维度上横向比。 - 显存 / 内存占用:一律不给。
两个选型期最容易踩的坑
坑一:写错后端专属参数,程序不报错。 README 明说 CLI 只为选中的后端构造配置,未激活后端的已知选项仍然被接受,但会带警告地忽略;JSON 配置同理,多余的非激活后端键会被忽略。所以你 --stt parakeet-tdt 却传了 --faster_whisper_stt_model_name,它照跑,只是那行参数没起作用——排查时先回头核对前缀和 --stt 是不是配套的。
坑二:-h 看到的不是全部。 131 个 CLI 参数分散在 18 个 dataclass 文件里,speech-to-speech serve -h 只会给你当前这套组合的默认值与专属参数。想看另一种组合,要把选择器放在 -h 前面:
speech-to-speech serve --stt mlx-audio-whisper -h
选型阶段这条比读任何文章都管用——先把候选后端各 -h 一遍,看清各自的默认值再决定。
收敛成三句话
- 不在 Mac 上:MLX 两个直接划掉。只做英文留默认 Parakeet TDT,要中文就在 Whisper 系和 Paraformer 之间选,Paraformer 的默认检查点
paraformer-zh省一次挑模型的功夫。 - 在 Apple Silicon 上:多两个 MLX 选项,README 的中文示例给的就是
--stt whisper-mlx --stt_model_name large-v3 --language zh。 - 要给多人用:先改
--num_pipelines(默认 1),再处理--host/--port(默认127.0.0.1/8765)和 LLM proxy 的暴露问题,最后才轮到调 STT 参数。
按官方参数语义组合、给 CUDA 机器做中文的一条起点命令大致是这样:
speech-to-speech serve \
--stt paraformer \
--paraformer_stt_model_name paraformer-zh \
--paraformer_stt_device cuda \
--language zh
以上为按官方参数语义组合的示例,未逐项实测,以官方文档与 --help 的实际输出为准。用之前记得先装 pip install "speech-to-speech[paraformer]"。
最后一句提醒:这个仓库在 2026-08-09 的快照里 star 是 11893,但 star 数不说明它适不适合你的语言、你的平台、你的并发量——上面那四步才说明。
延伸阅读
本文依据 speech-to-speech 官方仓库(github.com/huggingface/speech-to-speech)的 README、
src/speech_to_speech/arguments_classes/ 下的参数定义与 Realtime Engine 架构文档整理,核对日 2026-08-09。
本文内容为仓库源码与文档口径,我们没有安装、部署或调用过该服务,文中毫秒值均为参数默认值而非实测延迟。
参数与默认值随版本变动,请以 speech-to-speech serve -h 的实际输出为准。
各模型权重的许可各不相同,以各模型页面与官方 LICENSE 原文为准,本文不构成法律意见。 安全相关做法请结合自身环境评估,本文不构成安全方案建议。