전사 편집

이 가이드에서는 Realtime Speech to Text API를 사용해 커밋된 전사에 자연어 편집 지침을 적용하는 방법을 안내합니다.

방법 가이드 · 클라이언트 측 또는 서버 측 스트리밍 가이드를 완료했다고 가정합니다.

개요

전사 편집은 실험적 기능이며, 커밋된 전사당 최소 10초의 오디오에 대해 청구되는 기본 전사 비용에 30%의 추가 요금이 붙습니다. 자세한 가격 정보는 API 가격 페이지를 참조하세요.

실시간 전사는 모든 커밋된 전사에 자연어 편집 지침을 적용할 수 있습니다. 예를 들어 말한 날짜를 고정된 형식으로 작성하거나 약어와 두문자어를 풀어 쓸 수 있습니다. 연결을 열 때 지침을 한 번 전달하면, 각 커밋된 전사 뒤에 편집된 텍스트가 포함된 별도의 edited_transcript 이벤트가 이어집니다.

부분 전사는 편집되지 않습니다. committed_transcript 이벤트도 변경되지 않으므로 기능을 켜도 기존 통합은 계속 작동합니다.

전사 편집은 entity_detection과 함께 사용할 수 없습니다. 둘 다 설정한 연결은 invalid_request 오류와 함께 거부됩니다.

전사 편집 활성화

연결할 때 transcriptEdit 옵션(WebSocket API의 transcript_edit 쿼리 매개변수)으로 지침을 전달하세요. 지침은 최대 2,000자까지 입력할 수 있습니다. 지침 작성에 관한 안내는 배치 전사 편집 가이드를 참조하세요.

모든 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의 단어 수준 타임스탬프는 편집된 텍스트가 아니라 원본 커밋 텍스트를 나타냅니다.

다음 단계