メインコンテンツへスキップ
これはインタラクティブなノートブックです。ローカルで実行するか、以下のリンクを使用してください:

Audio データで Weave を使用する方法:OpenAI の例

このデモでは、OpenAI の chat completions API と GPT 4o Audio Preview を使用して、テキストプロンプトに対する音声レスポンスを生成し、それらを Weave で追跡します。 高度なユースケースとして、OpenAI Realtime API を活用してリアルタイムで音声をストリーミングします。動画デモを見るには、次のサムネイルをクリックするか、こちらをクリックしてください。 Everything Is AWESOME

セットアップ

まず、OpenAI (openai) と Weave (weave) の依存関係、および API キー管理用の依存関係 set-env をインストールします。
%%capture
!pip install openai
!pip install weave
!pip install set-env-colab-kaggle-dotenv -q # 環境変数用
python
%%capture
# openai のバグを修正するための暫定的な回避策:
# TypeError: Client.__init__() got an unexpected keyword argument 'proxies'
# 詳細は https://community.openai.com/t/error-with-openai-1-56-0-client-init-got-an-unexpected-keyword-argument-proxies/1040332/15 を参照
!pip install "httpx<0.28"
次に、OpenAI と Weave に必要な API キーを読み込みます。ここでは、Google Colab のシークレットキーマネージャーと互換性があり、Colab 固有の google.colab.userdata の代替となる set_env を使用します。使用方法については こちら を参照してください。
# 環境変数を設定します。
from set_env import set_env

_ = set_env("OPENAI_API_KEY")
_ = set_env("WANDB_API_KEY")
最後に、必要なライブラリをインポートします。
import base64
import os
import time
import wave

import numpy as np
from IPython.display import display
from openai import OpenAI

import weave

音声ストリーミングと保存の例

次に、音声モダリティを有効にした OpenAI の completions エンドポイントへのコールを設定します。まず、OpenAI クライアントを作成し、Weave の Projects を開始します。
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
weave.init("openai-audio-chat")
ここで、OpenAI の completions リクエストを定義し、Weave のデコレータ (op) を追加します。 関数 prompt_endpont_and_log_trace を定義します。この関数には主に 3 つのステップがあります:
  1. テキストと音声の入出力に対応した GPT 4o Audio Preview モデルを使用して、completion オブジェクトを作成します。
    • モデルに対し、アクセントを変えながらゆっくりと 13 まで数えるようにプロンプトを出します。
    • completion を “stream” に設定します。
  2. ストリームされたデータがチャンクごとに書き込まれる新しい出力ファイルを開きます。
  3. 音声ファイルへのオープンファイルハンドラーを返し、Weave がトレース内に音声データをログに記録するようにします。
SAMPLE_RATE = 22050

@weave.op()
def prompt_endpoint_and_log_trace(system_prompt=None, user_prompt=None):
    if not system_prompt:
        system_prompt = "You're the fastest counter in the world"
    if not user_prompt:
        user_prompt = "Count to 13 super super slow, enunciate each number with a dramatic flair, changing up accents as you go along. British, French, German, Spanish, etc."
    # 音声モダリティを指定して OpenAI API にリクエスト
    completion = client.chat.completions.create(
        model="gpt-4o-audio-preview",
        modalities=["text", "audio"],
        audio={"voice": "fable", "format": "pcm16"},
        stream=True,
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt},
        ],
    )

    # 書き込み用に wave ファイルを開く
    with wave.open("./output.wav", "wb") as wav_file:
        wav_file.setnchannels(1)  # モノラル
        wav_file.setsampwidth(2)  # 16-bit
        wav_file.setframerate(SAMPLE_RATE)  # サンプリングレート (必要に応じて調整)

        # API からストリームされるチャンクを書き込む
        for chunk in completion:
            if (
                hasattr(chunk, "choices")
                and chunk.choices is not None
                and len(chunk.choices) > 0
                and hasattr(chunk.choices[0].delta, "audio")
                and chunk.choices[0].delta.audio.get("data") is not None
            ):
                # base64 音声データをデコード
                audio_data = base64.b64decode(chunk.choices[0].delta.audio.get("data"))

                # 現在のチャンクを wave ファイルに書き込む
                wav_file.writeframes(audio_data)

    # ファイルを Weave op に返す
    return wave.open("output.wav", "rb")

テスト

以下のセルを実行します。システムプロンプトとユーザープロンプト、および出力音声が Weave のトレースに保存されます。 セルを実行した後、”🍩” 絵文字の隣にあるリンクをクリックしてトレースを確認してください。
from IPython.display import Audio

# 音声ストリームを書き込む関数を呼び出す
prompt_endpoint_and_log_trace(
    system_prompt="You're the fastest counter in the world",
    user_prompt="Count to 13 super super slow, enunciate each number with a dramatic flair, changing up accents as you go along. British, French, German, Spanish, etc.",
)

# 更新された音声ストリームを表示
display(Audio("output.wav", rate=SAMPLE_RATE, autoplay=True))

高度な使い方:Weave を使った Realtime Audio API