#!/usr/bin/env bash # ============================================================================== # whisperize.sh — Script autónomo para preparar audio para Whisper # # Convierte CUALQUIER archivo de audio al formato que Whisper espera: # - Frecuencia de muestreo: 16.000 Hz (16 kHz) # - Canales: Mono (1) # - Formato: PCM signed 16-bit little-endian (pcm_s16le) # - Normalizado con loudnorm (EBU R128, -23 LUFS) # # Uso: # ./whisperize.sh grabacion.mp3 → grabacion_whisper.wav # ./whisperize.sh grabacion.mp3 salida → salida.wav # # atareao con Linux — Episodio 842 # ============================================================================== set -euo pipefail # ── Colores (si terminal lo soporta) ────────────────────────────────────── if [ -t 1 ]; then VERDE='\033[0;32m' AMARILLO='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # Sin color else VERDE=''; AMARILLO=''; CYAN=''; NC='' fi # ── Ayuda ───────────────────────────────────────────────────────────────── usage() { echo "Uso: $0 [salida]" echo "" echo "Prepara un archivo de audio para su transcripción con Whisper." echo "" echo "Argumentos:" echo " entrada Ruta al archivo de audio original (cualquier formato)" echo " salida Ruta del archivo WAV resultante (opcional)" echo "" echo "Si no se especifica salida, se genera: _whisper.wav" echo "" echo "Ejemplos:" echo " $0 grabacion.mp3" echo " $0 audio.ogg michelada_whisper.wav" exit 0 } # ── Parsear argumentos ──────────────────────────────────────────────────── if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then usage fi ENTRADA="$1" SALIDA="${2:-${ENTRADA%.*}_whisper.wav}" # ── Validar entrada ─────────────────────────────────────────────────────── if [ ! -f "$ENTRADA" ]; then echo -e "${AMARILLO}❌ Error: No se encuentra el archivo '${ENTRADA}'${NC}" >&2 exit 1 fi if ! command -v ffmpeg &>/dev/null; then echo -e "${AMARILLO}❌ Error: ffmpeg no está instalado.${NC}" >&2 echo " Instálalo con: sudo apt install ffmpeg" >&2 exit 1 fi # ── Mostrar info del archivo original ───────────────────────────────────── echo -e "${CYAN}🎤 whisperize — Preparando audio para Whisper${NC}" echo "" ORIG_SIZE=$(stat -c%s "$ENTRADA" 2>/dev/null || echo "?") echo -e " ${VERDE}Entrada:${NC} $ENTRADA ($([ -f "$ENTRADA" ] && echo "$(du -h "$ENTRADA" | cut -f1)" || echo "?"))" echo -e " ${VERDE}Salida:${NC} $SALIDA" echo "" # Mostrar info del audio original (si ffprobe está disponible) if command -v ffprobe &>/dev/null; then echo " Información del original:" ffprobe -v quiet -show_entries \ stream=codec_name,sample_rate,channels:format=format_name,duration \ -of default=noprint_wrappers=1 "$ENTRADA" 2>/dev/null \ | sed 's/^/ /' echo "" fi # ── Convertir ───────────────────────────────────────────────────────────── echo -e " ${VERDE}Procesando...${NC}" ffmpeg -y \ -i "$ENTRADA" \ -ar 16000 \ -ac 1 \ -c:a pcm_s16le \ -af loudnorm \ "$SALIDA" 2>&1 \ | grep -E "(size=|bitrate=|Output)" \ | sed 's/^/ /' echo "" echo -e " ${VERDE}✅ Listo:${NC} $SALIDA ($(du -h "$SALIDA" | cut -f1))" echo "" echo -e " ${CYAN}📋 Resumen:${NC}" echo " Frecuencia: 16 kHz Canales: Mono Formato: PCM s16le" echo " Volumen: Normalizado (loudnorm, -23 LUFS)" echo " Listo para: whisper transcribe"