見出し画像

OpenAI の Chat Completions API のオーディオ入出力を試す

「OpenAI」の「Chat Completions API」のオーディオ入出力を試したのでまとめました。


1. Chat Completions API のオーディオ入出力

OpenAIの一部のモデルは、テキストや画像に加えて、オーディオ入出力に対応しています。オーディオ入力は、テキスト単独よりも豊富なデータを含むことができ、モデルが入力のトーンや抑揚、その他のニュアンスを検出することができます。

オーディオ機能で、次のことができます。

・本文の音声要約の生成 (テキスト入力、オーディオ出力)
・録音で感情分析を実行 (オーディオ入力、テキスト出力)
・非同期な Speech to Speech (オーディオ入力、オーディオ出力)

Audio generation

2. モデルからのオーディオ出力

「Google Colab」でのセットアップ手順は、次のとおりです。

(1) パッケージのインストール。

# パッケージのインストール
!pip install openai

(2) 環境変数の準備。
左端の鍵アイコンで「OPENAI_API_KEY」を設定してから、以下のセルを実行してください。

import os
from google.colab import userdata

# 環境変数の準備 (左端の鍵アイコンでOPENAI_API_KEYを設定)
os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY")

(3) 推論の実行。

import base64
from openai import OpenAI

# OpenAIクライアントの準備
client = OpenAI()

# 推論の実行
completion = client.chat.completions.create(
    model="gpt-4o-audio-preview",
    modalities=["text", "audio"], # テキスト入力 → オーディオ出力
    audio={"voice": "alloy", "format": "wav"},
    messages=[
        {
            "role": "user",
            "content": "富士山の高さは?"
        }
    ]
)

# wavの出力
wav_bytes = base64.b64decode(completion.choices[0].message.audio.data)
with open("output.wav", "wb") as f:
    f.write(wav_bytes)

# 文字起こし
print(completion.choices[0].message.audio.transcript)

富士山の高さは3,776メートルです。

モデルは「gpt-4o-audio-preview」を指定します。
主なパラメータは次のとおりです。

・modality : 生成させたい出力タイプ (デフォルト:["text"])
・audio :
 ・voice : 声 (alloy, echo, fable, onyx, nova, shimmer)
 ・format : フォーマット (wav, mp3, flac, opus, pcm16)

3. モデルへのオーディオ入力

(1) 左端のフォルダアイコンから、「input.wav」をアップロード。
「富士山の高さは?」というwavを作成してアップロードします。

(2) 推論の実行。

import base64
import requests
from openai import OpenAI

# OpenAIクライアントの準備
client = OpenAI()

# オーディオの読み込み
with open("input.wav", "rb") as audio_file:
    wav_data = audio_file.read()
    encoded_string = base64.b64encode(wav_data).decode('utf-8')

# 推論の実行
completion = client.chat.completions.create(
    model="gpt-4o-audio-preview",
    modalities=["text", "audio"],
    audio={"voice": "alloy", "format": "wav"},
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "input_audio",
                    "input_audio": {
                        "data": encoded_string,
                        "format": "wav"
                    }
                }
            ]
        },
    ]
)

# wavの出力
wav_bytes = base64.b64decode(completion.choices[0].message.audio.data)
with open("output.wav", "wb") as f:
    f.write(wav_bytes)

# 文字起こし
print(completion.choices[0].message.audio.transcript)

富士山の高さは、標高3,777メートルです。これは日本で最も高い山として知られており、毎年多くの登山者が訪れます。

4. マルチターン会話

モデルからのオーディオ出力をマルチターン会話への入力として使用するには、オーディオ生成の応答データに表示される生成されたIDを使用します。

次のようなJSONの応答があった場合

{
  "index": 0,
  "message": {
    "role": "assistant",
    "content": null,
    "refusal": null,
    "audio": {
      "id": "audio_abc123",
      "expires_at": 1729018505,
      "data": "<bytes omitted>",
      "transcript": "Yes, golden retrievers are known to be ..."
    }
  },
  "finish_reason": "stop"
}

次のように会話履歴を指定します。

        messages = [
            {
                "role": "user",
                "content": "Is a golden retriever a good family dog?"
            },
            {
                "role": "assistant",
                "audio": {
                    "id": "audio_abc123"
                }
            },
            {
                "role": "user",
                "content": "Why do you say they are loyal?"
            }
        ]

5. FAQ

Q. gpt-4o-audio-previewでサポートされているモダリティは?
A. 入出力の許容可能な組み合わせは次のとおりです。

・テキスト 入力 → テキスト+オーディオ 出力
・オーディオ 入力 → テキスト+オーディオ 出力
・オーディオ 入力 → テキスト 出力
・テキスト+オーディオ 入力 → テキスト+オーディオ 出力
・テキスト+オーディオ 入力 → テキスト 出力

Q. Chat Completions のモデルは、Realtime APIとどのように異なるか?
A. 基礎となるGPT-4o Audioモデルはまったく同じです。Realtime API は、同じモデルを低レイテンシーで動作します。

Q. トークンの観点から、モデルへのオーディオ入力についてどう思うか?
A. これを公開するためのより良いツールに取り組んでいますが、約1時間のオーディオ入力は、現在このモデルでサポートされている最大コンテキストウィンドウである128kトークンに相当します。

Q. 受信する出力モダリティをどのように制御するか?
A. 現在、このモデルはプログラムでのみモダリティ= ["text", "audio"] を許可しています。将来的には、このパラメータはより多くのコントロールを提供します。

Q. Tool (Function) Callingはどのように機能するか?
A. Tool(Function)Callingは、Chat Completionsの他のモデルと同じように機能します。詳しくはこちらを参照。



この記事が気に入ったらサポートをしてみませんか?