Ejemplo de Whisper en Python: guía completa de transcripción de voz a texto

Ejemplo de Whisper en Python: guía completa de transcripción de voz a texto

Eric King

Eric King

Author


Ejemplo de Whisper en Python: guía completa de transcripción de voz a texto

OpenAI Whisper es uno de los modelos de reconocimiento de voz de código abierto más potentes disponibles hoy. En esta guía completa aprenderá a usar Whisper con Python para transcribir archivos de audio a texto con alta precisión.
Este tutorial es ideal para:
  • Desarrolladores que crean funcionalidades de voz a texto
  • Científicos de datos que trabajan con audio
  • Cualquiera que busque un ejemplo completo de Whisper en Python

¿Qué es OpenAI Whisper?

Whisper es un sistema de reconocimiento automático del habla (ASR) entrenado con 680.000 horas de audio multilingüe. Puede:
  • Transcribir el habla en más de 99 idiomas
  • Detectar el idioma automáticamente
  • Traducir el habla al inglés
  • Gestionar audio con ruido y acentos
  • Procesar archivos de audio largos

Requisitos previos

Antes de empezar, asegúrese de tener:
  • Python 3.8+ instalado
  • el gestor de paquetes pip
  • FFmpeg instalado (para procesamiento de audio)
  • (Opcional) GPU NVIDIA para un procesamiento más rápido

Paso 1: Instalar Whisper

Instale el paquete OpenAI Whisper con pip:
pip install openai-whisper

Instalar FFmpeg

macOS (con Homebrew):
brew install ffmpeg
Ubuntu/Debian:
sudo apt update
sudo apt install ffmpeg
Windows: Descargue FFmpeg desde ffmpeg.org y agréguelo a su PATH.

Paso 2: Ejemplo básico de Whisper en Python

Aquí tiene un script sencillo en Python para transcribir un archivo de audio:
import whisper

# Load the Whisper model
model = whisper.load_model("base")

# Transcribe audio file
result = model.transcribe("audio.mp3")

# Print the transcription
print(result["text"])
Salida:
Hello everyone, welcome to today's meeting. We will discuss the project timeline and upcoming milestones.

Paso 3: Ejemplo completo en Python con manejo de errores

Aquí tiene un ejemplo más robusto con un manejo adecuado de errores:
import whisper
import os

def transcribe_audio(audio_path, model_size="base"):
    """
    Transcribe an audio file using Whisper.
    
    Args:
        audio_path (str): Path to the audio file
        model_size (str): Whisper model size (tiny, base, small, medium, large)
    
    Returns:
        dict: Transcription result with text and segments
    """
    try:
        # Check if audio file exists
        if not os.path.exists(audio_path):
            raise FileNotFoundError(f"Audio file not found: {audio_path}")
        
        # Load the Whisper model
        print(f"Loading Whisper model: {model_size}")
        model = whisper.load_model(model_size)
        
        # Transcribe the audio
        print(f"Transcribing: {audio_path}")
        result = model.transcribe(audio_path)
        
        return result
    
    except Exception as e:
        print(f"Error during transcription: {str(e)}")
        return None

# Example usage
if __name__ == "__main__":
    audio_file = "sample_audio.mp3"
    result = transcribe_audio(audio_file, model_size="base")
    
    if result:
        print("\nTranscription:")
        print(result["text"])

Paso 4: Ejemplo avanzado con detección de idioma

Whisper puede detectar el idioma automáticamente, pero también puede especificarlo usted:
import whisper

model = whisper.load_model("base")

# Auto-detect language
result = model.transcribe("audio.mp3")
print(f"Detected language: {result['language']}")
print(f"Transcription: {result['text']}")

# Specify language explicitly
result_en = model.transcribe("audio.mp3", language="en")
result_zh = model.transcribe("audio.mp3", language="zh")

Paso 5: Obtener marcas de tiempo y segmentos

Whisper proporciona información detallada por segmento con marcas de tiempo:
import whisper

model = whisper.load_model("base")
result = model.transcribe("audio.mp3")

# Print full transcription
print("Full Text:")
print(result["text"])

# Print segments with timestamps
print("\nSegments with Timestamps:")
for segment in result["segments"]:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.2f}s - {end:.2f}s] {text}")
Salida:
Full Text:
Hello everyone, welcome to today's meeting. We will discuss the project timeline.

Segments with Timestamps:
[0.00s - 2.50s] Hello everyone, welcome to today's meeting.
[2.50s - 5.80s] We will discuss the project timeline.

Paso 6: Traducir audio al inglés

Whisper puede traducir directamente al inglés el habla que no está en inglés:
import whisper

model = whisper.load_model("base")

# Translate to English
result = model.transcribe("spanish_audio.mp3", task="translate")

print("Translated text:")
print(result["text"])

Paso 7: Procesar varios archivos de audio

Así puede transcribir varios archivos por lotes:
import whisper
import os
from pathlib import Path

def batch_transcribe(audio_directory, model_size="base", output_dir="transcriptions"):
    """
    Transcribe all audio files in a directory.
    
    Args:
        audio_directory (str): Directory containing audio files
        model_size (str): Whisper model size
        output_dir (str): Directory to save transcriptions
    """
    # Create output directory
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model once
    model = whisper.load_model(model_size)
    
    # Supported audio formats
    audio_extensions = ['.mp3', '.wav', '.m4a', '.flac', '.ogg']
    
    # Process each audio file
    audio_files = [
        f for f in os.listdir(audio_directory)
        if any(f.lower().endswith(ext) for ext in audio_extensions)
    ]
    
    for audio_file in audio_files:
        audio_path = os.path.join(audio_directory, audio_file)
        print(f"\nProcessing: {audio_file}")
        
        try:
            result = model.transcribe(audio_path)
            
            # Save transcription to file
            output_file = os.path.join(
                output_dir,
                Path(audio_file).stem + ".txt"
            )
            
            with open(output_file, "w", encoding="utf-8") as f:
                f.write(result["text"])
            
            print(f"✓ Saved: {output_file}")
            
        except Exception as e:
            print(f"✗ Error processing {audio_file}: {str(e)}")

# Example usage
batch_transcribe("audio_files/", model_size="base")

Paso 8: Exportar al formato de subtítulos SRT

Cree archivos de subtítulos SRT a partir de las transcripciones:
import whisper

def transcribe_to_srt(audio_path, output_path, model_size="base"):
    """
    Transcribe audio and save as SRT subtitle file.
    
    Args:
        audio_path (str): Path to audio file
        output_path (str): Path to save SRT file
        model_size (str): Whisper model size
    """
    model = whisper.load_model(model_size)
    result = model.transcribe(audio_path)
    
    # Generate SRT content
    srt_content = ""
    for i, segment in enumerate(result["segments"], start=1):
        start_time = format_timestamp(segment["start"])
        end_time = format_timestamp(segment["end"])
        text = segment["text"].strip()
        
        srt_content += f"{i}\n"
        srt_content += f"{start_time} --> {end_time}\n"
        srt_content += f"{text}\n\n"
    
    # Save SRT file
    with open(output_path, "w", encoding="utf-8") as f:
        f.write(srt_content)
    
    print(f"SRT file saved: {output_path}")

def format_timestamp(seconds):
    """Convert seconds to SRT timestamp format (HH:MM:SS,mmm)."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

# Example usage
transcribe_to_srt("video.mp4", "subtitles.srt", model_size="base")

Comparación de tamaños de modelo de Whisper

Elija el tamaño de modelo adecuado según sus necesidades:
ModeloParámetrosVelocidadPrecisiónMemoriaCaso de uso
tiny39M⭐⭐⭐⭐⭐⭐⭐~1GBPruebas rápidas, audio sencillo
base74M⭐⭐⭐⭐⭐⭐⭐~1GBUso general
small244M⭐⭐⭐⭐⭐⭐⭐~2GBEquilibrio
medium769M⭐⭐⭐⭐⭐⭐⭐~5GBCuando necesite alta precisión
large1550M⭐⭐⭐⭐⭐⭐~10GBMáxima precisión, audio ruidoso

Buenas prácticas con Whisper en Python

1. Elija el tamaño de modelo adecuado

# Fast and lightweight
model = whisper.load_model("tiny")  # Good for testing

# Balanced
model = whisper.load_model("base")  # Good for most cases

# High accuracy
model = whisper.load_model("medium")  # For important transcriptions

2. Manejar archivos de audio largos

Para archivos de audio muy largos, considere dividir en fragmentos:
import whisper
from pydub import AudioSegment

def transcribe_long_audio(audio_path, chunk_length_ms=60000):
    """
    Transcribe long audio by splitting into chunks.
    
    Args:
        audio_path: Path to audio file
        chunk_length_ms: Length of each chunk in milliseconds
    """
    model = whisper.load_model("base")
    
    # Load audio
    audio = AudioSegment.from_file(audio_path)
    
    # Split into chunks
    chunks = []
    for i in range(0, len(audio), chunk_length_ms):
        chunks.append(audio[i:i + chunk_length_ms])
    
    # Transcribe each chunk
    full_text = []
    for i, chunk in enumerate(chunks):
        chunk_path = f"chunk_{i}.wav"
        chunk.export(chunk_path, format="wav")
        
        result = model.transcribe(chunk_path)
        full_text.append(result["text"])
        
        # Clean up chunk file
        os.remove(chunk_path)
    
    return " ".join(full_text)

3. Use la GPU para un procesamiento más rápido

Si dispone de una GPU NVIDIA:
import whisper

# Whisper will automatically use GPU if available
model = whisper.load_model("base", device="cuda")

4. Especifique el idioma para mayor precisión

# If you know the language, specify it
result = model.transcribe("audio.mp3", language="en")

Casos de uso habituales

Transcripción de podcasts

import whisper

model = whisper.load_model("medium")
result = model.transcribe("podcast_episode.mp3")

# Save transcript
with open("podcast_transcript.txt", "w") as f:
    f.write(result["text"])

Notas de reuniones

import whisper
from datetime import datetime

model = whisper.load_model("base")
result = model.transcribe("meeting_recording.mp3")

# Create formatted meeting notes
notes = f"""
Meeting Notes - {datetime.now().strftime('%Y-%m-%d')}
========================================

{result["text"]}
"""

with open("meeting_notes.txt", "w") as f:
    f.write(notes)

Subtítulos de vídeo

import whisper

model = whisper.load_model("base")
result = model.transcribe("video.mp4")

# Generate VTT subtitle file
vtt_content = "WEBVTT\n\n"
for segment in result["segments"]:
    start = format_vtt_timestamp(segment["start"])
    end = format_vtt_timestamp(segment["end"])
    text = segment["text"].strip()
    vtt_content += f"{start} --> {end}\n{text}\n\n"

with open("subtitles.vtt", "w") as f:
    f.write(vtt_content)

Solución de problemas habituales

Problema 1: no se encuentra FFmpeg

Error: FileNotFoundError: ffmpeg
Solución:
# Install FFmpeg
# macOS
brew install ffmpeg

# Ubuntu/Debian
sudo apt install ffmpeg

# Windows
# Download from ffmpeg.org and add to PATH

Problema 2: memoria insuficiente

Error: RuntimeError: CUDA out of memory
Solución:
# Use a smaller model
model = whisper.load_model("tiny")  # Instead of "large"

# Or use CPU
model = whisper.load_model("base", device="cpu")

Problema 3: procesamiento lento

Soluciones:
  • Use un modelo más pequeño (tiny o base)
  • Active la aceleración por GPU
  • Procese el audio en fragmentos
  • Use multiprocesamiento para trabajos por lotes

Consejos de rendimiento

  1. Use la GPU cuando esté disponible — 10-50× más rápido que la CPU
  2. Elija un tamaño de modelo adecuado — no use "large" para tareas sencillas
  3. Preprocese el audio — elimine silencios, normalice el volumen
  4. Procese por lotes — cargue el modelo una vez y procese varios archivos
  5. Use subprocesos — para operaciones ligadas a E/S

Whisper en Python frente a otras soluciones

CaracterísticaWhisper PythonGoogle Speech-to-TextAssemblyAI
CosteGratis (local)De pago por minutoDe pago por minuto
Sin conexión
PrecisiónAltaAltaAlta
ConfiguraciónMediaFácilFácil
Audio largo
Multilingüe

Ejemplo completo: script listo para producción

Aquí tiene un ejemplo completo y listo para producción:
#!/usr/bin/env python3
"""
Production-ready Whisper transcription script.
"""

import whisper
import argparse
import os
import json
from pathlib import Path
from datetime import datetime

def transcribe_file(
    audio_path,
    model_size="base",
    language=None,
    output_format="txt",
    output_dir=None
):
    """
    Transcribe an audio file with comprehensive output options.
    
    Args:
        audio_path: Path to audio file
        model_size: Whisper model size
        language: Language code (optional, auto-detected if None)
        output_format: Output format (txt, json, srt, vtt)
        output_dir: Output directory (default: same as audio file)
    """
    # Validate input file
    if not os.path.exists(audio_path):
        raise FileNotFoundError(f"Audio file not found: {audio_path}")
    
    # Set output directory
    if output_dir is None:
        output_dir = os.path.dirname(audio_path)
    os.makedirs(output_dir, exist_ok=True)
    
    # Load model
    print(f"Loading Whisper model: {model_size}")
    model = whisper.load_model(model_size)
    
    # Transcribe
    print(f"Transcribing: {audio_path}")
    transcribe_kwargs = {}
    if language:
        transcribe_kwargs["language"] = language
    
    result = model.transcribe(audio_path, **transcribe_kwargs)
    
    # Generate output filename
    base_name = Path(audio_path).stem
    output_path = os.path.join(output_dir, base_name)
    
    # Save based on format
    if output_format == "txt":
        with open(f"{output_path}.txt", "w", encoding="utf-8") as f:
            f.write(result["text"])
    
    elif output_format == "json":
        with open(f"{output_path}.json", "w", encoding="utf-8") as f:
            json.dump(result, f, indent=2, ensure_ascii=False)
    
    elif output_format == "srt":
        srt_content = generate_srt(result["segments"])
        with open(f"{output_path}.srt", "w", encoding="utf-8") as f:
            f.write(srt_content)
    
    elif output_format == "vtt":
        vtt_content = generate_vtt(result["segments"])
        with open(f"{output_path}.vtt", "w", encoding="utf-8") as f:
            f.write(vtt_content)
    
    print(f"✓ Transcription saved: {output_path}.{output_format}")
    print(f"  Language: {result['language']}")
    print(f"  Duration: {result['segments'][-1]['end']:.2f}s")
    
    return result

def generate_srt(segments):
    """Generate SRT subtitle content."""
    srt = ""
    for i, segment in enumerate(segments, start=1):
        start = format_timestamp(segment["start"])
        end = format_timestamp(segment["end"])
        text = segment["text"].strip()
        srt += f"{i}\n{start} --> {end}\n{text}\n\n"
    return srt

def generate_vtt(segments):
    """Generate VTT subtitle content."""
    vtt = "WEBVTT\n\n"
    for segment in segments:
        start = format_vtt_timestamp(segment["start"])
        end = format_vtt_timestamp(segment["end"])
        text = segment["text"].strip()
        vtt += f"{start} --> {end}\n{text}\n\n"
    return vtt

def format_timestamp(seconds):
    """Format timestamp for SRT."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

def format_vtt_timestamp(seconds):
    """Format timestamp for VTT."""
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d}.{millis:03d}"

def main():
    parser = argparse.ArgumentParser(
        description="Transcribe audio files using OpenAI Whisper"
    )
    parser.add_argument("audio", help="Path to audio file")
    parser.add_argument(
        "--model",
        default="base",
        choices=["tiny", "base", "small", "medium", "large"],
        help="Whisper model size"
    )
    parser.add_argument(
        "--language",
        default=None,
        help="Language code (e.g., 'en', 'zh', 'es')"
    )
    parser.add_argument(
        "--output-format",
        default="txt",
        choices=["txt", "json", "srt", "vtt"],
        help="Output format"
    )
    parser.add_argument(
        "--output-dir",
        default=None,
        help="Output directory"
    )
    
    args = parser.parse_args()
    
    transcribe_file(
        args.audio,
        model_size=args.model,
        language=args.language,
        output_format=args.output_format,
        output_dir=args.output_dir
    )

if __name__ == "__main__":
    main()
Uso:
# Basic usage
python transcribe.py audio.mp3

# With options
python transcribe.py audio.mp3 --model medium --language en --output-format srt

# Save to specific directory
python transcribe.py audio.mp3 --output-dir ./transcriptions

Conclusión

Esta guía completa de ejemplos de Whisper en Python incluye lo que necesita para empezar con la transcripción de voz a texto con OpenAI Whisper. Tanto si transcribe podcasts, reuniones o crea subtítulos, Whisper ofrece una solución potente y gratuita para convertir audio en texto.
Ideas clave:
  • Whisper es gratuito y de código abierto
  • Admite más de 99 idiomas
  • Funciona sin conexión (sin llamadas a API)
  • Alta precisión en la mayoría de los casos
  • Fácil de integrar en proyectos de Python
Para casos de producción que requieran transcripción en tiempo real o acceso por API, considere soluciones en la nube como SayToWords, que ofrece transcripción basada en Whisper mediante API.

¿Listo para empezar? Instale Whisper y transcriba hoy mismo su primer archivo de audio.

Pruébalo gratis ahora

Prueba ahora nuestro servicio de voz y audio/vídeo con IA. Disfruta de transcripción de voz a texto de alta precisión, traducción multilingüe y diarización inteligente de hablantes, además de generación automática de subtítulos de vídeo, edición inteligente de contenido audiovisual y análisis sincronizado de audio e imagen. Cubre por completo casos como actas de reuniones, creación de vídeos cortos y producción de pódcasts. ¡Empieza tu prueba gratuita hoy mismo!

Sonido a Texto OnlineSonido a Texto GratisConvertidor de Sonido a TextoSonido a Texto MP3Sonido a Texto WAVSonido a Texto con Marcas de TiempoVoz a texto para reunionesSound to Text Multi LanguageSonido a Texto SubtítulosConvertir WAV a textoVoz a TextoVoz a Texto en LíneaVoz a textoConvertir MP3 a textoConvertir grabación de voz a textoEscritura por Voz OnlineVoz a Texto con Marcas de TiempoVoz a Texto en Tiempo RealVoz a Texto para Audio LargoVoz a Texto para VideoVoz a Texto para YouTubeVoz a Texto para Edición de VideoVoz a Texto para SubtítulosVoz a Texto para PodcastsVoz a Texto para EntrevistasAudio de Entrevista a TextoVoz a Texto para GrabacionesVoz a Texto para ReunionesVoz a Texto para ConferenciasVoz a Texto para NotasVoz a Texto MultiidiomaVoz a Texto PrecisaVoz a Texto RápidaAlternativa Premiere Pro Voz a TextoAlternativa DaVinci Voz a TextoAlternativa VEED Voz a TextoAlternativa InVideo Voz a TextoAlternativa Otter.ai Voz a TextoAlternativa Descript Voz a TextoAlternativa Trint Voz a TextoAlternativa Rev Voz a TextoAlternativa Sonix Voz a TextoAlternativa Happy Scribe Voz a TextoAlternativa Zoom Voz a TextoAlternativa Google Meet Voz a TextoAlternativa Microsoft Teams Voz a TextoAlternativa Fireflies.ai Voz a TextoAlternativa Fathom Voz a TextoAlternativa FlexClip Voz a TextoAlternativa Kapwing Voz a TextoAlternativa Canva Voz a TextoVoz a Texto para Audio LargoVoz a Texto con IAVoz a Texto GratisVoz a Texto Sin AnunciosVoz a Texto para Audio con RuidoVoz a Texto con TiempoGenerar Subtítulos desde AudioTranscripción de Podcasts OnlineTranscribir Llamadas de ClientesVoz de TikTok a TextoAudio de TikTok a TextoVoz de YouTube a TextoAudio de YouTube a TextoNota de Voz a TextoMensaje de Voz de WhatsApp a TextoMensaje de Voz de Telegram a TextoTranscripción de Llamadas DiscordVoz de Twitch a TextoVoz de Skype a TextoVoz de Messenger a TextoMensaje de Voz de LINE a TextoTranscribir Vlogs a TextoConvertir Audio de Sermón a TextoConvertir Habla en EscrituraTraducir Audio a TextoConvertir Notas de Audio a TextoEscritura por VozEscritura por Voz para ReunionesEscritura por Voz para YouTubeHablar para EscribirEscritura Sin ManosVoz a PalabrasHabla a PalabrasHabla a Texto en LíneaOnline Transcription SoftwareHabla a Texto para ReunionesHabla a Texto RápidoReal Time Speech to TextLive Transcription AppHabla a Texto para TikTokSonido a Texto para TikTokHablar a PalabrasHablar a TextoTalk to Text FreeTalk to Text OnlineTalk to Text for YouTubeTalk to Text for SubtitlesTalk to Text for Content CreatorsTalk to Text for MeetingsAudio a EscrituraSonido a TextoHerramienta de Escritura por VozHerramienta de Escritura por HablaDictado por VozHerramienta de Transcripción LegalHerramienta de Dictado MédicoTranscripción de Audio JaponésTranscripción de Reuniones en CoreanoHerramienta de Transcripción de ReunionesAudio de Reunión a TextoConvertidor de Conferencias a TextoAudio de Conferencia a TextoTranscripción de Video a TextoGenerador de Subtítulos para TikTokTranscripción de Centro de LlamadasHerramienta de Audio de Reels a TextoTranscribir MP3 a TextoTranscribir archivo WAV a textoCapCut Voz a TextoCapCut Voz a TextoVoice to Text in EnglishAudio a Texto en InglésVoice to Text in SpanishVoice to Text in FrenchAudio a Texto en FrancésVoice to Text in GermanAudio a Texto en AlemánVoice to Text in JapaneseAudio a Texto en JaponésVoice to Text in KoreanAudio a Texto en CoreanoVoice to Text in PortugueseVoice to Text in ArabicVoice to Text in ChineseVoice to Text in HindiVoice to Text in RussianWeb Voice Typing ToolVoice Typing Website