Hugging Face 与 Cerebras 让 Gemma 4 的语音交互变得像真人聊天一样流畅自然

它跟豆包、GPT-Live 不在一条赛道:那几家的模型你只能租,这条链四道工序全是 Apache 2.0,可商用可改可搬回自己机器;代价是聊天节奏比不过。
作者:Hugging Face Blog07-21 · 12 分钟⚑ 厂商通稿 · 立场提示
深度 · 小互解读
一分钟速览
  • 现在的语音 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。

① 听你开口没 Silero VAD v5 本机 ② 把话转成字 Parakeet TDT 本机,共 6 种可选 ③ 想答案 最慢,卡顿出在这 Gemma 4 31B 跑在 Cerebras 可换任意兼容服务 ④ 把字念出来 Qwen3-TTS 本机,共 5 种可选 你说话 它开口

四道工序各跑一个线程。除了中间那道默认走网络,其余三道都在本机跑

Cerebras
1851
典型 GPU 端点
≈ 53

单位为每秒输出的字数。1851 由 Artificial Analysis 测得;典型 GPU 端点这一栏按「35 倍」反推,为示意值

快了 35 倍,那几次特别慢的卡顿也跟着没了。这是 P95 延迟改善的直接来源:想答案这道工序的耗时被压到很小,整条链的波动自然就小。

他们还顺手关掉了模型的「思考」,接入命令里带着 --responses_api_reasoning_effort none。同一个模型拿去写代码时开着思考更聪明,拿来聊天时关掉才跟得上语速。

官方实机演示,可以听一下它接话的节奏。来源 Hugging Face 博客配套素材

Gemma 4 31B 站内写过两回。这次它换了个身份出场:一条开源管线里随时能拆下来换掉的那颗大脑。

站内相关
Gemma 4 技术报告:开源模型怎么用「小参数 + 会思考 + 省内存」硬碰大模型
这颗大脑本身是怎么做出来的。想知道 31B 凭什么扛得住这条链,从这篇看起。
站内相关
LiveKit 针对 Gemma 4 31B 进行优化,在实时语音方面比 GPT-4.1 快 5 倍、成本六分之一
同一颗模型、同样奔着实时语音去,LiveKit 走的是自己优化推理那条路,可以跟这条四段接力的管线对照着看。
背景

那几家的模型你带不走,这套你能

要看懂这套东西的价值,得先分清它跟豆包、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 那套实时语音协议。按那套协议写好的应用,把地址换成自己这台服务器就接过来了。

把客户端的实时语音地址从官方端点改成自建服务器
同一份客户端代码,只把地址换成自己那台服务器,对话照常。来源 huggingface/speech-to-speech 仓库文档
豆包 / GPT-Live / Gemini Live这一套
架构端到端,声音直接进出四道工序接力
能边听边说吗能,全双工不能,半双工;支持你插嘴打断
听得到语气吗听得到,直接处理声音听不到,第二道就转成纯文字了
跑在哪对方的服务器四道里三道默认在本机,第四道也能拉回来
模型能不能换用对方的每一道都能换
中间的文字没有这一层转写、回复文本、工具调用都拿得到
许可按服务条款Apache 2.0
这么理解

像租房和买房。租的那套精装修、拎包入住、体验最顺,但墙不能砸,房东哪天涨价或者不租了你没办法。买的这套得自己装修,有些地方一时半会儿装不到人家那个水准,可钥匙在你手里,想怎么改怎么改,也没人能把你赶出去。

下面几节讲的就是它怎么补。

怎么补节奏

它靠抢跑来补上节奏差距

半双工那套一问一答的节奏,天生比不过边听边说。这条管线的对策是抢跑:不等你说完就开始想,赌你后面不会大改。下面三件事是一套连着的。

它干脆不等你说完就开始想

硬件把想答案这道压快之后,剩下的延迟大头挪到了一个不起眼的地方:判断你说完没有,本身就要花时间。

机器靠数静音判断你说完了。你一停,它开始数,数够了才敢动手。这段等待什么活都没干,纯粹在确认。可又不能数太短,太短的话你换口气它就抢答。

它的办法

把「确认」和「干活」叠着做。静音只要 64 毫秒它就当你说完了,识别和生成立刻开跑;算出的答案先憋在手里 1 秒不出口。这 1 秒留给你反悔:你接着说了,这版作废;你真说完了,1 秒一到答案早算好了,张嘴就念。

切一下下面两个标签,看时间花在哪。

你在说话
数静音,确认你说完了
这才开始识别
这才开始想答案
它开口

时间 →

等待和干活前后接力,两段时间加在一起。

你在说话
静音 64 毫秒就开跑
憋住 1 秒,留给你反悔
识别和生成在这 1 秒里跑完
它开口

时间 →

等待和干活重叠,所以能早开口。示意图,说明先后关系,不代表实测耗时。

它没把确认的时间省掉,是把干活的时间藏进了等待里。

这也解释了为什么非要配极快的硬件:答案必须在这 1 秒内算完,不然照样得等。思考一开就冲出预算,所以要关掉。

这么理解

像服务员看你合上菜单就往后厨走,但在传菜口先站一秒。这一秒你加菜他就回头重记;一秒过了没动静,单子递进去。菜比别家早上桌,靠的是他走那几步路的工夫已经把单记好了。

你补一句话,它把整段重新来过

抢跑最怕猜错还硬说下去。它的处理是整段推翻。

你在那 1 秒里又开口,这一版就作废。它不会接着你的后半句往下猜,而是把前面那段录音留着,跟你新说的拼成完整一句,从头重新转写、重新生成。所以答案质量不受影响,模型看到的始终是一整句话。

代价是每反悔一次就全量重跑一次。你说得断断续续连停四回,后台就白跑四轮。硬件便宜又快在这里格外重要。

还有个细节专门为续接让路:正常起一句新话要检测到 384 毫秒的语音才算数,免得咳嗽声触发;接着上一句往下说则只要 192 毫秒,门槛砍一半。它宁可把你的停顿当成还在说。

它一开口,这一轮就锁死了

能不能反悔,看的是一个动作而非一段时长:合成模块只要开始出声,这一轮立刻锁定,之后你再说什么都算新的一轮。锁定之前最长能在 7 秒内反复重开,够你想词、换气、说半句停下来补一句。

它已经在说了你插嘴,它立刻闭嘴

上一节说的是它还没开口时的反悔。这一节是它正在说话,你直接打断。

难点在于你插嘴那一瞬间,四个线程里到处都是半成品:模型还在吐字,合成还在切音频块,发送循环还在往你耳朵里推。一个个去追杀既慢又容易漏。

它的办法

给每块产物盖一个批次号。取消的时候不追杀,只把计数器加一,旧批次全部自动失效。各线程生成下一个字之前看一眼自己的批次号还是不是最新的,不是就收工。互相之间不用打听谁先谁后,只认号。

这么理解

像换门锁。不用把发出去的旧钥匙一把把收回来,锁一换,旧钥匙自己就不好使了。

①
第 7 版
它正在说话,合成模块把第 7 版的音频一块块往外推。
②
第 7 版
你开口插嘴,检测模块报告有人说话了。
③
第 8 版
计数器加一。这一步之后,第 7 版的一切都过期了。
④
第 8 版
清空队列,但留下你这边的东西:你刚说那句的转写、语音结束标记都保留,那是你的输入,不能跟着扔。
⑤
第 7 版
模型和合成各自看了眼批次号,发现自己还停在第 7 版,当场收工。
⑥
第 8 版
第 8 版一路放行,接着回答你新说的这句。

打断也能关掉。关上之后你说话照样被转写,但它不停,会把手上这段说完。电话客服的固定播报、机器人念安全提示,这类场景用得上。

它能干什么

装起来之后,它能做这些事

边说边出字

你还在说,转写就一段段往外送。

随时打断

它说到一半你开口,立刻闭嘴听你的。

能看东西

Gemma 4 31B 能读图。摄像头是当成一个工具接进去的,它要看的时候客户端把当前那一帧送回去。

会调工具

支持函数调用。机器人那边的跳舞、转头、停下就是这么接的。

语言自动切

按每句话检测语种再转给模型,中途换语言不用改设置。

声音能换

自带多个音色,换个可选后端还能拿一段参考音克隆声音。

自己跑

装一套要三条命令

先起服务,再从另一个终端连上去说话。

装好并起一个实时语音服务
pip install speech-to-speech
export OPENAI_API_KEY=...
speech-to-speech

这里要 OpenAI 的 key,是因为不给参数时中间那道默认接的是 OpenAI 的 gpt-5.4-mini。换成这次的主角,把模型名和地址指过去就行。

换成 Cerebras 上的 Gemma 4 31B,并关掉思考以压低延迟
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,另一个终端把管线指过去。

全本地跑: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] 再配对应参数。

让它听懂中文(仅限苹果自研芯片的 Mac,这条同时换掉了中间那道)
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 会员和几个指定组织的成员不限;自己在本机跑不计量。

🧰 上手卡 · HF Realtime Voice(speech-to-speech)
价格在线版免费,按世界标准时间每天重置:不登录 5 分钟,登录普通用户 10 分钟,PRO 会员和指定组织成员不限;本地自己跑不计量
门槛网页版打开授权麦克风就能说;本地部署一行 pip 装完,接托管模型需要自备 API key
四条仓库原样给出的命令,从一行装好到接 Cerebras、到全本地跑、到改成听中文,复制就能用。
来源
Hugging Face and Cerebras bring Gemma 4 to real-time voice AIAmir Mahla、Andres Marafioti、Leandro von Werra、Saurabh Vyas·Hugging Face 博客·2026-07-01
本站说明
抢跑与作废机制、批次号打断、各项毫秒阈值、四道工序的可换清单、免费额度分档、以及全部边界条目,均取自 huggingface/speech-to-speech 仓库的源码与文档,发布博客里没有这些;Gemma 4 31B 规格取自模型卡;1851 字每秒、35 倍取自 Cerebras 官方博客。两张时序对比图为说明先后关系的示意,不代表实测耗时;对比条里「典型 GPU 端点约 53」为按 35 倍反推的示意值。「答案必须在那 1 秒内算完」是依据代码中生成结果需等待宽限期才可提交这一行为做出的推演。