管道与工作流
VoicePipeline
类可轻松将智能体工作流转变为语音应用程序。你传入要运行的工作流,该管道负责转录输入音频、检测音频何时结束、在合适的时间调用你的工作流,并将工作流输出转换回音频。
graph LR
%% 输入
A["🎤 音频输入"]
%% 语音管道
subgraph Voice_Pipeline [语音管道]
direction TB
B["转录(语音转文本)"]
C["你的代码"]:::highlight
D["文本转语音"]
B --> C --> D
end
%% 输出
E["🎧 音频输出"]
%% 流程
A --> Voice_Pipeline
Voice_Pipeline --> E
%% 自定义样式
classDef highlight fill:#ffcc66,stroke:#333,stroke-width:1px,font-weight:700;
配置管道
创建管道时,可以设置以下几项内容:
1. workflow
,每次转录新音频时运行的代码。
2. 使用的语音转文本
和文本转语音
模型。
3. config
,可用于配置以下内容:
- 模型提供程序,可将模型名称映射到模型。
- 追踪,包括是否禁用追踪、是否上传音频文件、工作流名称、追踪 ID 等。
- TTS 和 STT 模型的设置,如使用的提示词、语言和数据类型。
运行管道
你可以通过 run()
方法运行管道,该方法允许你以两种形式传入音频输入:
1. 当你有完整的音频转录文本,并且只想为其生成结果时,使用AudioInput
。在不需要检测说话者何时结束发言的情况下,这很有用;例如,当你有预先录制的音频,或者在用户结束发言很明确的一键通应用程序中。
2. 当你可能需要检测用户何时结束发言时,使用StreamedAudioInput
。它允许你在检测到音频块时推送它们,语音管道将通过一个称为“活动检测”的过程,在合适的时间自动运行智能体工作流程。
结果
语音管道运行的结果是一个StreamedAudioResult
。这是一个对象,允许你在事件发生时进行流式传输。有几种VoiceStreamEvent
,包括:
1. VoiceStreamEventAudio
,其中包含一段音频。
2. VoiceStreamEventLifecycle
,它会通知你诸如一轮对话开始或结束之类的生命周期事件。
3. VoiceStreamEventError
,这是一个错误事件。
result = await pipeline.run(input)
async for event in result.stream():
if event.type == "voice_stream_event_audio":
# 播放音频
elif event.type == "voice_stream_event_lifecycle":
# 生命周期
elif event.type == "voice_stream_event_error":
# 错误
...
最佳实践
中断
目前,Agents SDK 对 StreamedAudioInput
不提供任何内置的中断支持。相反,对于每次检测到的话轮,它都会触发你的工作流程的单独运行。如果你想在应用程序内处理中断,可以监听 VoiceStreamEventLifecycle
事件。turn_started
表示新的话轮已转录完成,处理即将开始。turn_ended
会在相应话轮的所有音频发送完毕后触发。你可以利用这些事件,在模型开始一个话轮时将说话者的麦克风静音,并在一个话轮的所有相关音频处理完毕后取消静音。