ナビゲーションにスキップ

文字起こし編集

このガイドでは、リアルタイムスピーチtoテキストAPIで確定済みの文字起こしに自然言語の編集指示を適用する方法をご紹介します。

ハウツーガイド · クライアント側または サーバー側 ストリーミングガイドを完了していることを前提としています。

概要

文字起こし編集は実験的機能であり、基本文字起こし料金に30%の追加料金がかかります。 確定済み文字起こしごとに、少なくとも10秒分の音声に対して請求されます。詳しい料金については、API料金 ページ をご覧ください。

リアルタイム文字起こしでは、確定済みの文字起こしごとに自然言語の編集指示を適用できます。たとえば、話された日付を固定形式で記述したり、略語や頭字語を展開したりできます。指示は接続を開く際に1回渡され、確定済みの各文字起こしの後に、編集済みテキストを含む個別のedited_transcriptイベントが続きます。

部分的な文字起こしは編集されません。committed_transcriptイベントも変更されないため、機能を有効にしても既存のインテグレーションは動作し続けます。

文字起こし編集はentity_detectionと組み合わせることはできません。両方を設定した接続は、 invalid_requestエラーで拒否されます。

文字起こし編集を有効にする

接続時にtranscriptEditオプション(WebSocket APIではtranscript_editクエリパラメータ)で指示を渡します。指示は最大2,000文字です。指示の書き方については、バッチ文字起こし編集ガイドをご覧ください。

すべてのSDKで、編集済み文字起こしはRealtimeEvents.EDITED_TRANSCRIPTイベントを通じて届きます。

クライアント側

クライアント側ストリーミングガイドで説明されているように、サーバーが発行した1回限りのトークンを使用して、ブラウザで@elevenlabs/clientを使用します。

import { Scribe, RealtimeEvents } from "@elevenlabs/client";
// Fetch a single-use token from your server first
const response = await fetch("/scribe-token", yourAuthHeaders);
const { token } = await response.json();
const connection = Scribe.connect({
token,
modelId: "scribe_v2_realtime",
transcriptEdit: "Write all dates in ISO 8601 format (YYYY-MM-DD)",
microphone: {
echoCancellation: true,
noiseSuppression: true,
},
});
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
console.log("Committed:", data.text);
});
connection.on(RealtimeEvents.EDITED_TRANSCRIPT, (data) => {
console.log("Edited:", data.edited_text);
});

サーバー側

サーバー側ストリーミングガイドで説明されているように、サーバーで公式SDKを使用します。そのガイドと異なるのはオプションとイベントハンドラーだけです。音声の送信と接続の終了は同じ方法で行います。

import asyncio
import os
from dotenv import load_dotenv
from elevenlabs import AudioFormat, ElevenLabs, RealtimeAudioOptions, RealtimeEvents
load_dotenv()
async def main():
elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))
connection = await elevenlabs.speech_to_text.realtime.connect(RealtimeAudioOptions(
model_id="scribe_v2_realtime",
audio_format=AudioFormat.PCM_16000,
sample_rate=16000,
transcript_edit="Write all dates in ISO 8601 format (YYYY-MM-DD)",
))
def on_committed_transcript(data):
print(f"Committed: {data.get('text', '')}")
def on_edited_transcript(data):
print(f"Edited: {data.get('edited_text', '')}")
connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, on_committed_transcript)
connection.on(RealtimeEvents.EDITED_TRANSCRIPT, on_edited_transcript)
# Send audio chunks as shown in the server-side streaming guide, then close.
await connection.close()
if __name__ == "__main__":
asyncio.run(main())

編集済み文字起こしを受信する

有効にすると、確定済みの各文字起こしの後に、確定済みテキストとその編集後バージョンを含むedited_transcriptイベントが続きます。

{
"message_type": "edited_transcript",
"text": "our next meeting is on the twelfth of July twenty twenty-six",
"edited_text": "our next meeting is on 2026-07-12"
}

注意が必要な動作:

  • 編集は確定済みセグメントごとに適用されます。編集は非同期で実行されるため、edited_transcriptイベントは対応するcommitted_transcriptイベントの直後に送信されます。次の部分的な文字起こしの後に届くことがあり、連続するセグメントの編集は順不同で届く場合があります。textフィールドを使用して、編集を確定済み文字起こしと対応付けてください。
  • セグメントに編集がない場合、edited_textはtextと同一です。
  • セグメントの編集を生成できない場合、そのセグメントにはedited_transcriptイベントは送信されません。committed_transcriptイベントには影響しません。
  • committed_transcript_with_timestampsの単語レベルのタイムスタンプは、編集後のテキストではなく、元の確定済みテキストを表します。

次のステップ