パイプラインとワークフロー
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;
パイプラインの設定
パイプラインを作成する際、次の項目を設定できます:
- 新しい音声が文字起こしされるたびに実行されるコードである
workflow - 使用する
speech-to-textとtext-to-speechの各モデル - 次のような事項を設定できる
config- モデル名をモデルにマッピングできるモデルプロバイダー
- トレーシング(トレーシングを無効化するか、音声ファイルをアップロードするか、ワークフロー名、トレース ID など)
- TTS および STT モデルの設定(プロンプト、言語、使用するデータ型 など)
パイプラインの実行
パイプラインは run() メソッドで実行でき、音声入力を次の 2 つの形式で渡せます:
AudioInputは、完全な音声をすでに文字起こし済みで、その結果に対して出力を生成したい場合に使います。これは、話者が話し終えたタイミングを検知する必要がないケース、たとえば事前録音の音声や、ユーザーが話し終えるタイミングが明確なプッシュ・トゥ・トークのアプリで有用です。StreamedAudioInputは、ユーザーが話し終えたタイミングの検知が必要な場合に使います。検出された音声チャンクを逐次プッシュでき、音声パイプラインは「アクティビティ検出」によって適切なタイミングで自動的にエージェントのワークフローを実行します。
結果
音声パイプラインの実行結果は StreamedAudioResult です。これは、発生するイベントを逐次ストリーミングできるオブジェクトです。いくつかの種類の VoiceStreamEvent があり、次を含みます:
- 音声チャンクを含む
VoiceStreamEventAudio - ターンの開始や終了などのライフサイクルイベントを通知する
VoiceStreamEventLifecycle - エラーイベントである
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 は該当ターンのすべての音声が送出された後に発火します。モデルがターンを開始したら話者のマイクをミュートし、そのターンに関連する音声をすべて出力し終えたらミュートを解除する、といった制御にこれらのイベントを利用できます。