Google Gemini Live API 的最大卖点,不止是语音合成那么简单:它可以一边听你说话、一边即时回答,还可以让你随时打断,感觉就像真正的电话对话。Google 最近发布了一段详尽教学,将整个 live voice agent 拆解成 3 部分:Gemini Live 和传统 TTS 的差异、三层架构和一个 web socket 核心循环,以及让 agent「有生命」的 3 个关键概念。本文整理了这段教学的核心内容,附上 Google 官方提供的程序代码链接和文档,给有兴趣建立自家实时语音 AI agent 的开发者一个完整概览。
Gemini Live 和传统 TTS 的 3 大差异:audio-to-audio + 双向 + 即时串流
传统的 text-to-speech(TTS)系统运作很直接:你输入文字,它输出语音,一个方向的 pipeline。TTS 系统会说话,但听不到你,它根本不知道你在不在。
Gemini Live 走的是完全不同的方向:audio-to-audio,双向同时进行。它直接接收你的语音信号、检测语气、停顿、能量和你说话的方式,再即时生成并串流输出语音。
核心 3 大差异:
- 方向:TTS 是 text → audio 单向;Gemini Live 是 audio ↔ audio 双向
- 感知:TTS 不知道你在;Gemini Live 会听 tone、pause、energy 等语音线索
- 时序:TTS 等整个 response 先开始读;Gemini Live 边想边说,可以在生成答案的同时已经开始串流音讯
换句话说:“TTS reads, Live hears” — 传统 TTS 会读出来,Gemini Live 真的会听你说话。
3 层架构:浏览器 + 后端 + Gemini Live,配 WebSocket 连接
整个 live voice agent 的架构由 3 个部分组成:
- 浏览器:负责捕获你的麦克风音讯、播放 Gemini 的回应
- Gemini Live:live 语音模型本身
- 后端:保持与 Gemini 的长连接,作为浏览器和 Gemini 之间的音讯通道
浏览器和后端之间的通讯用 WebSocket,而不是一般的 HTTP request。原因是:一般 HTTP request 只能“问一次就断”,但 live voice 需要双向持续音讯流量,所以一定要用 WebSocket 维持长连接。
后端实际做着 2 个并行任务:
- 任务 A:将你的麦克风音讯持续串流上传到 Gemini
- 任务 B:接收 Gemini 的语音回应,再传回给浏览器播放
两个任务互相独立运行,所以 agent 说话的同时你也可以即时打断。
核心循环只有 4 步:Open → Send → Receive → Play
实际写代码的时候,整个对话就是 4 个步骤的循环:
- Open:开启与 Gemini Live 的 session
- Send:将浏览器捕获的麦克风音讯送到后端
- Receive:后端收到 Gemini 的语音回应,再传回去浏览器
- Play:浏览器即时播放 Gemini 的回应
Google 在教学中强调:“这个循环很简单 — Open、Send、Receive、Play,其他全部都是 plumbing(接驳细节)。”搞定这个循环,你已经有了一个可运作的 voice agent。
让 agent「有生命」的 3 个核心概念:VAD、Barge-in、Tools
搞定 4 步循环之后,技术上 agent 已经行得通,但与真正的对话经验还有很大距离。要让它感觉“活生生”,需要 3 个进阶概念。
概念 1:Voice Activity Detection(VAD),怎么知道你讲完?
VAD(Voice Activity Detection)是模型持续问自己的问题:现在是有人在说话,还是静音?这个判断让模型可以找到你的 turn 的起点和终点 — 即知道你什么时候开始说、什么时候停。
也正因为这样,你的麦克风需要在你没有说话的时候也持续串流音频到模型,因为模型需要那段“持续的 stream”去捕捉你开口的瞬间。
好消息是:Gemini Live 的 VAD 是内建的,你不需要自己写。
概念 2:Barge-in,可以打断 agent 说话
Barge-in 的意思是:你在 agent 说话的时候插嘴,agent 即时停。对讲机做不到这一点,但真正的人与人对话可以。
Gemini Live 内部就是用同一个 VAD 机制,去探测你是否“开始在 agent 上面抢话”。当探测到你打断,模型会立即停下自己,并发出一个“interrupted”信号回后端。
让打断感觉即时的关键技巧:
- 不要等 interrupted 信号跨越网络再停本地音讯
- 浏览器一旦从麦克风“听到”你开始说,就立即暂停现有的 agent 语音播放
- 等你的声音输入完了,再由模型的 interrupted 信号确认状态同步
这个“本地即停”的设计就是让打断感觉自然的秘密。
概念 3:Tools,给 agent 的实际技能
Gemini Live 模型本身只会说话 — 它没有能力播放音乐、跳过当前歌曲、按按钮。所以你要给它 tools — 一些 function call,每个 tool 都有自己的名、描述和代表一个 action。
教学中的示范 tool 例子:
- play_playlist:播放一个 playlist
- skip_current_track:跳过当前歌曲
- pause_music:暂停音乐
运作模式是:模型决定要用哪个 tool 之后,它不会单纯“说”要做什么,而是会直接 emit“用这个 tool + 这些 arguments”的指示,由你的后端代码执行之后再回报结果。
Google 特别强调一条 voice 限定的规则:“tool-latency rule”:“当 tool 执行的时候,模型是 waiting 的。”如果 tool 太久才 return,对话就会进入静音状态。所以你的音乐 tool 应该找到指令即 return,不要等整首歌播完再答。
总结 3 大概念一句讲完:VAD 捕捉你的 turn、Barge-in 让你打断、Tools 让 agent 可以做事。
小结:raw API vs Google ADK 的选择
这次教学的实作示范刻意用 raw GenAI SDK — 开发者可以看到每个部分(session、stream、audio loop、tools)的运作原理,完全没有 framework 隐藏。但就是要写更多 plumbing code。
Google 提到的下一集将会用的 Google ADK(Agent Development Kit),就是为了这类 voice agent 提供 framework:
- Agent、session、streaming loop 都由 framework 管理
- 内置 queue 维持 live call 流畅
- 开发者只需写 high-level 业务逻辑(tools、prompts)
如果你只是想快点试到 live voice agent,ADK 会是更易上手的选择;如果你想了解底下运作原理或者做大量定制,这次教学的 raw API 更加清晰。
官方完整资源
- Demo 程序代码:[g.dev/cloud/voicedemo1](https://g.dev/cloud/voicedemo1)
- Gemini Live API 文档:[g.dev/cloud/gemini-live](https://g.dev/cloud/gemini-live)
- Agent Development Kit 文档:[g.dev/cloud/adk-docs](https://g.dev/cloud/adk-docs)
- Google Cloud 路线图:[g.dev/cloud/mma-roadmap](https://g.dev/cloud/mma-roadmap)
- 下一集预告:用 Google ADK 重建同一个 voice agent app

