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

リアルタイム文字起こし

リアルタイムセッションでライブ音声を文字起こしします。

アシスタントによる音声応答を必要とせず、マイク、通話、その他のライブ音声ストリームからテキストを取得するアプリケーションには、リアルタイム文字起こしを使用します。推奨モデルは、音声の受信に合わせて文字起こし結果の差分を返し、アプリケーションが各音声ターンをコミットすると、最終的な文字起こし結果を返します。

まずは gpt-live-transcribe を使用してください。録音済みの音声にはファイルの文字起こしを使用します。ワークフローを比較するには、文字起こしの概要を参照してください。

文字起こしセッションの作成

type: "transcription" を指定してセッションを作成し、gpt-live-transcribe を選択します。サーバー側の音声パイプラインでは WebSocket を、ブラウザの音声では WebRTC を使用して接続します。

{
  "type": "session.update",
  "session": {
    "type": "transcription",
    "audio": {
      "input": {
        "format": {
          "type": "audio/pcm",
          "rate": 24000
        },
        "transcription": {
          "model": "gpt-live-transcribe"
        },
        "turn_detection": null
      }
    }
  }
}

この例では、24 kHz の PCM 音声を使用し、各ターンを明示的にコミットできるように自動ターン検出を無効にしています。セッション設定の全項目については、リアルタイムセッションのリファレンスを参照してください。

音声のストリーミング

input_audio_buffer.append を使用して音声チャンクを送信します。

ws.send(
  JSON.stringify({
    type: "input_audio_buffer.append",
    audio: base64Pcm16,
  })
);

自動ターン検出を無効にしている場合は、音声ターンを終了するタイミングでバッファをコミットします。

ws.send(
  JSON.stringify({
    type: "input_audio_buffer.commit",
  })
);

サーバー側でターンの境界を検出してコミットするには、代わりに音声区間検出を設定します。

文字起こしイベントの処理

文字起こし結果の差分を逐次受信し、完了イベントを待ち受けます。

ws.on("message", (data) => {
  const event = JSON.parse(data);

  if (event.type === "conversation.item.input_audio_transcription.delta") {
    process.stdout.write(event.delta);
  }

  if (event.type === "conversation.item.input_audio_transcription.completed") {
    console.log("\nFinal transcript:", event.transcript);
  }
});

差分イベントには、新たに取得できた文字起こしテキストが含まれます。

{
  "type": "conversation.item.input_audio_transcription.delta",
  "item_id": "item_003",
  "content_index": 0,
  "delta": "Hello,"
}

完了イベントには、コミットされた項目の最終的な文字起こし結果が含まれます。

{
  "type": "conversation.item.input_audio_transcription.completed",
  "item_id": "item_003",
  "content_index": 0,
  "transcript": "Hello, how are you?"
}

異なる発話ターンの完了イベント間では、順序は保証されません。item_id を使用して、文字起こしイベントをコミット済みの入力項目に対応付けます。

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

音声に専門用語が含まれる場合や、複数の言語が使われると想定される場合は、コンテキストを追加します。進行中のセッションで文字起こし設定を変更するには、session.update イベントを再度送信します。

{
  "type": "session.update",
  "session": {
    "type": "transcription",
    "audio": {
      "input": {
        "format": {
          "type": "audio/pcm",
          "rate": 24000
        },
        "transcription": {
          "model": "gpt-live-transcribe",
          "prompt": "A customer support call about a premium plan and account AC-42.",
          "keywords": ["premium plan", "AC-42", "billing"],
          "languages": ["en", "fr"],
          "delay": "low"
        },
        "turn_detection": null
      }
    }
  }
}
  • prompt を使用して、録音の内容や状況を説明します。
  • 音声に登場する可能性のある製品名、頭字語、その他の具体的な用語は、keywords に指定します。
  • 想定される入力言語は、languages に指定します。

サポートされている言語コードの形式には、次のものがあります。

  • enesfr などの ISO 639-1 コード
  • engspayuecmn など、一部の ISO 639-3 コード
  • zh-cnzh-twzh-hk など、地域別の zh ロケールコード

Realtime API は、サポートされていない言語コードや形式が正しくない言語コードを拒否します。

キーワードはヒントであり、出力に必ず含めるよう指定するものではありません。各キーワードは 1 行に収め、<>、キャリッジリターン、ラインフィードを含めないでください。キーワードにこれらの文字が含まれている場合、または prompt がモデルの長さ制限を超えている場合、Realtime API はセッションの更新を拒否します。

gpt-live-transcribe では、単数形の language フィールドではなく languages を使用します。両方を送信しないでください。

コミット済みターンの文字起こし

リアルタイムセッションで gpt-transcribe を使用するのは、音声ターンのコミット後に文字起こしを開始する必要がある場合、または検出した言語の出力が必要な場合に限ってください。この専用ワークフローには WebSocket 接続が必要です。

gpt-transcribe は、Realtime API セッションで入力音声を文字起こしする場合や、文字起こし専用セッションで実行される場合、以前に文字起こししたターンをコンテキストとして自動的に使用します。

{
  "type": "session.update",
  "session": {
    "type": "transcription",
    "audio": {
      "input": {
        "format": {
          "type": "audio/pcm",
          "rate": 24000
        },
        "transcription": {
          "model": "gpt-transcribe"
        },
        "turn_detection": null
      }
    }
  }
}

音声を追加し、input_audio_buffer.commit を送信します。これにより、モデルは最終的な完了イベントの前に文字起こし結果の差分を出力できます。完了イベントには、検出された言語も含まれます。

{
  "type": "conversation.item.input_audio_transcription.completed",
  "item_id": "item_003",
  "content_index": 0,
  "transcript": "Bonjour, pouvez-vous m'entendre ?",
  "languages": [{ "code": "fr" }]
}

gpt-transcribe が言語を十分な信頼性で予測できない場合、languages は空の配列になります。gpt-live-transcribe は言語検出の予測結果を返しません。

レイテンシと精度の調整

ストリーミング文字起こしでは、レイテンシと文字起こしの品質がトレードオフの関係にあります。遅延を小さく設定すると、途中のテキストをより早く出力できます。遅延を大きく設定すると、テキストを出力する前にモデルがより多くの音声コンテキストを得られるため、単語誤り率の改善が期待できます。

まずは audio.input.transcription.delay を設定し、実際の音声でテストしてください。最初に試す設定の目安は次のとおりです。

  • レイテンシの最小化が特に重要なやり取りには minimal
  • 低レイテンシのライブ字幕には low
  • レイテンシと精度のバランスを取るには medium
  • 即時表示よりも精度を重視する場合は high
  • より多くのコンテキストを得るために、ワークフロー上で最も大きな遅延を許容できる場合は xhigh

ミリ秒単位の実際の遅延はモデルの設定によって変わることがあります。各レベルの遅延が一定であると想定せず、代表的な音声でベンチマークを実施してください。

合成音声だけで設定を決めないでください。実際の利用を代表するマイク、電話音声、アクセント、背景ノイズ、言語の切り替え、分野固有の用語、長時間のセッションを使ってテストしてください。

信頼度、タイムスタンプ、話者ラベルの扱い

gpt-live-transcribe は、単語単位のタイムスタンプ、話者ラベル、文字起こしの信頼度スコアを返しません。アプリケーションでタイムスタンプや話者ラベルが必要な場合は、それらに対応したファイルの文字起こしモデルを使用するか、アプリケーション側にフォールバック処理を追加してください。

本番環境向けチェックリスト

  • 調整を始める前に、目標レイテンシと精度のしきい値を決めます。
  • ノイズの少ないサンプルだけでなく、実際の本番環境の音声でもテストします。
  • 対象言語ごとにテストします。
  • 評価用データセットには、数値、日付、通貨、メールアドレス、製品名、分野固有の用語を含めます。
  • 単語誤り率とは別に、文字起こし結果が空になるケース、途中で切れるケース、遅れて届くケースを追跡します。
  • 後続の差分によって先行するテキストが修正された場合に、UI で表示中の部分的なテキストをどう更新するかを決めます。
  • item_id を使って、確定した文字起こし結果の順序を整え、整合性を保ちます。
  • タイムスタンプ、話者ラベル、信頼度フィールドがサポートされていない場合に備えて、代替手段を用意します。
リアルタイムと音声の概要

音声エージェント、翻訳、文字起こしの各セッションを比較します。

リアルタイム翻訳

専用の翻訳セッションでライブ音声を翻訳します。

WebSocket 接続

サーバー側のメディアパイプラインを通じて、生の音声をストリーミングします。

音声区間検出

ライブ音声ストリームのターン検出を設定します。