パイプラインとワークフロー
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: 完全な音声トランスクリプトがあり、その結果だけを生成したい場合に使用します。これは、話者の発話終了を検出する必要がないケース(たとえば、事前録音の音声や、ユーザーの発話終了が明確な push-to-talk のアプリ)で有用です。StreamedAudioInput: ユーザーの発話終了を検出する必要がある場合に使用します。検出した音声チャンクを順次プッシュでき、音声パイプラインが「アクティビティ検出」(activity detection) により適切なタイミングでエージェントのワークフローを自動実行します。
結果
音声パイプラインの実行結果は 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 は該当ターンの音声がすべて送出された後に発火します。これらのイベントを使って、モデルがターンを開始したときに話者のマイクをミュートし、そのターンに関連する音声をすべてフラッシュした後にミュートを解除する、といった制御ができます。