パイプラインとワークフロー
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
は該当ターンの音声がすべて送出された後にトリガーされます。モデルがターンを開始したときに話者のマイクをミュートし、ターンに関連する音声をすべてフラッシュした後にミュート解除する、といった制御にこれらのイベントを利用できます。