Teleprompter local con IA
Teleprompter que avanza al ritmo de la voz usando Whisper local, sin enviar datos a la nube.
01 Problema y contexto
Un teleprompter convencional avanza a velocidad fija y obliga al presentador a seguirle el ritmo, no al revés. La alternativa habitual (reconocimiento de voz en la nube) implica mandar a un tercero el audio de un guion que casi siempre es material todavía no publicado.
Un teleprompter convencional avanza a velocidad fija y obliga al presentador a seguirle el ritmo. La alternativa habitual, reconocimiento de voz en la nube, implica mandar a un tercero el audio de un guion que casi siempre es material todavía no publicado. Este proyecto resuelve el avance por voz con el reconocedor corriendo en la máquina del propio presentador, sobre GPU, bajo la restricción de que la latencia percibida sea lo bastante baja como para que el texto no se sienta a destiempo.
02 Solución
El texto avanza al ritmo de la voz, con el reconocedor corriendo en la máquina del presentador sobre GPU. Captura en fragmentos de 500 ms a 16 kHz con detección de actividad de voz para no avanzar en los silencios, y emparejamiento contra el guion por ventana deslizante con avance monótono. Ni el audio ni el guion salen del equipo.
- Definición del contrato de datos antes de escribir el backend: el mensaje de avance quedó congelado como esquema con índice, palabra reconocida, confianza y latencia.
- Verificación del entorno antes de construir nada encima: comprobaciones aisladas de CUDA, del micrófono y de la carga del modelo.
- Captura de audio en un hilo productor que alimenta una cola de fragmentos de 500 ms a 16 kHz mono, con detección de actividad de voz para no avanzar durante los silencios.
- Emparejamiento contra el guion por ventana deslizante con normalización Unicode y avance monótono; se descartó la distancia de edición global por costo y el alineamiento forzado por falta de acceso a los logits.
- Interfaz de lectura y transporte por WebSocket que descarta los mensajes de avance obsoletos, más una ventana nativa para segunda pantalla.
03 Resultados
Cifras verificables en el repositorio y su documentación:
04 Cómo está construido
Teleprompter de escritorio que sincroniza el desplazamiento del guion con la voz del locutor en tiempo real, con procesamiento 100% offline. Captura el audio del micrófono, lo transcribe localmente con faster-whisper sobre GPU NVIDIA (CUDA) y alinea la transcripción con el guion mediante un matcher determinista con matching difuso, comunicando la posición al frontend por WebSocket desde un backend FastAPI. Incluye modo auto-scroll clásico, directivas de escena ignoradas por el reconocedor y un modo stealth como app nativa con pywebview.
05 Decisiones éticas
- El reconocimiento se resolvió con un modelo local en GPU en vez de un servicio en la nube precisamente porque lo que se lee en un teleprompter suele ser inédito: ni el audio ni el guion salen del equipo.
- El modo de ventana sin bordes existe para grabar contenido propio sin que la consola aparezca en pantalla. Está descrito como lo que es, una decisión de presentación.
06 Aspectos destacados
- Reconocimiento de voz local con faster-whisper acelerado por CUDA, configurable por variables de entorno (modelo, dispositivo, precisión).
- Algoritmo de alineación determinista guion-transcripción con normalización Unicode y matching difuso tipo Levenshtein ≤ 1.
- Backend FastAPI con protocolo WebSocket propio que orquesta captura de audio, STT y matcher en tiempo real.
- Modo stealth como aplicación nativa vía pywebview, con always-on-top y bloqueo de interacción.
- Frontend en HTML/CSS/JS vanilla con auto-scroll, directivas de escena entre corchetes y atajos de teclado.
07 Limitaciones
No hay dataset propio ni entrenamiento: se usa faster-whisper tal cual, con el idioma fijado a español porque la autodetección cuesta latencia y precisión. Los objetivos de latencia están escritos en el repositorio pero siguen sin medirse: hasta que se midan son objetivos y no resultados. El emparejamiento trabaja sobre la superficie del texto y no sobre alineamiento forzado, así que las muletillas y los acentos marcados lo degradan y el desfase puede acumularse; el atajo de resincronización manual está identificado y no implementado. Todo lo probado corre sobre una única configuración.