Saltar al contenido principal
Jordi Izquierdo Montalbán
Proyectos

Traductor en vivo

Traduzco en tiempo real todo lo que suena en mi PC: corta por pausas con Silero VAD, transcribe en GPU con mi propio motor de Whisper sobre ONNX Runtime, traduce en local con Ollama y lo lee en voz alta bajando el volumen del navegador. Subtítulos flotantes y exportación a SRT.

Código privado: te lo enseño en una entrevista

Python, Whisper (ONNX Runtime + DirectML), Silero VAD, Ollama, NumPy, sounddevice, Hugging Face Tokenizers, deep-translator, Argos Translate, Edge-TTS, SAPI5, yt-dlp, FFmpeg, Tkinter, pycaw, pywin32, Pillow, python-docx, ReportLab

El problema

Consumo mucho contenido técnico en inglés: vídeos, conferencias, reuniones. Las soluciones cloud de transcripción y traducción tienen tres problemas cuando las usas en serio: cobran por minuto, dependen de la red y no te dejan elegir qué audio escuchan.

Quería algo distinto: una app que escuchara lo que suena en mi PC, lo transcribiera en local con la GPU, lo tradujera, me lo leyera en voz alta y bajara el volumen del navegador mientras habla. Sin coste por minuto y sin que el audio saliera de mi máquina.

La solución: interfaz

Una app de escritorio para Windows con tres pestañas y un modo pensado para ver vídeos:

  • En vivo: traduce lo que suena en el PC (navegador, reuniones, vídeos) a través de un cable de audio virtual. Atajo Ctrl+Alt+T para arrancar o pausar.
  • Modo cine: una ventana flotante, siempre encima, con subtítulos transparentes sobre cualquier reproductor o plataforma de streaming.
  • Vídeo / URL: pego un enlace de YouTube, TikTok, Twitch o Instagram (o un MP4, MKV, MP3 o WAV del disco), lo transcribe con barra de progreso y exporta subtítulos .srt sincronizados.
  • Notas Markdown: traduce apuntes o documentación respetando bloques de código y tablas.
  • Lector de voz: la voz Helena de Windows sin latencia o voces neuronales de Edge-TTS, con velocidad de 0,5× a 2×. Mientras lee, Chrome, Edge, Firefox y Brave bajan de volumen solos.
  • Historial: cada sesión se guarda sola y se exporta a TXT, SRT, DOCX o PDF.
Interfaz del Traductor en vivo
La ventana principal: estado de escucha, selector de dispositivo e idioma, lector de voz y exportación.

La solución: arquitectura

Del audio del PC a subtítulos y voz traducidos, con la transcripción en local.

Decisiones técnicas

  • Cortar por silencios, no por tiempo. La primera versión cortaba el audio cada 5 segundos y partía frases por la mitad, lo que estropeaba la traducción. Con Silero VAD detecto las pausas reales del habla y le paso a Whisper frases completas. Corre en CPU con ONNX, así que no le quita GPU a la transcripción.
  • Mi propio motor de Whisper sobre ONNX Runtime. Windows (Control de aplicaciones inteligente) bloqueaba las DLL sin firma de PyTorch y CTranslate2. En vez de renunciar a la GPU, reimplementé el preproceso (el log-mel, en numpy) y la decodificación (voraz, con caché de claves y valores) sobre onnxruntime-directml, que está firmado por Microsoft. Resultado: transcripción en GPU sin CUDA (vale cualquier GPU con DirectX 12) y sin PyTorch. Elijo el modelo según la VRAM: large-v3-turbo, small o base.
  • Traducción local con un LLM pequeño. Un modelo de 1,5B parámetros en Ollama traduce frases conversacionales al instante y sin latencia de red.
  • Una cascada que nunca deja la pantalla en blanco. Si Ollama no está abierto o Google bloquea las peticiones, cambio solo a otro traductor (Google, MyMemory o Argos, que funciona sin conexión). La transcripción no se interrumpe nunca.
  • Tkinter, no web. Una app web necesitaría el navegador abierto, permisos de audio del navegador y un servidor. Tkinter habla directamente con Windows: lee los dispositivos sin capas intermedias y arranca al instante.
  • Ducking con la API de audio de Windows. Con pycaw localizo los procesos de los navegadores y les bajo el volumen mientras suena la voz. Cuando termina, lo devuelvo como estaba.

Stack desglosado

  • Captura de audio: sounddevice + numpy, a través de VB-Audio Virtual Cable.
  • Detección de voz: Silero VAD en ONNX (CPU).
  • Transcripción: Whisper (large-v3-turbo, small, base) sobre ONNX Runtime + DirectML, con mi motor propio (motor_onnx.py).
  • Traducción: Ollama (qwen2.5:1.5b) con deep-translator (Google, MyMemory) y Argos Translate de respaldo.
  • Voz: SAPI5 (voz Helena) y Edge-TTS para voces neuronales.
  • Vídeo / URL: yt-dlp + FFmpeg.
  • Interfaz: Tkinter con tema claro y oscuro, búsqueda con Ctrl+F y zoom con Ctrl+rueda.
  • Exportación: python-docx (DOCX), reportlab (PDF), SRT y TXT.

Resultados y aprendizajes

Lo que funcionó: que cada problema real me llevara a una decisión de arquitectura. El mejor ejemplo es el motor propio: cuando Windows bloqueó PyTorch, en lugar de abandonar la GPU reimplementé Whisper sobre ONNX Runtime. Aprendí cómo funciona Whisper por dentro (el espectrograma, el decodificador, la caché) y a elegir dependencias pensando en el entorno donde van a correr.

Lo que más me enseñó: el salto de la v1 a la actual. Empecé con Whisper tiny y cortes fijos de 5 segundos, y cada problema (frases partidas, esperas, caídas de Google, DLL bloqueadas) me obligó a decidir: VAD, motor propio, traducción local y cascada de respaldo. Ninguna salió de un tutorial; todas salieron de usarla.

Trabajo futuro: sacar la configuración a un fichero de entorno, empaquetarla en un instalador y auditarla con kit-iso.