Edición de transcripciones

Esta guía te muestra cómo aplicar instrucciones de edición en lenguaje natural a transcripciones confirmadas con la API de Voz a Texto en Tiempo Real.

Guía práctica · Da por hecho que has completado la guía de streaming del lado del cliente o streaming del lado del servidor.

Descripción general

La edición de transcripciones es una función experimental y añade un recargo del 30 % al coste base de la transcripción, facturado por un mínimo de 10 segundos de audio por cada transcripción confirmada. Consulta la página de precios de la API para obtener información detallada sobre los precios.

La transcripción en tiempo real puede aplicar una instrucción de edición en lenguaje natural a cada transcripción confirmada; por ejemplo, para escribir fechas pronunciadas con un formato fijo o para desarrollar abreviaturas y acrónimos. La instrucción se envía una vez al abrir la conexión, y cada transcripción confirmada va seguida de un evento edited_transcript independiente con el texto editado.

Las transcripciones parciales nunca se editan. El evento committed_transcript tampoco cambia, por lo que las integraciones existentes siguen funcionando cuando activas esta función.

La edición de transcripciones no se puede combinar con entity_detection. Las conexiones que configuran ambas opciones se rechazan con un error invalid_request.

Activar la edición de transcripciones

Envía la instrucción con la opción transcriptEdit al conectarte (el parámetro de consulta transcript_edit de la API de WebSocket). La instrucción puede tener hasta 2000 caracteres. Consulta la guía de edición de transcripciones por lotes para obtener orientación sobre cómo escribir instrucciones.

En todos los SDK, las transcripciones editadas llegan mediante el evento RealtimeEvents.EDITED_TRANSCRIPT.

Lado del cliente

Usa @elevenlabs/client en el navegador con un token de un solo uso emitido por tu servidor, como se describe en la guía de streaming del lado del cliente.

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

Lado del servidor

Usa el SDK oficial en tu servidor, como se describe en la guía de streaming del lado del servidor. Solo difieren de esa guía la opción y el controlador de eventos; el envío de audio y el cierre de la conexión funcionan igual.

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

Recibir transcripciones editadas

Cuando está activada, cada transcripción confirmada va seguida de un evento edited_transcript que contiene el texto confirmado y su versión editada:

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

Comportamiento que debes tener en cuenta:

  • Las ediciones se aplican por segmento confirmado. El evento edited_transcript se emite poco después del evento committed_transcript correspondiente, ya que la edición se ejecuta de forma asíncrona. Puede llegar después de la siguiente transcripción parcial, y las ediciones de segmentos consecutivos pueden llegar fuera de orden. Usa el campo text para asociar una edición a su transcripción confirmada.
  • Si no se han realizado ediciones en un segmento, edited_text es idéntico a text.
  • Si no se puede generar una edición para un segmento, no se envía ningún evento edited_transcript para él. El evento committed_transcript no se ve afectado.
  • Las marcas de tiempo por palabra en committed_transcript_with_timestamps describen el texto confirmado original, no el texto editado.

Siguientes pasos