Skip to main content
これはインタラクティブなノートブックです。ローカルで実行するか、以下のリンクを使用してください。
このノートブックでは、Weave を使用して、OpenAI のオーディオ API で生成したオーディオをログし、トレースする方法を紹介します。これにより、プロンプト、オーディオ出力、トランスクリプトを、LLM アプリケーションの他のデータとあわせて確認できます。このノートブックは、OpenAI のオーディオモデルを使ってすでに開発を行っており、オーディオのトレースに可観測性を取り入れたい開発者を対象としています。 ノートブックではまず、OpenAI のチャット補完 API と GPT 4o Audio Preview を使用してテキストプロンプトに対するオーディオ応答を生成し、それらを Weave でトラッキングします。 GPT 4o Audio Preview とのインテグレーションおよびオーディオ応答生成ワークフローを備えた OpenAI チャット補完 API のインターフェース 高度なユースケースでは、OpenAI Realtime API を使用してオーディオをリアルタイムでストリーミングし、Weave がライブ会話の双方をどのように取得するかを確認します。以下のサムネイルをクリックすると、動画デモを視聴できます。 Weave Realtime オーディオデモの動画サムネイル

セットアップ

このセクションでは、Python パッケージのインストール、API の認証情報の読み込み、およびチャット補完の例で使用するライブラリのインポートを行います。 まず、OpenAI (openai) と Weave (weave) の依存関係に加えて、APIキー管理用の依存関係 set-env をインストールします。
次に、OpenAI と Weave に必要な APIキーを読み込みます。この例では set_env を使用します。set_env は Google Colab のシークレットキーマネージャーに対応しており、Colab 固有の google.colab.userdata の代わりに使用できます。詳しくは、set-env-colab-kaggle-dotenv の使用方法を参照してください。
最後に、必要なライブラリをインポートします。

オーディオのストリーミングと保存の例

依存関係のインストールと認証情報の読み込みが完了したら、オーディオモダリティを有効にして OpenAI の completions エンドポイントへの Call を設定できます。まず、OpenAI クライアントを作成して Weave プロジェクトを初期化します。これにより、以降の Call が Weave によって Workspace にログされます。
次に、OpenAI の completions リクエストを定義し、Weave デコレーター (op) を追加します。@weave.op() デコレーターを付けると、Weave は関数の入力、出力、オーディオファイルをトレースに取得します。 次のコードでは、関数 prompt_endpoint_and_log_trace を定義します。この関数の主な処理は次の 3 つのステップです。
  1. テキストとオーディオの入出力をサポートする gpt-4o-audio-preview モデルを使用して、completion オブジェクトを作成します。
    • さまざまなアクセントでゆっくり 13 まで数えるよう、モデルにプロンプトを与えます。
    • completion を stream に設定します。
  2. ストリーミングされたデータをチャンク単位で受け取るため、新しい出力ファイルを開きます。
  3. オーディオファイルを開いた状態のファイルハンドラを返し、Weave がオーディオデータをトレースにログできるようにします。

テスト

関数を定義したら、次のセルを実行して関数をエンドツーエンドで呼び出し、オーディオが生成されてログされることを確認します。Weave は、システム プロンプトとユーザー プロンプトを出力オーディオとともにトレースに保存します。 セルを実行したら、セルの出力に表示されたトレースのリンクをクリックしてトレースを表示します。これで、Weave でトレースされた チャット補完 のオーディオ Call が完成しました。

高度な使い方: Weave で Realtime API を使用する

このクックブックの残りの部分では、より高度な例として、OpenAI の Realtime API と Weave を組み合わせて、ライブの双方向オーディオ会話をトレースする方法を紹介します。 Weave との Realtime Audio API インテグレーションとストリーミングオーディオ会話インターフェース OpenAI の Realtime API は、リアルタイムのオーディオおよびテキストアシスタントを構築するための会話型 API です。 Realtime の例を実行する前に、次の要件を確認してください。
  • マイクの設定 のセルを確認してください。
  • Google Colab の実行環境には制限があるため、この例はホストマシン上で Jupyter ノートブックとして実行する必要があります。ブラウザーでは実行できません。
    • macOS では、PyAudio を動作させるために Brew で portaudio をインストールする必要があります。
  • enable_audio_playback トグルを有効にすると、アシスタントが出力したオーディオが再生されます。エコー検出の実装は複雑なため、この設定を有効にする場合はヘッドホンが必須です。

必要なパッケージのセットアップ

Realtime の例では、オーディオ入出力と WebSocket 通信用の追加パッケージが必要です。これらをインストールしてから、環境変数を再読み込みしてください。

マイクの設定

Realtime の例ではマイクで録音し、スピーカーからオーディオを再生するため、使用するデバイスを PyAudio に指定する必要があります。 次のセルを実行して、利用可能なすべてのオーディオデバイスを検索します。次に、表示されたデバイスをもとに INPUT_DEVICE_INDEX と OUTPUT_DEVICE_INDEX を設定します。入力デバイスには 1 つ以上の入力チャンネルが、出力デバイスには 1 つ以上の出力チャンネルがあります。

OpenAI Realtime API スキーマの実装

以降のセクションでは、メッセージスキーマ、オーディオライター、Weave でインストルメントされたモデル、レコーダーの順に、Realtime クライアントを段階的に構築していきます。 OpenAI Python SDK は、現時点では Realtime API をサポートしていません。そのため、このサンプルでは可読性を高める目的で、OpenAI Realtime API のスキーマ全体を Pydantic で実装しています。公式サポートが提供された時点で、この実装は非推奨となる可能性があります。

OpenAI Realtime API 用の Pydantic スキーマ

オーディオストリームライター (ディスクへの書き込みとインメモリ)

次のヘルパークラスは、ストリーミングされたオーディオのチャンクを WAV ファイル (またはインメモリバッファ) にバッファリングします。これにより、後でオーディオを Weave に渡してログできるようになります。

リアルタイムオーディオモデル

リアルタイム (RT) オーディオモデルは、WebSocket を使用して OpenAI の Realtime API にイベントを送信します。このモデルは次のように動作します。
  1. init: ローカルバッファ (入力オーディオ) とストリーム (アシスタントの再生ストリーム、ユーザーオーディオのディスク書き込みストリーム) を初期化し、Realtime API への接続を開きます。
  2. receive_messages_thread: API からのメッセージ受信はスレッドで処理します。コードでは主に次の 4 つのイベントタイプを処理します。
    • RESPONSE_AUDIO_TRANSCRIPT_DONE: アシスタントの応答が完了したことをサーバーが通知し、トランスクリプトを返します。
    • CONVERSATION_ITEM_INPUT_AUDIO_TRANSCRIPTION_COMPLETED: ユーザーのオーディオの文字起こしが完了したことをサーバーが通知し、そのトランスクリプトを送信します。コードはトランスクリプトを Weave にログし、ユーザー向けに表示します。
    • RESPONSE_AUDIO_DELTA: サーバーがアシスタントの応答オーディオの新しいチャンクを送信します。コードはこのチャンクを、応答 ID に対応する進行中の応答データに追加するとともに、再生用の出力ストリームにも追加します。
    • RESPONSE_DONE: アシスタントの応答が完了したことをサーバーが通知します。コードは応答に関連付けられたすべてのオーディオチャンクとトランスクリプトを取得し、Weave にログします。
  3. send_audio: ハンドラがユーザーのオーディオチャンクをバッファに追加し、オーディオバッファが一定のサイズに達するとオーディオのチャンクを送信します。

オーディオレコーダー

モデルを定義したら、次はマイク入力をモデルに渡す仕組みが必要です。この例では、RTAudio モデルの send_audio メソッドにハンドラを紐付けた PyAudio 入力ストリームを使用します。このコードはストリームをメインスレッドに返すため、プログラムの完了時にストリームを安全に終了できます。

メインスレッド

この最後のセルでは、これまでのコンポーネントを組み合わせてリアルタイムアシスタントを実行します。メインスレッドでは、Weave を統合した Realtime Audio Model を起動します。次に、コードで録音を開始し、ユーザーがキーボード割り込みを行うまで待機します。セルを停止すると、ユーザーとアシスタントのトランスクリプトおよびオーディオを含む、会話全体の Weave トレースが得られます。
最終更新日 2026年9月30日