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 SubjecttranscriptionComplete$, registrado en blackbox, añadido a la línea de tiempo de la operación como eventovoice.utterancey 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.status—idle/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.utterancecon 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.