不用订阅,我在本地搭了一个语音助手

语音助手这件事,我对云端方案一直不太放心。倒不是怕什么,主要是对话内容全送出去,心里别扭。之前试了几家 API 的实时语音,延迟确实低,但每月几十刀的账单,讲中文时还偶尔抽风。我就想:有没有办法完全本地跑一个,数据不出我的机器?

搜了一圈,发现 Hugging Face 有个 speech-to-speech,36k 多星,最近还在密集更新。它的思路不是封装一个黑盒模型,而是搭了一条管道:你说的话先进 VAD 检测,再转文字,LLM 生成回复,最后 TTS 念出来。四个环节各自独立,每个都能换。

s2s-architecture

这设计对我这种喜欢折腾的人很友好。管道里用哪家的 STT、哪个 LLM、什么 TTS,完全自己定。不想联网的话,四个环节全用本地模型就行。

装起来比想象中简单

项目用 Python 3.10+,推荐 uv 管理依赖。我习惯 pip,所以直接:

pip install speech-to-speech

macOS 上它自动装了 ARM 架构优化版:STT 走 Parakeet TDT(MLX 加速),TTS 默认 Qwen3-TTS 配 mlx-audio,LLM 用 mlx-lm。一条命令就能启动本地对话:

speech-to-speech local --mac-optimal-settings

但我机器是 16GB 内存,直接跑默认配置有点顶。Qwen3-TTS 1.7B 加上默认的 LLM,内存峰值能到 14GB 以上,虽然没爆,但系统已经开始Swap了。这不行,得挑模型。

16GB 小主机的精简方案

speech-to-speech 的文档给了一套 mac-optimal-settings,但那个预设适合内存宽裕的机子。16GB 需要更克制的组合。我试了几种,最终定下来:

  • STT:Parakeet TDT(默认就很快,<100ms 流式识别,25 种语言)
  • LLM:Qwen3-4B-Instruct bf16(mlx-lm 后端,约 8GB 峰值内存)
  • TTS:Qwen3-TTS 6bit 量化(mlx-audio,1.7B 参数压到约 3GB)
  • VAD:Silero VAD v5 + Smart Turn(端点检测,自动判断你说完了没有)

加起来峰值内存约 10-12GB,16GB 设备留有余量。启动命令改成:

speech-to-speech local 
    --mac-optimal-settings 
    --model_name mlx-community/Qwen3-4B-Instruct-2507-bf16

s2s-mac-config

实测下来,从我说完到听到回复,延迟大约 1.5-2 秒。比不上云端 API 的 300ms,但本地跑这个成绩,我已经挺满意了。Smart Turn 的话轮检测很准,我说到一半停顿思考,它不会急着截断;真正说完了,它才走后续流程。

中文支持是个惊喜

我本来担心开源语音项目的中文支持会拉胯,但 speech-to-speech 给了好几个选项。STT 方面,Paraformer 是阿里 FunASR 的模型,默认面向中文;Whisper 的 MLX 加速版也能用。TTS 方面,Qwen3-TTS 自带多语言自动检测,中文自然度不错;ChatTTS 更专精中英双语, emotion 控制也强。

我最后没换 ChatTTS,因为 Qwen3-TTS 的 6bit 量化在 ARM 上更省内存。中文朗读偶尔有轻微机器感,但比早期开源 TTS 强太多了。可以固定用中文:

speech-to-speech local --mac-optimal-settings --language zh

或者开自动检测,你说中文它回中文,切英文它也跟着换。

几个实际踩的坑

1. 依赖冲突:Pocket TTS 需要 numpy 2.x,但 DeepFilterNet(VAD 可选音频增强)锁 numpy<2。如果你同时装了两个,会炸。我干脆弃用 DeepFilterNet,反正 Parakeet TDT 的输入质量够好。

2. 模型下载:第一次跑 mlx-lm 和 Qwen3-TTS 会从 Hugging Face 拉模型,Qwen3-4B bf16 约 8GB,Qwen3-TTS 约 3GB。家里宽带够的话,几分钟下完。但如果用流量,得留意。

3. 打断逻辑:默认开启打断,你说到一半可以插嘴覆盖助手回复。但本地 LLM 生成速度不如云端,打断时偶尔会残留上一个回复的几个字。Smart Turn 的 --speculative_reopen_ms 可以调,默认 800ms,我改成了 500ms,响应更跟手。

4. API 兼容性:speech-to-speech 暴露的是 OpenAI Realtime-compatible WebSocket API。这意味着任何兼容这个协议的客户端都能连——不只是它自带的 talk 命令,你也可以自己写个网页版,或者接到别的设备上。

数据留在本地的感觉

全程跑下来,最大的好处不是省了订阅费,而是对话内容完全不出我的局域网。语音输入、文字理解、语音输出,全在 16GB 小主机上闭环。对于写代码时随口问个问题、查个文档、甚至只是无聊唠两句,这种“无心理负担”的交互方式,我觉得比云端方案更舒服。

当然,它也有天花板。4B 模型的智商和 70B 云端模型没法比,复杂推理和代码生成还是弱一些。延迟 1.5 秒 vs 云端 300ms,差距明显。但在“日常对话+轻量问答”这个场景,够用了。

s2s-star-history

这个项目从 2024 年 8 月创建到现在,两年间 star 数涨到了一万多。最近它甚至成了某机器人产品的生产对话后端。Apache 2.0 协议,代码全开源,模型权重也能本地下载。如果你也在找一条完全本地的语音助手路线,可以看看它。

发表评论