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

文字起こしの編集

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

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

概要

文字起こしの編集は実験的な機能で、基本の文字起こし料金に30%が上乗せされます。 確定済み文字起こしごとに、最低10秒分のオーディオが課金されます。料金の詳細はAPI料金 ページをご覧ください。

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

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

文字起こしの編集は entity_detection または entity_redaction と併用できません。両方を 設定した接続は、invalid_request エラーで拒否されます。

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

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

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

クライアント側

クライアント側ストリーミングガイドの説明に従い、サーバーが発行した使い捨てトークンとともにブラウザーで @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 の単語単位のタイムスタンプは、編集済みテキストではなく、元の確定済みテキストを示します。

次のステップ