概览
聊天界面一直主导着与 AI 的交互方式,但多模态 AI 的最新突破正在开启令人兴奋的新可能。高质量生成模型和富有表现力的 text-to-speech(TTS)系统,现在让构建更像对话伙伴而不是工具的代理成为可能。 语音代理就是一个例子。你不必依赖键盘和鼠标向代理输入内容,而是可以用口语与其交互。这是一种更自然、更有吸引力的 AI 交互方式,在某些场景中尤其有用。什么是语音代理?
语音代理是能够与用户进行自然语音对话的 agents。这些代理结合语音识别、自然语言处理、生成式 AI 和 text-to-speech 技术,创建顺畅自然的对话。 它们适用于多种用例,包括:- 客户支持
- 个人助手
- 免手动界面
- 指导和培训
语音代理如何工作?
从高层来看,每个语音代理都需要处理三项任务:- 听:捕获音频并转写
- 思考:解释意图、推理、规划
- 说:生成音频并将其流式传回用户
1. STT > Agent > TTS 架构(“三明治”)
三明治架构由三个不同组件组成:speech-to-text(STT)、基于文本的 LangChain agent,以及 text-to-speech(TTS)。 优点:- 完全控制每个组件(可按需替换 STT/TTS providers)
- 访问现代文本模态模型的最新能力
- 组件边界清晰,行为透明
- 需要编排多个服务
- 管理管线时有额外复杂度
- 从语音转换为文本会丢失信息(例如语调、情绪)
2. Speech-to-Speech 架构(S2S)
Speech-to-speech 使用一个原生处理音频输入并生成音频输出的多模态模型。 优点:- 架构更简单,移动部件更少
- 对简单交互而言通常延迟更低
- 直接音频处理可以捕获语调和其他语音细微差别
- 模型选择有限,provider lock-in 风险更高
- 功能可能落后于文本模态模型
- 音频处理方式透明度较低
- 可控性和自定义选项减少
演示应用概览
下面将使用三明治架构构建一个基于语音的代理。该代理会管理三明治店订单。应用会演示三明治架构的全部三个组件,使用 AssemblyAI 进行 STT,并使用 Cartesia 进行 TTS(不过也可以为大多数 providers 构建 adapters)。 端到端参考应用可在 voice-sandwich-demo 仓库中找到。这里将走查该应用。 演示使用 WebSockets 在浏览器和服务器之间进行实时双向通信。同一架构也可以适配其他传输方式,例如电话系统(Twilio、Vonage)或 WebRTC 连接。Architecture
演示实现了一个流式管线,每个阶段都会异步处理数据: 客户端(浏览器)- 捕获麦克风音频并编码为 PCM
- 建立到后端服务器的 WebSocket 连接
- 将音频 chunks 实时流式传输到服务器
- 接收并播放合成语音音频
- 接收来自客户端的 WebSocket 连接
-
编排三步管线:
- Speech-to-text (STT):将音频转发给 STT provider(例如 AssemblyAI),接收 transcript events
- Agent:用 LangChain agent 处理 transcripts,并流式传输响应 tokens
- Text-to-speech (TTS):将代理响应发送给 TTS provider(例如 Cartesia),接收音频 chunks
- 将合成音频返回给客户端播放
设置
详细安装和设置说明请参阅 repository README。1. Speech-to-text
STT 阶段会将传入音频流转换为文本 transcripts。该实现使用 producer-consumer pattern 并发处理音频流式传输和 transcript 接收。核心概念
Producer-Consumer Pattern:音频 chunks 会在接收 transcript events 的同时发送给 STT 服务。这使转写可以在所有音频到达前开始。 事件类型:stt_chunk:STT 服务处理音频时提供的部分 transcriptsstt_output:触发代理处理的最终格式化 transcripts
实现
AssemblyAI Client
AssemblyAI Client
2. LangChain agent
代理阶段会通过 LangChain agent 处理文本 transcripts,并流式传输响应 tokens。在本例中,会流式传输代理生成的所有 text content blocks。核心概念
流式响应:代理使用stream_mode="messages" 在响应 tokens 生成时发出它们,而不是等待完整响应。这让 TTS 阶段可以立即开始合成。
对话记忆:使用唯一 thread ID,checkpointer 会跨轮次维护对话状态。这让代理可以引用对话中的先前交流。
实现
3. Text-to-speech
TTS 阶段会将代理响应文本合成为音频,并将其流式传回客户端。与 STT 阶段一样,它使用 producer-consumer pattern 并发处理文本发送和音频接收。核心概念
并发处理:该实现会合并两个异步流:- 上游处理:透传所有事件,并将代理文本 chunks 发送给 TTS provider
- 音频接收:从 TTS provider 接收合成音频 chunks
实现
Cartesia Client
Cartesia Client
LangSmith
你使用 LangChain 构建的许多应用会包含多个步骤,并多次调用 LLM。随着这些应用越来越复杂,能够检查链或代理内部究竟发生了什么会变得至关重要。最好的方式是使用 LangSmith。 在上方链接注册后,请设置环境变量以开始记录 traces:组合所有部分
完整管线会将三个阶段串联起来:Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

