For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション
Theme

音声ファイルの文字起こし

録音した音声をテキストに変換します。

録音が完了している場合や、リクエストで扱う音声の範囲が決まっている場合は、ファイルの文字起こしを利用します。音声をアップロードすると、文字起こしの全文を受け取れます。モデルがファイルを処理している間に、テキストをストリーミングで受け取ることもできます。

まずは gpt-transcribe を使用してください。録音した音声を元の言語のまま文字に起こす場合の推奨モデルです。以下で紹介する話者ラベル、単語単位のタイムスタンプ、字幕形式の例では、非推奨のモデルを使用しています。

whisper-1、gpt-4o-transcribe、gpt-4o-mini-transcribe、gpt-4o-transcribe-diarize、/v1/audio/translations は非推奨で、2027 年 2 月 26 日に提供を終了します。提供終了のお知らせを確認し、現在利用できる文字起こしワークフローを選択してください。以下の用途別の例では、提供終了まで既存の実装で利用できる機能を説明します。

ファイルサイズの上限は 25 MB です。対応する入力形式は mp3、mp4、mpeg、mpga、m4a、wav、webm です。

マイク、通話、メディアストリームから音声を受信しながら処理する場合は、リアルタイム文字起こしを使用してください。

クイックスタート

文字起こし

音声ファイルを /v1/audio/transcriptions に送信する際に、モデルに gpt-transcribe を指定します。

音声の文字起こし
from openai import OpenAI

client = OpenAI()
audio_file = open("audio.wav", "rb")

transcription = client.audio.transcriptions.create(
    model="gpt-transcribe", file=audio_file
)

print(transcription.text)

モデルは文字起こし結果と検出した言語を JSON 形式で返します。

{
  "text": "Bonjour, pouvez-vous m'entendre ?",
  "languages": [{ "code": "fr" }]
}

モデルが言語を確実に判定できない場合は、"languages": [] を返します。リクエストとレスポンスの全フィールドについては、Audio API リファレンスを参照してください。

文字起こし用コンテキストの追加

prompt、keywords、languages を gpt-transcribe に指定すると、専門用語や複数の言語を含む音声の文字起こし精度を高められます。

コンテキストと言語のヒントの追加
from openai import OpenAI

client = OpenAI()

with open("meeting.wav", "rb") as audio_file:
    transcription = client.audio.transcriptions.create(
        model="gpt-transcribe",
        file=audio_file,
        prompt="A customer support call about a premium plan and account AC-42.",
        extra_body={
            "keywords": ["premium plan", "AC-42", "billing"],
            "languages": ["en", "fr"],
        },
    )

print(transcription.text)
  • prompt には、録音の背景情報を自由な形式で記述します。
  • keywords には、音声に含まれると予想される用語をそのまま指定します。
  • languages には、入力音声で使われると予想される言語を指定します。

キーワードは認識のヒントであり、必ず出力されるわけではありません。関連する用語だけを指定し、精度が向上するか、実際には発話されていない用語が出力されないかを確認してください。

gpt-transcribe では、languages が単数形の language フィールドに代わります。両方のフィールドを送信しないでください。各キーワードは 1 行に収め、<、>、キャリッジリターン、ラインフィードを含めないでください。キーワードにこれらの文字のいずれかが含まれている場合や、prompt がモデルの長さ制限を超えた場合、API はリクエスト全体を拒否します。

話者分離

既存の実装では、2027 年 2 月 26 日まで、非推奨の gpt-4o-transcribe-diarize モデルを使って、録音の各区間で誰が話しているかを識別できます。このモデルは話者ラベルの付与に特化しており、通常のファイルの文字起こしには推奨されません。

レスポンス形式に diarized_json を指定すると、speaker、start、end のメタデータを含むセグメントが返されます。音声が 30 秒を超える場合は、chunking_strategy に "auto" または音声区間検出の設定を指定してください。

必要に応じて、known_speaker_names[] と known_speaker_references[] を使って短い参照音声を最大 4 件指定し、各セグメントを既知の話者に対応付けることができます。各参照音声の長さは 2~10 秒としてください。参照音声には、文字起こし対象の音声ファイルとは異なる形式でも、アップロードに対応している入力形式であればどれでも使用できます。マルチパートフォームデータで送信する場合は、参照音声を データ URL にエンコードしてください。

会議録音の話者分離
import base64
from openai import OpenAI

client = OpenAI()


def to_data_url(path: str) -> str:
    with open(path, "rb") as fh:
        return "data:audio/wav;base64," + base64.b64encode(fh.read()).decode("utf-8")


with open("meeting.wav", "rb") as audio_file:
    transcript = client.audio.transcriptions.create(
        model="gpt-4o-transcribe-diarize",
        file=audio_file,
        response_format="diarized_json",
        chunking_strategy="auto",
        extra_body={
            "known_speaker_names": ["agent"],
            "known_speaker_references": [to_data_url("agent.wav")],
        },
    )

for segment in transcript.segments:
    print(segment.speaker, segment.text, segment.start, segment.end)

stream=true の場合、話者ラベル付きのレスポンスでは、セグメントが確定するたびに transcript.text.segment イベントが送信されます。transcript.text.delta イベントには segment_id フィールドが含まれますが、差分には暫定的な話者ラベルは含まれません。モデルはセグメントを確定する時点で初めて話者を割り当てます。

話者ラベルは /v1/audio/transcriptions で利用できます。リアルタイム文字起こしセッションでは利用できません。

翻訳

非推奨の /v1/audio/translations エンドポイントは、whisper-1 を使って録音済みの音声を英語に翻訳します。2027 年 2 月 26 日まで利用できます。文字起こしでは録音の元の言語を維持しますが、このエンドポイントが返すテキストは英語のみです。

リアルタイム翻訳に移行するには、gpt-realtime-translate を /v1/realtime/translations で使用します。移行には、翻訳セッションの作成、ストリーミングによる音声入力、翻訳イベントの処理が必要です。/v1/audio/translations リクエストのモデル ID を変更するだけでは移行できません。

対応言語

languages を gpt-transcribe に指定すると、入力音声で使われると予想される言語を伝えられます。対応する言語コード形式には、次のものがあります。

  • ISO 639-1 コード(en、es、fr など)
  • 一部の ISO 639-3 コード(eng、spa、yue、cmn など)
  • 地域別の zh ロケールコード(zh-cn、zh-tw、zh-hk など)

未対応の言語コードや形式が正しくない言語コードを指定すると、API はリクエストを拒否します。レスポンスには、モデルが確実に検出できた言語も含まれます。

whisper-1 については、Whisper の対応言語一覧を参照してください。Whisper は 98 言語に対応していますが、精度は言語によって異なります。言語のヒントを 1 つだけ受け付ける既存のモデルでは、language を使用し、languages は使用しません。

タイムスタンプ

既存の実装では、2027 年 2 月 26 日まで、非推奨の whisper-1 モデルで単語単位またはセグメント単位のタイムスタンプを取得できます。timestamp_granularities[] パラメータを指定すると、字幕作成や動画編集に使える構造化されたタイムスタンプデータが返されます。

タイムスタンプのオプション
from openai import OpenAI

client = OpenAI()
audio_file = open("speech.wav", "rb")

transcription = client.audio.transcriptions.create(
    file=audio_file,
    model="whisper-1",
    response_format="verbose_json",
    timestamp_granularities=["word"],
)

print(transcription.words)

timestamp_granularities[] パラメータに対応しているのは whisper-1 のみです。

長い音声ファイルの処理

Transcriptions API が受け付けるファイルサイズの上限は 25 MB です。それを超える録音は、圧縮音声形式を使用するか、ファイルを 25 MB 以下のチャンクに分割してください。文の途中で分割すると文脈が失われ、精度が低下することがあるため、文の切れ目で分割してください。

音声の分割には、オープンソースの Python パッケージ PyDub を使用できます。

from pydub import AudioSegment

song = AudioSegment.from_wav("good_morning.wav")

# PyDub handles time in milliseconds
ten_minutes = 10 * 60 * 1000

first_10_minutes = song[:ten_minutes]

first_10_minutes.export("good_morning_10.wav", format="wav")

OpenAI は、PyDub などのサードパーティ製ソフトウェアの使いやすさや安全性を保証しません。

プロンプトの活用

プロンプトを使うと、名前や略語、録音特有の用語を認識しやすくなり、意図した表記形式も反映しやすくなります。gpt-transcribe では、プロンプトに加えて keywords と languages を指定してください。詳しくは文字起こし用コンテキストの追加を参照してください。

既存の gpt-4o-transcribe と gpt-4o-mini-transcribe の実装でもプロンプトを使用できます。gpt-4o-transcribe-diarize はプロンプトに対応していません。

プロンプトは次のような場面で役立ちます。

  • 製品名、専門用語、略語を正確に文字に起こしたい場合
  • 長い録音を分割し、直前のチャンクの文脈を引き継ぎたい場合
  • 句読点、大文字と小文字の区別、つなぎ言葉を残したい場合
  • ある言語で使う表記体系を指定したい場合

whisper-1 のプロンプトは 224 トークンが上限で、推奨の文字起こしモデルほど細かく出力を制御できません。ワークフローで Whisper が必要な場合は、信頼性の向上を参照してください。

文字起こし結果のストリーミング

ファイルの文字起こしでは、モデルが録音済みの音声を処理している間に、文字起こし結果を少しずつ受け取れます。リアルタイムセッションは不要です。

録音済み音声の文字起こし結果のストリーミング

stream=true を設定し、モデルに gpt-transcribe を指定します。モデルが録音の各部分を文字に起こすたびに、Transcriptions API が文字起こしイベントを返します。

文字起こし結果のストリーミング
from openai import OpenAI

client = OpenAI()
audio_file = open("speech.wav", "rb")

stream = client.audio.transcriptions.create(
    model="gpt-transcribe",
    file=audio_file,
    stream=True,
)

for event in stream:
    print(event)

モデルは音声を文字に起こしながら transcript.text.delta イベントを送信し、最後の transcript.text.done イベントで文字起こしの全文を返します。話者ラベルを付けるために response_format="diarized_json" を指定した場合、話者分離モデルはセグメントを確定するたびに transcript.text.segment イベントも送信します。

gpt-transcribe では、最後のイベントに検出した言語も含まれます。

{
  "type": "transcript.text.done",
  "text": "Bonjour, pouvez-vous m'entendre ?",
  "languages": [{ "code": "fr" }]
}

既存の gpt-4o-transcribe、gpt-4o-mini-transcribe、gpt-4o-transcribe-diarize の実装でも、ファイルの文字起こし結果をストリーミングで受け取れます。whisper-1 はこの機能に対応していません。

録音中の音声の文字起こし結果のストリーミング

マイク、通話、メディアストリームからのライブ音声には、上記のファイル向けの方法に代えて、リアルタイム文字起こしのガイドを参照してください。現在の文字起こしセッションの流れと、gpt-live-transcribe を使った推奨のリアルタイム文字起こし手順を説明しています。

信頼性の向上

タイムスタンプ、字幕、翻訳に whisper-1 を使用している場合、以下の方法で、使用頻度の低い単語や略語の認識精度を高められます。汎用の文字起こしを新たに実装する場合は、代わりに gpt-transcribe を使い、文字起こし用コンテキストを指定してください。