Transcripción de reuniones en español, en local y sin GPU. Captura el
micrófono y el audio del sistema (altavoces) por separado, transcribe con
faster-whisper medium int8 sobre CPU y te da el texto en una ventana
editable, una API HTTP o una extensión de Chrome. Pensado para Ubuntu con
PipeWire/PulseAudio.
El proyecto tiene cuatro piezas, cada una con su propia instalación:
| Pieza | Qué es | Cómo se arranca |
|---|---|---|
| App de escritorio | Ventana Qt (PySide6) para grabar y editar transcripciones | ./install.sh → menú de GNOME o .venv/bin/transcript |
| API HTTP | Servidor FastAPI local que graba/transcribe sin interfaz | make run o servicio systemd (make service-install) |
| Extensión de Chrome | Mando a distancia del navegador para la API | Cargar descomprimida en chrome://extensions |
| Script de reprocesado | Re-transcribe los WAV de una sesión, más rápido | .venv/bin/python scripts/reprocess_session.py |
Las tres primeras comparten el mismo motor (src/transcript/) y el mismo
modelo descargado; basta instalar las dependencias una vez.
Necesarios para cualquier pieza (la captura de audio depende de las utilidades de PulseAudio/PipeWire):
- Ubuntu 24.04+ (PipeWire o PulseAudio)
- Python 3.12+
pulseaudio-utils(parec,pactl)ffmpeg(opcional, para pruebas)uvrecomendado (si no está, se usapython -m venv)
sudo apt install -y pulseaudio-utils ffmpeg💡 Auriculares recomendados. Si los altavoces están abiertos, el micrófono captará también el audio del sistema y aparecerán líneas duplicadas (eco).
⚙️ CPU-only.
torch/torchaudiose instalan desde el índicedownload.pytorch.org/whl/cpu(configurado enpyproject.toml), evitando ~1.5 GB de librerías CUDA inútiles en equipos sin GPU NVIDIA.
Instalador todo-en-uno: crea el venv, instala dependencias, descarga el modelo e integra el lanzador en el menú de aplicaciones.
./install.shEl script:
- Crea un venv en
./.venvconuv(si está) opython -m venv. - Instala dependencias (
faster-whisper,PySide6,silero-vad, …) conpip install -e .. - Verifica/descarga el modelo
faster-whisper-medium(~1.5 GB, una sola vez) a la caché de Hugging Face. - Instala
transcript.desktopen~/.local/share/applications/para que aparezca en el menú de GNOME, con su icono.
Arranque: desde el menú de aplicaciones, o directamente:
.venv/bin/transcript # ejecutable instalado por el venv
# o, con uv:
make app # uv run transcriptDesinstalar el lanzador (no borra el venv ni la caché):
./uninstall.sh- Iniciar empieza a capturar y transcribir; el texto aparece en bloques
[Yo](mic) y[Sistema](altavoces) con timestamps. - El editor es editable mientras llegan líneas nuevas (el cursor se preserva al hacer append).
- Pausar (
Ctrl+Space) detiene la captura para editar sin interrupciones; Reanudar la reactiva. - Guardar (
Ctrl+S) / Guardar como… (Ctrl+Shift+S) escriben en~/Documentos/transcripciones/. - Hay backup raw incremental en
~/.cache/transcript/sessions/<id>/raw.md, que sobrevive a crashes. Menú Archivo → Recuperar sesión… para abrir uno previo.
Botón "Identificar speakers" (toggle) en la toolbar. Etiqueta las líneas de
la pista [Sistema] con un identificador estable por persona detectada:
[Sistema · Speaker_1]: Buenos días, ¿empezamos?
[Sistema · Speaker_2]: Sí, perfecto.
Usa embeddings ECAPA-TDNN (speechbrain) con asignación incremental por
similitud coseno. La primera vez descarga el modelo (~80 MB) a
~/.cache/transcript/models/ecapa-tdnn/. El toggle se guarda en
~/.config/transcript/settings.json y se puede cambiar en caliente.
Limitaciones honestas:
- La pista
[Yo]no se diariza (siempre eres tú). - En habla solapada o tras silencios largos, un speaker puede saltar de ID. Sirve como ayuda al lector/LLM, no como verdad absoluta.
- El umbral por defecto (
0.55) tiende a separar de más antes que mezclar.
Servidor FastAPI (transcript-api) que expone grabación, transcripción,
resumen y compartido por Slack como API REST en 127.0.0.1:8765. No tiene
interfaz: se controla por HTTP (p. ej. desde la extensión de Chrome).
make install # uv sync (crea/sincroniza el venv)Si ya instalaste la app de escritorio con
./install.sh, las dependencias de la API ya están dentro del mismo venv.
Copia la plantilla y rellena lo que necesites:
cp .env.example .env| Variable | Por defecto | Para qué |
|---|---|---|
TRANSCRIPT_SLACK_WEBHOOK |
— | Incoming Webhook de Slack para enviar resúmenes |
TRANSCRIPT_API_HOST |
127.0.0.1 |
Host de escucha |
TRANSCRIPT_API_PORT |
8765 |
Puerto de escucha |
TRANSCRIPT_SUMMARY_MODEL |
sonnet |
Modelo del CLI claude para resúmenes |
TRANSCRIPT_SUMMARY_TIMEOUT |
300 |
Timeout (s) del resumen |
Las variables ya exportadas en el entorno tienen prioridad sobre las del
.env.
make run # uv run transcript-apiEspera al log «Modelo Whisper cargado. API lista.» (el modelo se precarga
en el arranque para que el primer stop no pague la carga).
Se instala como unidad de usuario (systemctl --user) porque la captura de
audio necesita la sesión de PipeWire/PulseAudio del usuario:
make service-install # instala, habilita y arranca el servicio
make service-status # systemctl --user status
make service-logs # journalctl -f
make service-restart
make service-uninstall # para y elimina la unidad
make service-print # imprime la unidad sin instalar nada| Método | Ruta | Descripción |
|---|---|---|
GET |
/health |
Estado y si el modelo está cargado |
GET |
/status |
Estado del motor de grabación |
POST |
/recordings/start |
Inicia la grabación |
POST |
/recordings/stop |
Detiene y lanza la transcripción |
GET |
/transcriptions |
Lista de transcripciones |
GET |
/transcriptions/{id} |
Texto de una transcripción |
PATCH |
/transcriptions/{id} |
Renombra una sesión |
DELETE |
/transcriptions/{id} |
Borra una sesión |
POST |
/transcriptions/{id}/summary |
Resumen con el CLI claude |
POST |
/transcriptions/{id}/share/slack |
Envía el resumen a Slack |
Mando a distancia para la API local. El botón Grabar dispara la grabación de mic + audio del sistema en tu máquina (vía PipeWire), no en el navegador; al Detener, la API transcribe con Whisper.
Requisito previo: la API arrancada (make run o el servicio systemd) y
escuchando en http://127.0.0.1:8765.
- Abre
chrome://extensions. - Activa Modo de desarrollador (arriba a la derecha).
- Cargar descomprimida → selecciona la carpeta
extension/. - (Opcional) Fija el icono en la barra.
- Pulsa el icono para abrir el popup.
- ● Grabar inicia la grabación (badge REC en el icono).
- ■ Detener y transcribir para y lanza la transcripción (badge …).
- Al terminar, la grabación aparece como done; clic para leer el texto.
- El icono ⚙ permite cambiar la URL de la API (útil si arrancas en otro
puerto con
TRANSCRIPT_API_PORT).
Re-transcribe los WAV de una sesión usando el VAD interno de faster-whisper (procesa el WAV entero en chunks de 30s, mucho más rápido que el pipeline batch de la app). Ambas pistas se procesan en paralelo.
# Sesión más reciente en ~/.cache/transcript/sessions/
.venv/bin/python scripts/reprocess_session.py
# O una sesión concreta
.venv/bin/python scripts/reprocess_session.py ~/.cache/transcript/sessions/<id>Escribe el resultado en <session>/reprocessed.md y a stdout.
.venv/bin/python tests/smoke_capture.py # captura de audio
.venv/bin/python tests/smoke_asr.py # transcripción
.venv/bin/python tests/smoke_diar.py # diarización| Ruta | Contenido |
|---|---|
~/Documentos/transcripciones/ |
Transcripciones guardadas (editadas) |
~/.cache/transcript/sessions/<id>/ |
WAV crudos, raw.md, backups |
~/.cache/transcript/models/ |
Modelos descargados (ECAPA-TDNN) |
~/.config/transcript/settings.json |
Ajustes de la app (toggle de speakers, …) |