Diarización de hablantes
Esta guía te muestra cómo identificar quién habla en transcripciones en tiempo real 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 diarización de hablantes asigna ID de hablante a las palabras para que puedas distinguir quién dijo qué. Con la diarización activada, las transcripciones parciales incluyen etiquetas de hablante provisionales, y cada transcripción confirmada va seguida de un evento diarized_transcript independiente. Las etiquetas de hablante pueden cambiar a medida que llega más audio.
Activar la diarización
Establece el parámetro de consulta booleano diarize=true al abrir una conexión WebSocket con model_id=scribe_v3_live. La diarización está desactivada (false) de forma predeterminada.
Los siguientes ejemplos del lado del servidor abren una conexión y reciben eventos. Instala websockets para Python, o ws y la dependencia de desarrollo @types/ws para TypeScript. Configura ELEVENLABS_API_KEY en el entorno de tu servidor; los ejemplos la envían en la cabecera xi-api-key. Guarda esta clave en el servidor, no en el código del navegador.
Estos ejemplos no envían audio. Intégralos con tu productor de audio siguiendo la guía de streaming del lado del servidor: envía mensajes input_audio_chunk en la misma conexión mientras recibes eventos. Los ejemplos seleccionan pcm_16000, así que utiliza audio compatible. En Python, ejecuta la tarea de envío de audio de forma simultánea con el bucle de recepción; en TypeScript, envía el audio después de que se abra la conexión.
Gestionar eventos
Transcripciones parciales
Con la diarización activada, cada partial_transcript incluye words provisionales con el mismo formato de palabra que la transcripción por lotes. El speaker_id de cada palabra es speaker_0, speaker_1, etc. una vez identificado un hablante, o null mientras no se resuelva.
Considera estas palabras provisionales: los ID de hablante y las marcas de tiempo pueden cambiar con más audio. Las palabras que aún no se han alineado no tienen marcas de tiempo (start y end son null o no están presentes).
Transcripciones confirmadas y diarizadas
La diarización no retrasa committed_transcript. Con la diarización activada, este evento añade un entero de base cero segment_index:
Cada confirmación va seguida de un evento diarized_transcript independiente con los valores segment_index, text y words correspondientes:
La palabra anterior muestra solo el texto y la etiqueta de hablante. El formato completo de palabra utiliza los mismos campos start, end, type, logprob y characters que la transcripción por lotes, junto con speaker_id. Un hablante sin resolver tiene un ID de hablante null.
Las transcripciones diarizadas se envían en orden de confirmación. Relaciónalas con las transcripciones confirmadas mediante segment_index, en lugar de hacerlo por texto o por el siguiente evento recibido. Siempre se envía un diarized_transcript por cada confirmación, aunque falle la identificación del hablante; en ese caso, los ID de hablante sin resolver son null.
Fusiones de hablantes
Un evento speakers_merged significa que dos ID de hablante se refieren a la misma persona:
Sustituye cada uso anterior de from_speaker_id por to_speaker_id tanto en las transcripciones parciales como en las diarizadas. Los ID de hablante nunca se reutilizan. Las fusiones pueden encadenarse, así que aplícalas en el orden en que se reciben: si speaker_2 se fusiona con speaker_1 y después speaker_1 se fusiona con speaker_0, todas las palabras anteriores de ambos ID deben acabar etiquetadas como speaker_0.
Por ejemplo, llama a este controlador para cada evento recibido. Aquí, transcript_history almacena cada transcripción parcial y diarizada que conserva la aplicación, incluidas las instantáneas parciales anteriores. Cada fusión actualiza todas las palabras almacenadas in situ, por lo que las fusiones encadenadas también actualizan las palabras fusionadas previamente. Muestra las etiquetas de hablante desde este almacenamiento actualizado; las etiquetas null siguen siendo null.
Limitaciones
- La diarización solo es compatible con
scribe_v3_live. Otros modelos devuelven un errorinvalid_requestcon el mensaje"The 'diarize' parameter is only supported by scribe_v3_live."y, después, cierran la conexión. - La diarización no se puede combinar con
filter_background_audio. Esta combinación devuelve un errorinvalid_requestcuyo mensaje contiene"cannot be combined with filter_background_audio"y, después, cierra la conexión. - Las etiquetas de hablante pueden permanecer sin resolver (
null), y los eventosspeakers_mergedposteriores pueden revisar etiquetas anteriores. Estos eventos de fusión solo se envían cuando la diarización está activada.