Skip to main content

概述

聊天界面主导了我们与 AI 的交互方式,但多模态 AI 的最新突破正在开启令人兴奋的新可能性。高质量的生成模型和富有表现力的文本转语音(TTS)系统现在使构建感觉不像工具、更像对话伙伴的智能体成为可能。 语音智能体就是其中一个例子。你可以使用口语与智能体交互,而不是依赖键盘和鼠标输入。这可以是一种更自然、更有吸引力的与 AI 交互的方式,在某些场景中特别有用。

什么是语音智能体?

语音智能体是能够与用户进行自然口语对话的智能体。这些智能体结合了语音识别、自然语言处理、生成式 AI 和文本转语音技术,创建无缝、自然的对话。 它们适用于多种用例,包括:
  • 客户支持
  • 个人助理
  • 免提界面
  • 培训和训练

语音智能体如何工作?

在高层次上,每个语音智能体需要处理三个任务:
  1. - 捕获音频并进行转录
  2. 思考 - 解释意图、推理、规划
  3. - 生成音频并将其流式传输回用户
区别在于这些步骤如何排序和耦合。在实践中,生产智能体遵循两种主要架构之一:

1. STT > 智能体 > TTS 架构(“三明治”架构)

三明治架构组合了三个独立的组件:语音转文本(STT)、基于文本的 LangChain 智能体和文本转语音(TTS)。 优点:
  • 完全控制每个组件(根据需要更换 STT/TTS 提供商)
  • 访问现代文本模态模型的最新能力
  • 透明的行为,组件之间有清晰的边界
缺点:
  • 需要编排多个服务
  • 管理管道的额外复杂性
  • 从语音到文本的转换会丢失信息(例如语气、情感)

2. 语音到语音架构(S2S)

语音到语音使用多模态模型,原生处理音频输入并生成音频输出。 优点:
  • 更简单的架构,更少的组件
  • 简单交互通常延迟更低
  • 直接音频处理捕获语调和其他语音细微差别
缺点:
  • 有限的模型选择,更大的提供商锁定风险
  • 功能可能落后于文本模态模型
  • 音频处理方式的透明度较低
  • 可控性和自定义选项减少
本指南演示三明治架构,以平衡性能、可控性和访问现代模型能力。三明治架构通过某些 STT 和 TTS 提供商可以实现低于 700 毫秒的延迟,同时保持对模块化组件的控制。

演示应用概述

我们将逐步构建一个使用三明治架构的基于语音的智能体。该智能体将为一家三明治店管理订单。应用程序将演示三明治架构的所有三个组件,使用 AssemblyAI 进行 STT,使用 Cartesia 进行 TTS(尽管可以为大多数提供商构建适配器)。 完整的端到端参考应用程序可在 voice-sandwich-demo 仓库中找到。我们将在这里逐步讲解该应用程序。 演示使用 WebSocket 进行浏览器和服务器之间的实时双向通信。相同的架构可以适配其他传输方式,如电话系统(Twilio、Vonage)或 WebRTC 连接。

架构

演示实现了一个流式管道,每个阶段异步处理数据: 客户端(浏览器)
  • 捕获麦克风音频并编码为 PCM
  • 建立到后端服务器的 WebSocket 连接
  • 实时将音频块流式传输到服务器
  • 接收并播放合成的语音音频
服务器(Python)
  • 接受来自客户端的 WebSocket 连接
  • 编排三步管道:
    • 语音转文本(STT):将音频转发到 STT 提供商(例如 AssemblyAI),接收转录事件
    • 智能体:使用 LangChain 智能体处理转录文本,流式输出响应 Token
    • 文本转语音(TTS):将智能体响应发送到 TTS 提供商(例如 Cartesia),接收音频块
  • 将合成的音频返回给客户端进行播放
管道使用异步生成器在每个阶段启用流式输出。这允许下游组件在上游阶段完成之前就开始处理,从而最小化端到端延迟。

设置

有关详细的安装说明和设置,请参阅仓库 README

1. 语音转文本

STT 阶段将传入的音频流转换为文本转录。实现使用生产者-消费者模式来并发处理音频流式传输和转录接收。

关键概念

生产者-消费者模式:音频块被发送到 STT 服务的同时接收转录事件。这允许在所有音频到达之前就开始转录。 事件类型
  • stt_chunk:STT 服务处理音频时提供的部分转录
  • stt_output:触发智能体处理的最终、格式化的转录
WebSocket 连接:维护与 AssemblyAI 实时 STT API 的持久连接,配置为 16kHz PCM 音频和自动轮次格式化。

实现

该应用程序实现了一个 AssemblyAI 客户端来管理 WebSocket 连接和消息解析。请参见下面的实现;类似的适配器可以为其他 STT 提供商构建。

2. LangChain 智能体

智能体阶段通过 LangChain 智能体处理文本转录并流式输出响应 Token。在本例中,我们流式输出智能体生成的所有文本内容块

关键概念

流式响应:智能体使用 stream_mode="messages" 在生成响应 Token 时立即发出,而不是等待完整响应。这使 TTS 阶段能够立即开始合成。 对话记忆检查点使用唯一的线程 ID 在轮次之间维护对话状态。这允许智能体在对话中引用先前的交流。

实现

3. 文本转语音

TTS 阶段将智能体响应文本合成为音频并流式传输回客户端。与 STT 阶段一样,它使用生产者-消费者模式来并发处理文本发送和音频接收。

关键概念

并发处理:实现合并了两个异步流:
  • 上游处理:传递所有事件并将智能体文本块发送到 TTS 提供商
  • 音频接收:从 TTS 提供商接收合成的音频块
流式 TTS:一些提供商(如 Cartesia)在收到文本后立即开始合成音频,使音频播放能在智能体完成生成完整响应之前就开始。 事件透传:所有上游事件不变地流过,允许客户端或其他观察者跟踪完整的管道状态。

实现

该应用程序实现了一个 Cartesia 客户端来管理 WebSocket 连接和音频流式传输。请参见下面的实现;类似的适配器可以为其他 TTS 提供商构建。

LangSmith

你使用 LangChain 构建的许多应用程序将包含多个步骤和多次 LLM 调用。随着这些应用程序变得更加复杂,能够检查链或智能体内部究竟发生了什么变得至关重要。最好的方法是使用 LangSmith 在上面的链接注册后,确保设置环境变量以开始记录追踪:
或者在 Python 中设置:

整合

完整的管道将三个阶段链接在一起:
我们使用 RunnableGenerator 来组合管道的每个步骤。这是 LangChain 内部用来管理跨组件流式输出的抽象。 每个阶段独立且并发地处理事件:音频一到达就开始转录,转录一可用智能体就开始推理,智能体文本一生成语音合成就开始。这种架构可以实现低于 700 毫秒的延迟来支持自然对话。 有关使用 LangChain 构建智能体的更多信息,请参阅智能体指南