概览
聊天界面一直是我们与 AI 交互的主要方式,但多模态 AI 的最新突破正在开辟令人兴奋的新可能性。高质量的生成模型和富有表现力的文本转语音(TTS)系统,使构建感觉不像工具、而更像对话伙伴的代理成为可能。 语音代理就是一个典型例子。你无需通过键盘和鼠标向代理输入文字,而是可以通过语言与其交互。这种方式更自然、更具吸引力,在某些特定场景中尤为实用。什么是语音代理?
语音代理是能够与用户进行自然语音对话的代理。这类代理融合了语音识别、自然语言处理、生成式 AI 和文本转语音技术,打造流畅自然的对话体验。 适用的场景包括:- 客户支持
- 个人助理
- 免手持交互界面
- 辅导与培训
语音代理如何工作?
从宏观角度看,每个语音代理都需要处理三项任务:- 聆听 - 捕获音频并转录
- 思考 - 理解意图、推理、规划
- 说话 - 生成音频并流式传回用户
1. STT > 代理 > TTS 架构(“三明治”架构)
三明治架构由三个独立组件组成:语音转文本(STT)、基于文本的 LangChain 代理,以及文本转语音(TTS)。 优点:- 对每个组件拥有完全控制权(可按需更换 STT/TTS 提供商)
- 可利用现代文本模态模型的最新能力
- 组件边界清晰,行为透明
- 需要协调多个服务
- 管理流水线增加了额外复杂度
- 语音转文字过程中会丢失部分信息(如语气、情绪)
2. 语音到语音架构(S2S)
语音到语音架构使用一个多模态模型,原生处理音频输入并生成音频输出。 优点:- 架构更简单,组成部件更少
- 对于简单交互,延迟通常更低
- 直接处理音频,能捕捉语气等语音细微特征
- 可选模型有限,提供商锁定风险较高
- 功能可能落后于文本模态模型
- 音频处理过程透明度较低
- 可控性和自定义选项有限
示例应用概览
我们将演示如何使用三明治架构构建一个基于语音的代理。该代理将管理一家三明治店的订单。应用将展示三明治架构的所有三个组件,使用 AssemblyAI 进行 STT,使用 Cartesia 进行 TTS(也可以为大多数提供商构建适配器)。 完整的端到端参考应用可在 voice-sandwich-demo 仓库中找到,我们将在本文中逐步讲解。 该 Demo 使用 WebSocket 实现浏览器与服务器之间的实时双向通信。同样的架构可适配其他传输协议,如电话系统(Twilio、Vonage)或 WebRTC 连接。架构
该 Demo 实现了一个流式处理流水线,每个阶段异步处理数据: 客户端(浏览器)- 捕获麦克风音频并编码为 PCM 格式
- 与后端服务器建立 WebSocket 连接
- 实时将音频块流式传输到服务器
- 接收并播放合成的语音音频
- 接受来自客户端的 WebSocket 连接
-
协调三步流水线:
- 语音转文字(STT):将音频转发给 STT 提供商(如 AssemblyAI),接收转录事件
- 代理:通过 LangChain 代理处理转录文本,流式传输响应 token
- 文本转语音(TTS):将代理响应发送给 TTS 提供商(如 Cartesia),接收音频块
- 将合成音频返回客户端播放
准备工作
详细的安装说明和配置,请参阅仓库 README。1. 语音转文字
STT 阶段将传入的音频流转换为文本转录。该实现使用生产者-消费者模式并发处理音频流式传输和转录接收。关键概念
生产者-消费者模式:音频块的发送与转录事件的接收并发进行,允许在所有音频到达之前就开始转录。 事件类型:stt_chunk:STT 服务处理音频时提供的部分转录stt_output:触发代理处理的最终格式化转录
实现
AssemblyAI 客户端
AssemblyAI 客户端
2. LangChain 代理
代理阶段通过 LangChain 代理处理文本转录并流式传输响应 token。在本例中,我们流式传输代理生成的所有文本内容块。关键概念
流式响应:代理使用stream_mode="messages" 在生成时即时发出响应 token,而非等待完整响应。这使 TTS 阶段可以立即开始合成。
对话记忆:检查点通过唯一线程 ID 跨轮次维护对话状态,允许代理在对话中引用先前的交流内容。
实现
3. 文本转语音
TTS 阶段将代理响应文本合成为音频并流式传回客户端。与 STT 阶段类似,它使用生产者-消费者模式并发处理文本发送和音频接收。关键概念
并发处理:该实现合并了两个异步流:- 上游处理:传递所有事件并将代理文本块发送给 TTS 提供商
- 音频接收:从 TTS 提供商接收合成的音频块
实现
Cartesia 客户端
Cartesia 客户端
LangSmith
使用 LangChain 构建的许多应用会包含多个步骤和多次 LLM 调用。随着应用变得越来越复杂,能够检查链或代理内部究竟发生了什么变得至关重要。最好的方式是使用 LangSmith。 在上方链接注册后,设置以下环境变量以开始记录追踪:整合在一起
完整流水线将三个阶段链式组合:通过 MCP 将这些文档连接到 Claude、VSCode 等以获取实时解答。

