← Proyectos

TranscribeLocal

Transcribe audio y vídeo y saca subtítulos con Whisper dentro del navegador, sin subir nada a ningún servidor. Distingue quién habla, resume con un modelo de lenguaje local, exporta a SRT, VTT, TXT, JSON y Markdown y funciona como app instalable (PWA), con WebGPU o WebAssembly.

Un diálogo transcrito, con el reproductor resaltando la frase que suena
La transcripción separada por hablantes, con un número de color para cada vozLa transcripción con los botones para exportarla a TXT, SRT, VTT, JSON y MarkdownEl gestor de modelos, con los que están guardados en el navegador y un botón para borrar cada unoTranscribeLocal en modo oscuro
modelos de IA en local
4
modelos de IA en local
archivos subidos
0
archivos subidos
tests (Vitest)
237
tests (Vitest)
idiomas
100
idiomas

Qué hace

  • Transcribir audio y vídeo. Arrastras un archivo y Whisper lo convierte en texto con marcas de tiempo, con el modelo que elijas: de tiny (~75 MB) a large-v3-turbo (~1,5 GB).
  • Cien idiomas. Detecta el idioma solo o se lo indicas tú.
  • Subtítulos listos. Exporta a SRT y VTT, con cada frase en su tiempo, y también a TXT, JSON y Markdown.
  • Reproductor sincronizado. Mientras suena el audio se resalta la frase que se está diciendo, y al pulsar una frase salta a ese momento.
  • Quién habla. Separa la transcripción por hablantes (Hablante 1, Hablante 2…).
  • Resumen. Un modelo de lenguaje pequeño, Qwen2.5, lo resume sin salir del equipo.
  • Grabar. Desde el micrófono o desde el audio de otra pestaña del navegador.
  • Modelos bajo control. Se descargan una vez, se quedan en el navegador y un gestor enseña cuánto ocupan y deja borrarlos.
  • Instalable y sin conexión. Es una PWA: una vez descargados los modelos, funciona sin internet.

Cómo está hecho

Whisper en el navegador

Transformers.js ejecuta los modelos en formato ONNX con WebGPU si hay GPU, y con WebAssembly si no. Cada tarea (transcribir, separar hablantes, resumir) va en su propio Web Worker, así que la interfaz no se congela aunque el modelo tarde.

Del archivo al modelo

El audio se decodifica con la Web Audio API, se mezcla a mono y se remuestrea a 16 kHz, que es lo que espera Whisper. Los audios de más de 30 segundos se transcriben en trozos de 30 segundos que se solapan 5.

Quién habla, en tres pasos

pyannote-segmentation-3.0 recorre el audio en ventanas de 10 segundos y marca dónde habla cada voz. WeSpeaker convierte cada intervención en un vector. Un agrupamiento propio por similitud del coseno decide qué vectores son la misma persona en todo el audio.

Problemas que resolví

  • Whisper se inventaba frases en los silencios. El audio prácticamente mudo o de menos de un cuarto de segundo ya no llega al modelo, y en los audios cortos no se trocea, porque el relleno de silencio provocaba bucles de texto repetido.
  • Los audios largos se cortaban a los 30 segundos. Sin trocear, el extractor de características de Whisper descarta todo lo que pasa de ahí sin avisar.
  • Alucinaciones en WebGPU. El codificador de Whisper necesita fp32 para no inventar texto en otros idiomas, mientras que el decodificador va en q4 para no agotar la memoria.
  • Resúmenes sin sentido. Con el modelo cuantizado en q8, WebGPU devolvía una mezcla de idiomas y fragmentos de código. Ahora va en q4 en WebGPU y en q8 en WebAssembly.
  • Descargas que se cortaban a los 5 minutos. El service worker de la PWA interceptaba las descargas de los modelos, y Chrome corta un service worker que tarda más de 5 minutos en responder. Ahora los modelos van directos a la caché de Transformers.js y no se guardan dos veces.

Stack

Nuxt 4Vue 3TypeScriptTransformers.jsONNX Runtime WebWebGPUWebAssemblyWeb WorkersWeb Audio APIMediaRecorderWhisperpyannoteWeSpeakerQwen2.5PWATailwind CSSVitestPlaywrightGitHub Actions

Artículos