跳过内容

流程和工作流

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-text 和 文本转语音的 text-to-speech 模型
  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":
        # 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 将在为相应轮次调度所有音频后触发。你可以使用这些事件来在模型开始轮次时静音说话者的麦克风,并在你刷新所有相关音频后将其取消静音。