跳至内容

管道与工作流

VoicePipeline 是一个类,可以轻松将您的智能体工作流转换为语音应用。您传入要运行的工作流,该管道会负责转录输入音频、检测音频何时结束、在正确时机调用您的工作流,并将工作流输出重新转换为音频。

graph LR
    %% Input
    A["🎤 Audio Input"]

    %% Voice Pipeline
    subgraph Voice_Pipeline [Voice Pipeline]
        direction TB
        B["Transcribe (speech-to-text)"]
        C["Your Code"]:::highlight
        D["Text-to-speech"]
        B --> C --> D
    end

    %% Output
    E["🎧 Audio Output"]

    %% Flow
    A --> Voice_Pipeline
    Voice_Pipeline --> E

    %% Custom styling
    classDef highlight fill:#ffcc66,stroke:#333,stroke-width:1px,font-weight:700;

配置管道

创建管道时,您可以设置以下几项:

  1. workflow,即每次转录新音频时运行的代码。
  2. 使用的speech-to-texttext-to-speech模型
  3. The config, which lets you configure things like:
    • 模型提供者,可以将模型名称映射到模型
    • 追踪功能,包括是否禁用追踪、是否上传音频文件、工作流名称、追踪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":
        # play audio
    elif event.type == "voice_stream_event_lifecycle":
        # lifecycle
    elif event.type == "voice_stream_event_error"
        # error
    ...

最佳实践

中断

Agents SDK目前不支持对StreamedAudioInput的任何内置中断功能。相反,对于每个检测到的对话轮次,它都会触发您工作流的单独运行。如果您想在应用程序内部处理中断,可以监听VoiceStreamEventLifecycle事件。turn_started表示新的对话轮次已被转录且处理即将开始。turn_ended会在所有音频针对相应轮次分发完毕后触发。您可以使用这些事件在模型开始对话轮次时静音扬声器的麦克风,并在处理完该轮次所有相关音频后取消静音。