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

セットアップ

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

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

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

テスト

function を定義したら、次のセルを実行してエンドツーエンドで呼び出し、オーディオが生成されてログされることを確認してください。システムプロンプトとユーザープロンプトは、出力オーディオとともに Weave トレース に保存されます。 セルの実行後、トレース を表示するには、セル出力に表示される トレース リンクをクリックしてください。この時点で、Weave でトレースされた完全な chat-completions オーディオ call ができあがっています。

高度な使い方: Weave での Realtime API

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

前提条件の設定

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

マイクの設定

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

OpenAI Realtime API スキーマの実装

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

OpenAI Realtime API 用の Pydantic スキーマ

オーディオストリームライター (ディスクおよびメモリ内に書き込み)

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

Realtime audio model

Realtime (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: サーバーがアシスタントの応答オーディオの新しい チャンク を送信します。コードはこれを response ID ごとの進行中の応答データに追加し、再生用の出力ストリームにも渡します。
    • RESPONSE_DONE: サーバーがアシスタントの応答完了を通知します。コードは、その応答に関連付けられたすべてのオーディオ チャンク と文字起こしを取得し、それらを Weave にログします。
  3. send_audio: ハンドラーはユーザーオーディオの チャンク をバッファーに追加し、オーディオバッファーが一定のサイズに達すると、その チャンク を送信します。

オーディオレコーダー

モデルを定義したら、マイク入力を渡す方法が必要です。この例では、RTAudioモデルのsend_audio methodに接続されたハンドラー付きのPyAudio入力ストリームを使用します。コードはこのストリームをメインスレッドに返すため、プログラムの終了時に安全に停止できます。

メインスレッド

この最後のセルでは、これまでの components をまとめて、リアルタイムアシスタントを実行します。メインスレッドでは、Weave を組み込んだ Realtime オーディオモデル を開始します。次に、録音を開始し、ユーザーによるキーボード割り込みを待ちます。セルを停止すると、ユーザーとアシスタントの文字起こしおよびオーディオを含む、会話の完全な Weave トレース が得られます。