Edycja transkrypcji

Ten przewodnik pokazuje, jak stosować instrukcje edycji w języku naturalnym do zatwierdzonych transkrypcji za pomocą API Realtime Speech to Text.

Poradnik · Zakłada, że masz już za sobą poradnik o streamingu po stronie klienta lub streamingu po stronie serwera.

Omówienie

Edycja transkrypcji to funkcja eksperymentalna, która zwiększa podstawowy koszt transkrypcji o 30%. Opłata jest naliczana za co najmniej 10 sekund audio na każdą zatwierdzoną transkrypcję. Szczegółowe informacje o cenach znajdziesz na stronie cen API.

Transkrypcja w czasie rzeczywistym może stosować instrukcję edycji w języku naturalnym do każdej zatwierdzonej transkrypcji, na przykład aby zapisywać wypowiedziane daty w stałym formacie albo rozwijać skróty i akronimy. Instrukcję przekazujesz raz przy otwieraniu połączenia, a po każdej zatwierdzonej transkrypcji pojawia się osobne zdarzenie edited_transcript z edytowanym tekstem.

Częściowe transkrypcje nigdy nie są edytowane. Zdarzenie committed_transcript również się nie zmienia, więc obecne integracje nadal działają po włączeniu tej funkcji.

Edycji transkrypcji nie można łączyć z entity_detection. Połączenia ustawiające oba parametry są odrzucane z błędem invalid_request.

Włączanie edycji transkrypcji

Przekaż instrukcję w opcji transcriptEdit podczas łączenia (parametr zapytania transcript_edit w WebSocket API). Instrukcja może mieć do 2000 znaków. Wskazówki dotyczące pisania instrukcji znajdziesz w poradniku edycji transkrypcji wsadowych.

We wszystkich SDK edytowane transkrypcje przychodzą przez zdarzenie RealtimeEvents.EDITED_TRANSCRIPT.

Po stronie klienta

Użyj @elevenlabs/client w przeglądarce z tokenem jednorazowym wydanym przez twój serwer, jak opisano w poradniku streamingu po stronie klienta.

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);
});

Po stronie serwera

Użyj oficjalnego SDK na serwerze, jak opisano w poradniku streamingu po stronie serwera. Od tego poradnika różnią się tylko opcja i obsługa zdarzenia; wysyłanie audio oraz zamykanie połączenia działają tak samo.

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())

Odbieranie edytowanych transkrypcji

Po włączeniu funkcji po każdej zatwierdzonej transkrypcji pojawia się zdarzenie edited_transcript zawierające zatwierdzony tekst i jego edytowaną wersję:

{
"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"
}

Warto pamiętać o tym, że:

  • Edycje są stosowane do każdego zatwierdzonego segmentu osobno. Zdarzenie edited_transcript jest wysyłane krótko po odpowiadającym mu zdarzeniu committed_transcript, ponieważ edycja działa asynchronicznie. Może nadejść po kolejnej częściowej transkrypcji, a edycje kolejnych segmentów mogą nadejść w innej kolejności. Użyj pola text, aby dopasować edycję do zatwierdzonej transkrypcji.
  • Jeśli segment nie został zmieniony, edited_text jest identyczne z text.
  • Jeśli nie można utworzyć edycji segmentu, nie jest dla niego wysyłane zdarzenie edited_transcript. Nie wpływa to na zdarzenie committed_transcript.
  • Znaczniki czasu na poziomie słów w committed_transcript_with_timestamps opisują oryginalny zatwierdzony tekst, a nie tekst po edycji.

Następne kroki