Saltar a la navegación

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 de streaming del lado del servidor.

Resumen

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 al menos 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 las fechas habladas en un formato fijo o desarrollar abreviaturas y acrónimos. La instrucción se pasa 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 al activar la función.

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

Activar la edición de transcripciones

Pasa 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 indicaciones sobre cómo redactar instrucciones.

En todos los SDK, las transcripciones editadas llegan a través del 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 incluye 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 cada 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 desordenadas. Usa el campo text para relacionar una edición con su transcripción confirmada.
  • Si no se realizaron 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 de committed_transcript_with_timestamps describen el texto confirmado original, no el texto editado.

Siguientes pasos