Hugging Face 与 Cerebras 让 Gemma 4 的语音交互变得像真人聊天一样流畅自然
- 现在的语音 AI 不笨,就是慢。说完一句要卡几秒,聊天不像跟人说话。
- Hugging Face 和 Cerebras 把最慢的那一环换成了极速推理硬件,每秒吐 1851 个字,是普通 GPU 的 35 倍。
- 但现在豆包、GPT-Live、Gemini Live 都是端到端全双工,能边听边说、听得出语气。这套是四段接力、半双工,聊天节奏比不过。
- 它的价值在另一头:四段全开源、每段可换,能整条搬回自己机器断网跑,中间那层文字你拿得到。
- 为了补上节奏差距,它不等你说完就抢先想答案,猜错了整段重来。默认那套识别只认 25 种欧洲语言,中文要另配。
语音 AI 现在卡的是速度
模型的水平早就够用了,答得也对。真正卡住体验的是延迟:你说完一句,它要停几秒才出声。一来一回都这样,对话就僵,不像在跟人说话。
更难受的是它时快时慢。十次里九次一秒出头,第十次拖到三秒,你以为它没听见,又说了一遍,结果两个人一起开口。工程上量的就是这个:一百次响应里最慢那几次有多慢,叫 P95 延迟。平均值好看没用,卡顿感全是那几次给的。
像跟一个反应慢半拍的人打电话。他不笨,答得也对,但每句话之间那几秒空白让你没法正常聊天。
他们把最慢的那一环换掉了
先说清楚 Cerebras 是谁,不然「35 倍」这个数字没法判断真假。
它是一家做 AI 芯片的公司,路子跟英伟达不一样:别人把一整张晶圆切成几百颗芯片再拼起来用,它干脆不切,整张晶圆做成一颗巨大的芯片。好处是数据不用在芯片之间来回搬,模型权重直接放在片上内存里,读取快得多。这套东西训练模型不占优势,但拿来做推理,也就是让已经训好的模型吐字,速度非常快。它这几年做的生意主要就是卖这个速度。
语音 AI 从听你说到开口回答,要过四道工序。四道里最慢的是中间那道,模型想答案。前后三道再快也被它拖着。
Hugging Face 和 Cerebras 的做法是把这道工序交给 Cerebras 的推理硬件,模型用的是 Google DeepMind 开放权重的 Gemma 4 31B。
四道工序各跑一个线程。除了中间那道默认走网络,其余三道都在本机跑
快了 35 倍,那几次特别慢的卡顿也跟着没了。这是 P95 延迟改善的直接来源:想答案这道工序的耗时被压到很小,整条链的波动自然就小。
他们还顺手关掉了模型的「思考」,接入命令里带着 --responses_api_reasoning_effort none。同一个模型拿去写代码时开着思考更聪明,拿来聊天时关掉才跟得上语速。
Gemma 4 31B 站内写过两回。这次它换了个身份出场:一条开源管线里随时能拆下来换掉的那颗大脑。
那几家的模型你带不走,这套你能
要看懂这套东西的价值,得先分清它跟豆包、GPT-Live 根本不在一条赛道上。那几家比的是谁聊得更像人,这套比的是谁的东西归你。
先说那几家。实时双工语音早就不是新鲜事。豆包的语音模型从 2.0、3.0 起就能实时双工对话,今年 4 月又上了原生全双工的 Seeduplex,在 App 里全量;OpenAI 7 月发布 GPT-Live,边听你讲边回应;Gemini 的 Live 接口更直接,声音进、声音出,中间根本没有识别、大模型、合成这三道工序。
这类模型天生就有对话节奏。它们能一边听你说一边应,能判断你只是停下来想词、还不该接话。Gemini 那边有个叫 Proactive Audio 的开关,打开之后模型自己决定该不该开口,可以一直当个不出声的旁听者。字节公布 Seeduplex 时给的数字是,误打断率减半,抢话比例降了 40%。
Hugging Face 这套走的是老路子:四道工序接力,识别、想答案、合成各管一段。它是半双工的,同一时刻只能听或者只能说,你插嘴它会闭嘴,但它没法在你说话的时候「嗯」一声。
声音在第二道工序就被转成了纯文字。你的语调、犹豫、笑声、着急,到这一步全丢了,后面那颗大脑收到的只是一行字(Gemma 4 31B 本身也不吃音频)。端到端模型是直接听声音的,它知道你在笑还是在急。
所以在「聊得像人」这件事上,它比不过豆包和 GPT-Live,而且这个差距是架构决定的,补不满。
但这笔账还有另一半。那三家聊得再好,你也只是在租:模型在人家服务器上,你调的是接口,断网就没了,人家改价、改条款、下线某个能力,你只能跟着。这套反过来,东西是你的。
那它强在哪
「东西是你的」这句话,落到实处是一张许可证。这条链上四道工序,包括中间那颗大脑 Gemma 4 31B,全是 Apache 2.0。这个许可意味着你可以商用、可以改、可以拿去再分发,不用回头找谁批准。
具体能换来什么,有四条。
整条链能搬回自己机器
四道工序全部 Apache 2.0 开源,三道默认就在本机跑。中间那道用 llama.cpp 托管一个小号 Gemma 4 也能拉回来,断网照样对话。9000 多台 Reachy Mini 机器人用的就是这条链。
每一道都能换
识别换 Whisper、大脑换任意 OpenAI 兼容服务、合成换 Kokoro,都是改个参数的事。也能换成你自己微调过的模型。
中间那层文字你拿得到
端到端模型内部没有文字这一层,你看不到它把你的话理解成了什么。这条链每一步都有文本落地,想加审核、想存下来做检索、想在它开口前改一句,都有地方下手。
现有客户端不用改
它对外说的是 OpenAI 那套实时语音协议。按那套协议写好的应用,把地址换成自己这台服务器就接过来了。
| 豆包 / GPT-Live / Gemini Live | 这一套 | |
|---|---|---|
| 架构 | 端到端,声音直接进出 | 四道工序接力 |
| 能边听边说吗 | 能,全双工 | 不能,半双工;支持你插嘴打断 |
| 听得到语气吗 | 听得到,直接处理声音 | 听不到,第二道就转成纯文字了 |
| 跑在哪 | 对方的服务器 | 四道里三道默认在本机,第四道也能拉回来 |
| 模型能不能换 | 用对方的 | 每一道都能换 |
| 中间的文字 | 没有这一层 | 转写、回复文本、工具调用都拿得到 |
| 许可 | 按服务条款 | Apache 2.0 |
像租房和买房。租的那套精装修、拎包入住、体验最顺,但墙不能砸,房东哪天涨价或者不租了你没办法。买的这套得自己装修,有些地方一时半会儿装不到人家那个水准,可钥匙在你手里,想怎么改怎么改,也没人能把你赶出去。
下面几节讲的就是它怎么补。
它靠抢跑来补上节奏差距
半双工那套一问一答的节奏,天生比不过边听边说。这条管线的对策是抢跑:不等你说完就开始想,赌你后面不会大改。下面三件事是一套连着的。
它干脆不等你说完就开始想
硬件把想答案这道压快之后,剩下的延迟大头挪到了一个不起眼的地方:判断你说完没有,本身就要花时间。
机器靠数静音判断你说完了。你一停,它开始数,数够了才敢动手。这段等待什么活都没干,纯粹在确认。可又不能数太短,太短的话你换口气它就抢答。
把「确认」和「干活」叠着做。静音只要 64 毫秒它就当你说完了,识别和生成立刻开跑;算出的答案先憋在手里 1 秒不出口。这 1 秒留给你反悔:你接着说了,这版作废;你真说完了,1 秒一到答案早算好了,张嘴就念。
切一下下面两个标签,看时间花在哪。
时间 →
等待和干活前后接力,两段时间加在一起。
时间 →
等待和干活重叠,所以能早开口。示意图,说明先后关系,不代表实测耗时。
它没把确认的时间省掉,是把干活的时间藏进了等待里。
这也解释了为什么非要配极快的硬件:答案必须在这 1 秒内算完,不然照样得等。思考一开就冲出预算,所以要关掉。
像服务员看你合上菜单就往后厨走,但在传菜口先站一秒。这一秒你加菜他就回头重记;一秒过了没动静,单子递进去。菜比别家早上桌,靠的是他走那几步路的工夫已经把单记好了。
你补一句话,它把整段重新来过
抢跑最怕猜错还硬说下去。它的处理是整段推翻。
你在那 1 秒里又开口,这一版就作废。它不会接着你的后半句往下猜,而是把前面那段录音留着,跟你新说的拼成完整一句,从头重新转写、重新生成。所以答案质量不受影响,模型看到的始终是一整句话。
代价是每反悔一次就全量重跑一次。你说得断断续续连停四回,后台就白跑四轮。硬件便宜又快在这里格外重要。
还有个细节专门为续接让路:正常起一句新话要检测到 384 毫秒的语音才算数,免得咳嗽声触发;接着上一句往下说则只要 192 毫秒,门槛砍一半。它宁可把你的停顿当成还在说。
它一开口,这一轮就锁死了
能不能反悔,看的是一个动作而非一段时长:合成模块只要开始出声,这一轮立刻锁定,之后你再说什么都算新的一轮。锁定之前最长能在 7 秒内反复重开,够你想词、换气、说半句停下来补一句。
它已经在说了你插嘴,它立刻闭嘴
上一节说的是它还没开口时的反悔。这一节是它正在说话,你直接打断。
难点在于你插嘴那一瞬间,四个线程里到处都是半成品:模型还在吐字,合成还在切音频块,发送循环还在往你耳朵里推。一个个去追杀既慢又容易漏。
给每块产物盖一个批次号。取消的时候不追杀,只把计数器加一,旧批次全部自动失效。各线程生成下一个字之前看一眼自己的批次号还是不是最新的,不是就收工。互相之间不用打听谁先谁后,只认号。
像换门锁。不用把发出去的旧钥匙一把把收回来,锁一换,旧钥匙自己就不好使了。
打断也能关掉。关上之后你说话照样被转写,但它不停,会把手上这段说完。电话客服的固定播报、机器人念安全提示,这类场景用得上。
装起来之后,它能做这些事
边说边出字
你还在说,转写就一段段往外送。
随时打断
它说到一半你开口,立刻闭嘴听你的。
能看东西
Gemma 4 31B 能读图。摄像头是当成一个工具接进去的,它要看的时候客户端把当前那一帧送回去。
会调工具
支持函数调用。机器人那边的跳舞、转头、停下就是这么接的。
语言自动切
按每句话检测语种再转给模型,中途换语言不用改设置。
声音能换
自带多个音色,换个可选后端还能拿一段参考音克隆声音。
装一套要三条命令
先起服务,再从另一个终端连上去说话。
pip install speech-to-speech export OPENAI_API_KEY=... speech-to-speech
这里要 OpenAI 的 key,是因为不给参数时中间那道默认接的是 OpenAI 的 gpt-5.4-mini。换成这次的主角,把模型名和地址指过去就行。
speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
--llm_backend chat-completions \
--tts qwen3 \
--model_name "google/gemma-4-31B-it:cerebras" \
--responses_api_base_url "https://router.huggingface.co/v1" \
--responses_api_api_key "$HF_TOKEN" \
--responses_api_reasoning_effort none \
--responses_api_stream
python scripts/listen_and_play_realtime.py --host 127.0.0.1 --port 8765
不想把话送出去的,让中间那道也留在本机:一个终端用 llama.cpp 托管小号 Gemma 4,另一个终端把管线指过去。
# 终端 1:llama.cpp 托管 Gemma 4
llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full
# 终端 2:让语音管线用这个本地服务
speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
--llm_backend responses-api \
--tts qwen3 \
--model_name "ggml-org/gemma-4-E4B-it-GGUF" \
--responses_api_base_url "http://127.0.0.1:8080/v1" \
--responses_api_api_key "" \
--responses_api_stream \
--enable_live_transcription
有几条边界值得先知道
仓库自己列了一批限制,装之前看一眼。
最直接的一条:默认那套识别只认 25 种欧洲语言,中文不在里面,得换成 Whisper 或 Paraformer。下面这条命令只能在苹果自研芯片的 Mac 上跑,而且它顺手把中间那道也换成了本机小模型。别的系统要装 speech-to-speech[faster-whisper] 或 [paraformer] 再配对应参数。
speech-to-speech \
--stt whisper-mlx \
--stt_model_name large-v3 \
--language zh \
--llm_backend mlx-lm \
--model_name mlx-community/Qwen3-4B-Instruct-2507-bf16
默认只能同时服务一个人
管线池默认只有一条,第二个连进来的会话直接被拒。想给一个团队用得把这个数调大,每条管线各吃一份模型内存。
TCP 模式很简陋
只传裸音频,没有打断、没有实时转写、没有工具调用。前面讲的两套机制在这个模式下都不生效。
另一条传输通道要额外装
WebRTC 要单独装附加包,否则握手直接报错。默认只给同机或同局域网用,跨公网要自己配转发服务器,某些网络下仍连不上。
两条通道功能没对齐
降噪只做在 WebSocket 这条上;WebRTC 那条上摄像头快照会被压到约 60 KB 才发得出去,模型看到的画面小一号。
还有两个装的时候会绊人的地方:可选的音频增强模块要 numpy 1.x,Pocket TTS 要 numpy 2.x,两个装不到一起;Linux 上默认的语音合成包认 CUDA 12.8,对不上得先装对应版本,仓库给了 CUDA 13、12.4 和纯 CPU 三个地址。
想先试试不装的,在线版打开就能说。免费额度按世界标准时间每天重置:不登录 5 分钟,登录的普通用户 10 分钟,PRO 会员和几个指定组织的成员不限;自己在本机跑不计量。
语音助手的卡顿:从你说完它才开始想 → 你还在说它已经想好了
Hugging Face 和 Cerebras 联手改造一条开源语音管线,把四道工序里最慢的那道换掉,一页带图讲完。
↓ 一页读完 · 有一张会动的图
这是一条开源的语音助手管线:你对着麦克风说话,它出声回答,干的活跟豆包、GPT-Live 一样。区别在于它的四道工序全部公开,可以整条搬到自己电脑上跑。
✘ 听不出你在笑还是在急,也没法一边听你说一边应声
四道工序里最慢的是中间那道,想答案。前后三道再快也被它拖着。这次的改动是把这道交给 Cerebras 的推理硬件:那家公司不把晶圆切成小芯片,整张做成一颗巨芯片,模型权重直接放在片上,吐字速度快得多。同时把模型的「思考」关掉,写代码时思考更聪明,聊天时它跟不上语速。
# 中间那道默认接 OpenAI 的
# gpt-5.4-mini,思考开着
"google/gemma-4-31B-it:cerebras"
--responses_api_reasoning_effort none
改的只是两个参数。这条链上每一道都能这样换:识别换 Whisper、合成换 Kokoro、想答案那道换成本机的 llama.cpp 都行。但硬件把它压快之后,剩下的延迟大头挪到了一个不起眼的地方,判断你说完没有,本身就要花时间。
机器靠数静音判断你说完了。你一停,它开始数,数够了才敢动手,这段时间什么活都没干。数太短又会在你换气时抢答。这套管线的办法是把「确认」和「干活」叠着做:静音只要 64 毫秒就当你说完,识别和想答案立刻开跑,算出的答案先憋 1 秒不出口,留给你反悔。
它没把确认的时间省掉,是把干活的时间藏进了等待里。示意先后关系,长短不代表实测耗时
「快 35 倍」听着没概念。换算成同一件事:想一句 60 个字的回答,两边各要多久。
按每秒吐字数折算:每秒 53 字要 1.13 秒,每秒 1851 字只要 0.03 秒,1.13 ÷ 0.03 ≈ 35 倍。1851 由测评机构 Artificial Analysis 测得,Cerebras 在自家博客引用;每秒 53 字那一栏按「35 倍」反推,是示意值,第三方没有单独复现。这里只算想答案这一道,前后的识别和合成不在内。
装起来是一行 pip install speech-to-speech,网页版打开授权麦克风就能说,不登录每天免费 5 分钟、登录 10 分钟。两条边界先知道:默认那套识别只认 25 种欧洲语言,中文得换成 Whisper 或 Paraformer;默认一次只服务一个人,给团队用要自己把管线数调大,每条各吃一份模型内存。
死机了?
② 把话转成字
③ 想答案 ← 最慢
④ 把字念出来
要穿外套吗?
整句我重听。
- × 听不出你在笑还是在急
- × 没法边听你说边应声
- × 默认识别只认 25 种欧洲语言,中文得另配
