Saltearse al contenido

Transcripción de voz

La Transcripción es una funcionalidad real y de producción respaldada por un servicio externo argus-transcription que usa Whisper con VAD (detección de actividad vocal). El SpeechTranscriptionService del lado del navegador recibe parciales en streaming + enunciados finalizados a través del canal de datos de LiveKit y los muestra en la burbuja de transcripción PTT, la línea de tiempo y el detector de comandos de voz.

Arquitectura

  • argus-transcription — pipeline Whisper + VAD del lado del servidor. Se une a la sala LiveKit de la misión como participante bot. Se suscribe a las pistas de audio PTT (AUDIO_PTT_TRACK_ID). Produce texto de transcripción.
  • Canal de datos de LiveKit — los mensajes de transcripción fluyen en un topic ptt_transcription.
  • SpeechTranscriptionService — consumidor del lado del cliente. Rastrea el estado por peer, expone enunciados en streaming + completos.

Parcial en vivo vs. finalizado

Cada mensaje de transcripción incluye isFinal: boolean:

  • isFinal: false — parcial. El texto se actualiza por segmento VAD mientras el hablante continúa. La burbuja de transcripción lo muestra en tiempo real.
  • isFinal: true — comprometido. Emitido en el Subject transcriptionComplete$, registrado en blackbox, añadido a la línea de tiempo de la operación como evento voice.utterance y pasado al detector de comandos de voz.

Modelo de estado del servicio

SpeechTranscriptionService expone:

  • liveTranscript — Observable del parcial que está en streaming actualmente.
  • lastTranscription — el enunciado finalizado más reciente.
  • transcriptionComplete$ — Subject disparado en cada enunciado finalizado.

Por peer, el servicio rastrea:

  • peerId — quién está hablando.
  • text — texto acumulado actual.
  • startedAt — cuándo comenzó la ráfaga.
  • missionId — para auditoría.
  • statusidle / streaming / done.

Idiomas

Whisper auto-detecta el idioma. Soportados de fábrica:

  • inglés.
  • español.
  • árabe (incluido transliterado).
  • Otros idiomas principales que Whisper maneja — francés, alemán, portugués, etc.

No hay UI de override de idioma por usuario — la auto-detección de Whisper es lo suficientemente robusta como para que los operadores normalmente no necesiten configurarla.

Redacción

La webapp no redacta actualmente la salida de transcripción del lado del cliente. El admin de tu org puede habilitar redacción de PII del lado del servidor en Admin → Organización → Integraciones → Transcripción; cuando está habilitado, patrones que coincidan con números de teléfono, matrículas, tarjetas de crédito y regex configurados por el operador se reemplazan por [REDACTED] antes de que el texto llegue al navegador.

Los comandos de voz se alimentan de esto

El detector de comandos de voz se suscribe a transcriptionComplete$ y compara con su lista de patrones de 17 comandos. Consulta esa página para la lista completa. Los comandos de voz solo se disparan en enunciados finalizados — nunca en texto parcial — para que el sistema no actúe sobre habla a medio formar.

Auditoría + reproducción

  • El tile de línea de tiempo registra cada enunciado finalizado como un evento voice.utterance con el texto completo y el hablante.
  • El grabador blackbox almacena el enunciado crudo más la URL del segmento de audio para reproducción.
  • El tile de comms muestra cada grabación PTT con su transcripción; el tile comms-ptt tiene reproducción inline con vista previa de transcripción.

Coste

El streaming de Whisper es el coste dominante — por segundo de habla activa. Medido por operación; visible en Admin → Organización → Uso. Cuando nadie habla, el coste es cero.

Limitaciones conocidas

  • Sin redacción del lado del cliente — depende de configuración del lado del servidor.
  • Sin diarización de hablantes — un PTT = un hablante (por diseño, ya que PTT es push-to-talk). En canales siempre activos no hay etiquetado por hablante.
  • Sin traducción en tiempo real — solo detección de idioma; no auto-traducción a un idioma de salida distinto.

Relacionado