Prompt: Transcripción Whisper de alta fidelidad para audio M4A de 4 horas

Caso de uso

Transcripción precisa de un archivo .m4a de larga duración (~4h) usando el modelo Whisper de OpenAI (o compatible).

Prompt

Escribe un script en Python que transcriba un archivo de audio en formato .m4a de aproximadamente 4 horas de duración con la máxima fidelidad posible usando el modelo Whisper.

Requisitos:

  1. Modelo: usa large-v3 (mayor precisión multilingüe) cargado localmente.
  2. Dispositivo: detecta automáticamente GPU (CUDA/MPS) o CPU con fp16 solo en CUDA.
  3. VAD (Voice Activity Detection): actívalo para omitir silencios y mejorar precisión — vad_filter=True con parámetros min_silence_duration_ms=500, speech_pad_ms=200.
  4. Idioma: si es conocido, pásalo en language= para evitar detección errónea; si es mixto ES/EN, usa detección automática pero con initial_prompt de contexto.
  5. Fragmentación: el audio de 4h debe trocearse en segmentos de ~30 min usando pydub o ffmpeg para evitar OOM, y transcribir cada chunk por separado.
  6. Condicionamiento: incluye un initial_prompt con nombres propios, jerga técnica y signos de puntuación esperados para guiar la decodificación.
  7. Beam search: usa beam_size=5, best_of=5, temperature con fallback [0.0, 0.2, 0.4, 0.6, 0.8] (muestreo múltiple como respaldo).
  8. Salida: guarda tres archivos — .txt (texto plano), .srt (subtítulos con timestamps), .json (segmentos con confianza media).
  9. Reanudable: cada chunk se guarda a disco antes de continuar; si el script se interrumpe, retoma desde el último chunk completado (checkpoint en progreso.json).
  10. Log por chunk: imprime tiempo transcurrido, duración del chunk y confianza media por segmento.

Estructura del script:

  • transcribe_chunk(path, out_dir, idx)
  • split_audio(path, chunk_minutes=30)
  • resume_or_start(audio_path)
  • main() con CLI (argparse): --input, --model, --language, --initial-prompt, --output-dir

Incluye también el comando ffmpeg para convertir el .m4a a WAV 16kHz mono si la GPU/CPU lo requiere antes de transcribir.

Notas de fidelidad alta

  • large-v3 > large-v2 > medium para calidad.
  • VAD reduce alucinaciones en silencios largos.
  • initial_prompt con vocabulario específico del dominio sube mucho la precisión de nombres propios.
  • Trocear evita OOM y permite reanudar.
  • condition_on_previous_text=True (default) mantiene coherencia跨 segmentos.

Comando de conversión previa (opcional)

ffmpeg -i input.m4a -ar 16000 -ac 1 -c:a pcm_s16le output_16k_mono.wav

Instalación de dependencias

pip install openai-whisper faster-whisper pydub
# ffmpeg debe estar instalado en el sistema

IMPORTANTE — Python 3.12 obligatorio. faster-whisper necesita onnxruntime (para el VAD silero anti-alucinación), y onnxruntime no tiene wheel para Python 3.14 en macOS arm64 (ni para el build free-threaded 3.14t). Recrear el venv con Python 3.12:

ASDF_PYTHON_VERSION=3.12.2 python -m venv .venv
.venv/bin/pip install -r requirements.txt

El .venv original en 3.14.4t se respalda como .venv.314t.

Alternativa recomendada: faster-whisper

faster-whisper (CTranslate2) es 4x más rápido y usa menos VRAM con calidad equivalente a large-v3. Para un audio de 4h en CPU/MPS conviene más:

from faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="auto", compute_type="auto")
segments, info = model.transcribe(
    "input.m4a",
    language="es",
    beam_size=5,
    vad_filter=True,
    vad_parameters=dict(min_silence_duration_ms=500, speech_pad_ms=200),
    initial_prompt="Lista de nombres propios y jerga del dominio aquí."
)

Estimación de tiempo (4h de audio)

  • GPU CUDA (RTX 3090, large-v3): ~25-40 min
  • Apple Silicon MPS (M1/M2/M3, faster-whisper int8): ~1.5-3h
  • CPU puro: 8-15h (no recomendado para 4h de audio)

Fuente

Generado para Nef, 2026-09-03.