2-1Estructura de Proyecto y Puesta en Marcha de Whisper con Python
Estructura de Proyecto y Puesta en Marcha de Whisper con Python
Vamos a ver cómo hacer funcionar Whisper en un proyecto real y la estructura recomendada para organizar tu código.
Estructura Recomendada del Proyecto
/proyecto-whisper
│
├── /audios # Carpeta para archivos de audio de entrada
│ ├── entrada1.mp3
│ └── entrada2.wav
│
├── /transcripciones # Carpeta para resultados de transcripción
│ ├── salida1.txt
│ └── salida1.json
│
├── config.py # Configuraciones del proyecto
├── main.py # Script principal
├── requirements.txt # Dependencias
└── README.md # DocumentaciónPaso 1: Configuración Inicial
Crea la estructura de carpetas
Crea el archivo
requirements.txt:
openai-whisper
python-dotenv
tqdmInstala las dependencias:
pip install -r requirements.txtPaso 2: Configuración (config.py)
import os
from dotenv import load_dotenv
# Cargar variables de entorno
load_dotenv()
# Configuración
class Config:
# Directorios
AUDIO_INPUT_DIR = "audios"
TRANSCRIPT_OUTPUT_DIR = "transcripciones"
# Modelo Whisper (tiny, base, small, medium, large)
MODEL_NAME = os.getenv("WHISPER_MODEL", "base")
# Idioma (None para auto-detectar)
LANGUAGE = os.getenv("LANGUAGE", "es")
# Formato de salida
OUTPUT_FORMATS = ["txt", "json", "srt"]Paso 3: Código Principal (main.py)
import os
import whisper
import json
from tqdm import tqdm
from config import Config
def transcribe_audio(input_path, output_base, config):
"""Transcribe un archivo de audio usando Whisper"""
# Cargar modelo
model = whisper.load_model(config.MODEL_NAME)
# Transcribir
result = model.transcribe(
input_path,
language=config.LANGUAGE,
verbose=False
)
# Guardar resultados en diferentes formatos
if "txt" in config.OUTPUT_FORMATS:
with open(f"{output_base}.txt", "w", encoding="utf-8") as f:
f.write(result["text"])
if "json" in config.OUTPUT_FORMATS:
with open(f"{output_base}.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
if "srt" in config.OUTPUT_FORMATS:
with open(f"{output_base}.srt", "w", encoding="utf-8") as f:
for i, segment in enumerate(result["segments"], start=1):
f.write(f"{i}\n")
f.write(f"{segment['start']:.3f} --> {segment['end']:.3f}\n")
f.write(f"{segment['text']}\n\n")
return result
def process_all_audios(config):
"""Procesa todos los archivos de audio en el directorio de entrada"""
# Crear directorio de salida si no existe
os.makedirs(config.TRANSCRIPT_OUTPUT_DIR, exist_ok=True)
# Obtener lista de archivos de audio
audio_files = [
f for f in os.listdir(config.AUDIO_INPUT_DIR)
if f.lower().endswith(('.mp3', '.wav', '.m4a', '.ogg'))
]
if not audio_files:
print(f"No se encontraron archivos de audio en {config.AUDIO_INPUT_DIR}")
return
print(f"Procesando {len(audio_files)} archivo(s) de audio...")
for audio_file in tqdm(audio_files, desc="Transcribiendo audios"):
input_path = os.path.join(config.AUDIO_INPUT_DIR, audio_file)
output_base = os.path.join(
config.TRANSCRIPT_OUTPUT_DIR,
os.path.splitext(audio_file)[0]
)
try:
transcribe_audio(input_path, output_base, config)
except Exception as e:
print(f"\nError procesando {audio_file}: {str(e)}")
if __name__ == "__main__":
config = Config()
process_all_audios(config)
print("Proceso completado!")Paso 4: Poner en Marcha el Proyecto
Coloca tus archivos de audio en la carpeta
/audiosEjecuta el script principal:
python main.pyEncuentra los resultados en
/transcripciones:Archivos
.txtcon el texto transcritoArchivos
.jsoncon todos los metadatosArchivos
.srtcon subtítulos con marcas de tiempo
Optimizaciones Adicionales
1. Usar GPU (si está disponible)
Instala la versión de PyTorch para GPU:
pip uninstall torch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1182. Procesamiento por lotes con multiprocesamiento
Modifica main.py para usar múltiples núcleos:
from multiprocessing import Pool, cpu_count
def process_single_audio(args):
audio_file, config = args
input_path = os.path.join(config.AUDIO_INPUT_DIR, audio_file)
output_base = os.path.join(
config.TRANSCRIPT_OUTPUT_DIR,
os.path.splitext(audio_file)[0]
)
try:
transcribe_audio(input_path, output_base, config)
return (audio_file, True)
except Exception as e:
return (audio_file, False, str(e))
def process_all_audios(config):
# ... (código anterior para crear directorios)
audio_files = [f for f in os.listdir(config.AUDIO_INPUT_DIR)
if f.lower().endswith(('.mp3', '.wav', '.m4a', '.ogg'))]
if not audio_files:
print(f"No se encontraron archivos de audio en {config.AUDIO_INPUT_DIR}")
return
print(f"Procesando {len(audio_files)} archivo(s) de audio con {cpu_count()} procesos...")
with Pool(processes=cpu_count()) as pool:
results = list(tqdm(
pool.imap(process_single_audio, [(f, config) for f in audio_files]),
total=len(audio_files),
desc="Transcribiendo audios"
))
# Mostrar resumen de resultados
success = sum(1 for r in results if r[1])
errors = len(audio_files) - success
print(f"\nProceso completado: {success} éxitos, {errors} errores")
if errors > 0:
print("\nErrores encontrados:")
for r in results:
if not r[1]:
print(f"- {r[0]}: {r[2]}")Posibles Problemas y Soluciones
Error de memoria: Usa un modelo más pequeño (
tinyobase) o divide el audio en segmentosAudio muy largo: Procesa por fragmentos de 30-60 segundos
Baja calidad de transcripción:
Prueba con el modelo
largeEspecifica el idioma exacto
Mejora la calidad del audio de entrada
Conclusión
Esta estructura te permite:
Organizar fácilmente tus archivos de entrada/salida
Configurar el modelo según tus necesidades
Procesar múltiples archivos automáticamente
Obtener resultados en diferentes formatos
Escalar usando múltiples núcleos del CPU
¿Necesitas alguna adaptación específica para tu caso de uso? ¡Déjame saber en los comentarios
Comentarios
Publicar un comentario