音声エージェントを使うと、ユーザーはアプリケーションに話しかけて質問したり、タスクを完了したりできます。設計上の重要な選択は、音声を推論やツールにどうつなぐかです。独立したバックエンドを使いながら会話を継続する方式、単一の音声モデルを使う方式、各段階を個別に制御するパイプライン方式があります。
適切なアーキテクチャの選択
| アーキテクチャ | 最適な用途 | 選ぶ理由 |
|---|---|---|
| GPT-Live | 独立したバックエンドを使う全二重の会話 | 既存のテキストワークフローを維持し、バックエンドを独立して選択でき、会話も継続できます。 |
| Realtime API | 単一セッションでの音声処理、推論、ツールの使用 | 単一のモデルで音声を解釈し、実行する内容を判断して、音声で応答します。 |
| チェーン型音声パイプライン | 音声とテキストの各処理段階の制御 | 中間段階のテキストを確認・変換し、各コンポーネントを個別に置き換えられます。 |
全二重の音声エージェントの構築
GPT-Live は、聞くことと話すことを同時に行えます。この機能を全二重と呼びます。ライブモデルが音声でのやり取りを処理し、推論とツールの使用を独立したバックエンドに委任します。バックエンドの処理中も、ユーザーは話し続けられます。
ビジネスロジックやツールを含む既存のテキストワークフローを維持したまま、GPT-Live を音声インターフェースとして追加できます。バックエンドの処理を実行し、その会話コンテキストを提供する主体は、委任モードによって決まります。
- クライアント委任:任意のバックエンドモデルとプロバイダーを使って、独自のエージェントやワークフローを接続します。アプリケーションが処理を実行し、結果を GPT-Live に返します。
- Responses 委任:バックエンドでの推論とツールの使用に、OpenAI がホストする Responses モデルを選択します。GPT-Live が会話コンテキストを提供し、そのモデルの呼び出しを管理します。カスタム関数の実行は、引き続きアプリケーションが担当します。
どちらのモードでも、権限と業務記録はアプリケーションが管理します。話し方に関する指示はライブモデルのプロンプトに、ビジネスルールはバックエンドのプロンプトに記述します。
まずは「GPT-Live 入門」をご覧ください。バックエンドのセットアップについては「委任とツール」、話し方については「音声モデルのプロンプト」を参照してください。
音声変換方式の音声エージェントの構築
Realtime API では、RealtimeAgent と RealtimeSession を使って、ブラウザでの利用を中心とした実装を始められます。セッションは、音声のターン、ツール、割り込み、ハンドオフを処理します。完全なスターターは、現在「Realtime API 入門」に掲載されています。
チェーン型音声ワークフローの構築
音声認識、エージェント、音声生成の間でテキストを確認・変換したい場合は、チェーン型の方式を使います。アプリケーションは次の 3 段階を管理します。
- 音声からテキストへの変換
- エージェントのワークフロー自体
- テキストから音声への変換
import asyncio
import numpy as np
from agents import Agent, function_tool
from agents.voice import AudioInput, SingleAgentVoiceWorkflow, VoicePipeline
@function_tool
def get_weather(city: str) -> str:
"""Get the weather for a given city."""
return f"The weather in {city} is sunny."
agent = Agent(
name="Assistant",
instructions="You are a helpful voice assistant.",
model="gpt-6-astra",
tools=[get_weather],
)
async def main() -> None:
pipeline = VoicePipeline(workflow=SingleAgentVoiceWorkflow(agent))
audio_input = AudioInput(buffer=np.zeros(24000 * 3, dtype=np.int16))
result = await pipeline.run(audio_input)
async for event in result.stream():
if event.type == "voice_stream_event_audio":
print("Received audio bytes", len(event.data))
if __name__ == "__main__":
asyncio.run(main())各段階を確認できるようにしたい場合や、置き換え可能にしたい場合は、この方式を使います。たとえば、文字起こし結果を保存し、テキストエージェントが応答する前にポリシーチェックを実行し、内部システムを呼び出してから、ワークフローが承認済みの回答に到達した後にのみ音声を生成する、といった構成が可能です。
音声エージェントの評価
会話の品質とタスクの成果は分けてテストします。応答が自然に聞こえても、ツールが実行されたことや、アプリケーションの状態が変わったことの証明にはなりません。
- 期待される結果、ツール呼び出し、権限を定めた代表的なシナリオを選びます。
- 各結果の検証に必要な音声、イベント、ツールの結果、アプリケーションの状態を保存します。評価の実行自体が失敗した場合と、評価は正常に実行されたもののエージェントがタスクに失敗した場合を区別します。
- シナリオを繰り返し実行し、タスクの完了状況、応答音声が聞こえるまでの遅延、割り込み、意図しない無音を比較します。変更を比較するときは、通話者、モデルの構成、ツール、トランスポートの条件を揃えます。
GPT-Live では、次の項目を個別に測定します。
- タスクとツールの結果:意図が保持されているか、委任された処理、ツールの引数、権限、アプリケーションの最終状態を確認します。音声による完了報告が、実際に完了したアクションと一致していることを検証します。
- 会話のタイミング:応答音声が聞こえるタイミング、意図しない無音、発話の重なり、割り込みに対して発話を譲る挙動を測定します。バックエンドの処理中に訂正が入る場合も含めます。
- 音声と言語:アクセント、背景雑音、言語の切り替え、名前、数値など、さまざまな条件で入力の認識をテストします。出力音声の聞き取りやすさと言語の選択は、認識とは別に評価します。
- セッションの信頼性:接続の失敗、音声の欠落、タイムアウト、未完了のセッションを、タスクのスコアとは別に追跡します。
初歩・発展・実践の段階を踏んで、複雑さを増やします。
- 初歩:条件を制御した単一ターンのリクエストに、合成音声を使います。再現性のある比較ができるよう、生成した音声、アプリケーションのコンテキスト、期待される結果を固定します。
- 発展:人が話した単一ターンのリクエストの代表的な録音を再生し、声、マイク、間の取り方、音響条件が挙動にどう影響するかをテストします。
- 実践:独立した通話者シミュレーターを使い、複数ターンにわたる継続的な会話を行います。会話とバックエンドの処理が並行して進む状況で、確認のやり取り、要件の変更、割り込み、復旧をテストします。
自動採点に加えて人が音声を聞き、発音、自然さ、会話のテンポが適切に感じられるかを評価します。
GPT-Live の評価ハーネスについては、音声エージェント評価の Cookbook を参照してください。
Realtime の評価ハーネスと具体例については、OpenAI Cookbook の Realtime 評価ガイドを参照してください。実行可能な評価レシピは Cookbook に掲載し、このページでは共通のテストチェックリストを提供します。
レイテンシの測定
レイテンシの指標ごとに、観測する開始イベントと終了イベントを定義します。最初の応答音声が聞こえるまでの時間、委任までの時間、割り込みに応じて発話を譲るまでの時間、バックエンドの処理完了までの時間、タスクの完了を検証するまでの時間は、それぞれ異なる区間を測定します。単一の単調増加する時間軸を使い、測定対象の母集団、中央値、テールレイテンシを報告します。エンドツーエンドの応答時間を、バックエンドのみの処理時間で代用しないでください。
フロントエンドのモデルを比較するときは、通話者、録音、バックエンドモデル、プロンプト、トランスポート、音声の送信間隔、採点器を固定します。
GPT-Live では、委任の受信、バックエンドリクエストの開始、最初の有用な結果、ツールの開始と終了、結果の送信、音声の到着、クライアントでの再生など、アプリケーションで観測できる段階を記録します。クライアント委任では、アプリケーションがバックエンドリクエストを直接観測できます。Responses 委任では、ネストされたレスポンスイベントと、アプリケーションが実行するカスタムツールを観測できます。
各区間の時間から、接続の確立、モデルの処理、ツール、アプリケーションのバッファリング、再生のどこで遅延が発生しているかを特定します。最初の有用な音声回答は、「確認しています」のような応答とは分けて測定します。こうした応答が早くなっても、求められた結果が早く届いたことにはなりません。
一度に変更する要因は 1 つにして、同じシナリオを繰り返します。 有用な音声応答までの時間の中央値とテールレイテンシを、タスクの成功、ツールの正確性、 割り込みと併せて比較します。実装の指針については、バックエンドのレイテンシの削減 を参照してください。
音声エージェントでも共通の基本構成要素
音声を使うと、通信方式と音声処理のループは変わりますが、ワークフローの基本的な設計判断は同じです。
- 音声エージェントに外部の機能が必要な場合は、ツールの使用を参照してください。
- 音声ワークフローにストリーミング、処理の継続、状態の永続化が必要な場合は、エージェントの実行を参照してください。
- 音声ワークフローが専門分野別のエージェントに分岐する場合は、オーケストレーションとハンドオフを参照してください。
- 音声ワークフローに安全性チェックや承認が必要な場合は、ガードレールと人によるレビューを参照してください。
- MCP を利用した機能が必要な場合や、音声ワークフローの動作を詳しく確認したい場合は、連携と可観測性を参照してください。
実践上の原則は、まず音声のアーキテクチャを選び、その後、エージェントの残りのワークフローをテキストの場合と同じように設計することです。
次のステップ
ユースケースに合ったリアルタイムまたは音声のガイドを選びます。
Realtime セッションのライフサイクルとイベントモデルを扱います。
ブラウザやモバイルの音声を Realtime セッションに直接接続します。
推論、前置きの発話、ツール、エンティティの取得、音声の振る舞いを調整します。