跳转至

管道与工作流

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 会在相应话轮的所有音频发送完毕后触发。你可以利用这些事件,在模型开始一个话轮时将说话者的麦克风静音,并在一个话轮的所有相关音频处理完毕后取消静音。