
Tutorial de OpenAI Whisper: guía completa de transcripción voz a texto
Eric King
Author
Tutorial de OpenAI Whisper: guía completa de transcripción voz a texto
OpenAI Whisper es un modelo de reconocimiento automático del habla (ASR) de código abierto pensado para la transcripción voz a texto y la traducción del habla. Admite varios idiomas, tolera bien acentos y ruido de fondo, y se usa mucho en podcasts, reuniones, entrevistas y subtítulos de vídeo.
Este tutorial completo le guiará en todo lo necesario para empezar con Whisper, desde la instalación hasta el uso avanzado.
¿Qué es OpenAI Whisper?
Whisper se entrenó con 680.000 horas de audio multilingüe, por lo que destaca en audio real e imperfecto. Es uno de los modelos de reconocimiento del habla de código abierto más precisos.
Características principales
- Soporte multilingüe: más de 99 idiomas
- Transcripción voz a texto: convierte audio en texto
- Traducción del habla: del habla directamente al inglés
- Detección de idioma: detecta automáticamente el idioma hablado
- Marcas de tiempo: a nivel de palabra y de segmento
- Código abierto y gratuito: licencia MIT, sin costes de API
- Funciona sin conexión: se ejecuta en local en su equipo
- Varios formatos: admite distintos formatos de audio y vídeo
Tamaños de modelo de Whisper
Whisper ofrece varios tamaños de modelo para equilibrar velocidad y precisión:
| Modelo | Parámetros | Velocidad | Precisión | Memoria | Caso de uso |
|---|---|---|---|---|---|
| tiny | 39M | ⭐⭐⭐⭐⭐ | ⭐⭐ | ~1 GB | Pruebas rápidas, demos |
| base | 74M | ⭐⭐⭐⭐ | ⭐⭐⭐ | ~1 GB | Audio sencillo, tareas rápidas |
| small | 244M | ⭐⭐⭐ | ⭐⭐⭐⭐ | ~2 GB | Uso general, equilibrado |
| medium | 769M | ⭐⭐ | ⭐⭐⭐⭐⭐ | ~5 GB | Audio ruidoso, alta precisión |
| large | 1550M | ⭐ | ⭐⭐⭐⭐⭐⭐ | ~10 GB | Máxima precisión, producción |
Recomendaciones:
- Para velocidad: use
tinyobase - Para equilibrio: use
smallomedium - Para precisión: use
largeolarge-v3 - Para producción: lo más habitual es
mediumolarge-v2
Requisitos previos
Antes de usar Whisper, asegúrese de tener:
- Python 3.8 o superior (se recomienda Python 3.9+)
- El gestor de paquetes pip
- FFmpeg instalado (para procesar audio y vídeo)
- (Opcional) GPU NVIDIA con CUDA para ir más rápido
- (Opcional) 4 GB+ de RAM para el modelo base, 10 GB+ para large
Paso 1: Instalación
Instalar Whisper
Instale el paquete OpenAI Whisper con pip:
pip install openai-whisper
O con una versión concreta:
pip install openai-whisper==20231117
Instalar FFmpeg
FFmpeg es necesario para decodificar archivos de audio y vídeo.
macOS (con Homebrew):
brew install ffmpeg
Ubuntu / Debian:
sudo apt update
sudo apt install ffmpeg
Windows:
- Descargue FFmpeg desde ffmpeg.org
- Descomprímalo y añádalo al PATH del sistema
- O use:
choco install ffmpeg(con Chocolatey)
Comprobar la instalación:
ffmpeg -version
whisper --version
Paso 2: Uso básico en Python
Transcripción sencilla
Así puede transcribir audio de la forma más simple:
import whisper
# Load model (downloads automatically on first use)
model = whisper.load_model("base")
# Transcribe audio file
result = model.transcribe("audio.mp3")
# Print transcription
print(result["text"])
Salida:
Hello everyone, welcome to today's meeting. We will discuss the project timeline and upcoming milestones.
Ejemplo completo con manejo 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)
print(f"✓ Transcription complete!")
print(f" Language: {result['language']}")
print(f" Duration: {result['segments'][-1]['end']:.2f}s")
return result
except Exception as e:
print(f"Error during transcription: {str(e)}")
return None
# Example usage
if __name__ == "__main__":
audio_file = "meeting.mp3"
result = transcribe_audio(audio_file, model_size="base")
if result:
print("\n" + "="*50)
print("TRANSCRIPTION:")
print("="*50)
print(result["text"])
Paso 3: Detección y especificación de idioma
Detección automática de idioma
Whisper detecta el idioma automáticamente:
import whisper
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
print(f"Detected language: {result['language']}")
print(f"Language probability: {result.get('language_probability', 0):.2%}")
print(f"\nTranscription:\n{result['text']}")
Especificar el idioma (más rápido y preciso)
Si conoce el idioma, indicarlo mejora la velocidad y la precisión:
import whisper
model = whisper.load_model("base")
# Specify language
result_en = model.transcribe("audio.mp3", language="en") # English
result_zh = model.transcribe("audio.mp3", language="zh") # Chinese
result_es = model.transcribe("audio.mp3", language="es") # Spanish
result_fr = model.transcribe("audio.mp3", language="fr") # French
result_de = model.transcribe("audio.mp3", language="de") # German
result_ja = model.transcribe("audio.mp3", language="ja") # Japanese
print(result_en["text"])
Idiomas admitidos:
Whisper admite más de 99 idiomas. Códigos habituales:
en– inglészh– chinoes– españolfr– francésde– alemánja– japonésko– coreanopt– portuguésru– rusoit– italiano
Paso 4: Marcas de tiempo y segmentos
Acceder a segmentos 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("\n" + "="*50)
print("Segments with Timestamps:")
print("="*50)
for segment in result["segments"]:
start = segment["start"]
end = segment["end"]
text = segment["text"].strip()
print(f"[{start:6.2f}s - {end:6.2f}s] {text}")
Salida:
Full Text:
Hello everyone, welcome to today's meeting. We will discuss the project timeline.
==================================================
Segments with Timestamps:
==================================================
[ 0.00s - 5.20s] Hello everyone, welcome to today's meeting.
[ 5.20s - 12.50s] We will discuss the project timeline.
Formatear marcas de tiempo como timecode
def format_timestamp(seconds):
"""Format seconds to HH:MM:SS."""
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
secs = int(seconds % 60)
return f"{hours:02d}:{minutes:02d}:{secs:02d}"
for segment in result["segments"]:
start_time = format_timestamp(segment["start"])
end_time = format_timestamp(segment["end"])
print(f"[{start_time} - {end_time}] {segment['text']}")
Marcas de tiempo por palabra
Active las marcas de tiempo por palabra para un cálculo preciso:
import whisper
model = whisper.load_model("base")
result = model.transcribe(
"audio.mp3",
word_timestamps=True # Enable word-level timestamps
)
for segment in result["segments"]:
print(f"\n[{segment['start']:.2f}s - {segment['end']:.2f}s]")
print(f"Text: {segment['text']}")
# Word-level timestamps
if "words" in segment:
print("Words:")
for word in segment["words"]:
print(f" {word['word']} [{word['start']:.2f}s - {word['end']:.2f}s]")
Paso 5: Traducción del habla
Whisper puede traducir el habla que no sea inglés directamente al inglés:
import whisper
model = whisper.load_model("base")
# Translate to English (regardless of source language)
result = model.transcribe("spanish_audio.mp3", task="translate")
print("Translated to English:")
print(result["text"])
# Original transcription (in original language)
result_original = model.transcribe("spanish_audio.mp3", task="transcribe")
print("\nOriginal language transcription:")
print(result_original["text"])
Casos de uso:
- Reuniones internacionales
- Procesamiento de contenido multilingüe
- Localización de contenidos
- Material para el aprendizaje de idiomas
Paso 6: Parámetros avanzados
Temperatura y tamaño de haz (beam size)
Controle la calidad y la velocidad de la transcripción:
import whisper
model = whisper.load_model("base")
result = model.transcribe(
"audio.mp3",
temperature=0.0, # Lower = more deterministic (0.0 recommended)
beam_size=5, # Higher = more accurate but slower (default: 5)
best_of=5, # Number of candidates to consider
patience=1.0, # Beam search patience
condition_on_previous_text=True, # Use context from previous segments
initial_prompt="This is a technical meeting about AI and machine learning." # Context prompt
)
Valores de temperatura
temperature=0.0: lo más determinista; recomendadotemperature=0.2-0.4: algo más de variacióntemperature=1.0: más creativo, menos preciso
Prompt inicial para contexto
Aporte contexto para mejorar la precisión:
result = model.transcribe(
"technical_meeting.mp3",
initial_prompt="This meeting discusses API endpoints, microservices, Kubernetes, and CI/CD pipelines."
)
result = model.transcribe(
"medical_audio.mp3",
initial_prompt="This is a medical consultation discussing patient symptoms and treatment options."
)
Paso 7: Interfaz de línea de comandos (CLI)
Whisper ofrece una interfaz de línea de comandos potente:
Uso básico de la CLI
whisper audio.mp3
Especificar el modelo
whisper audio.mp3 --model small
whisper audio.mp3 --model medium
whisper audio.mp3 --model large-v2
Especificar el idioma
whisper audio.mp3 --language en
whisper audio.mp3 --language zh
Formatos de salida
# SRT subtitles
whisper audio.mp3 --output_format srt
# VTT subtitles
whisper audio.mp3 --output_format vtt
# Text file
whisper audio.mp3 --output_format txt
# JSON (with all metadata)
whisper audio.mp3 --output_format json
# TSV (tab-separated values)
whisper audio.mp3 --output_format tsv
Opciones avanzadas de la CLI
# Full example with all options
whisper audio.mp3 \
--model medium \
--language en \
--task transcribe \
--output_format srt \
--output_dir ./transcripts \
--verbose True \
--temperature 0.0 \
--beam_size 5 \
--best_of 5 \
--fp16 True
Referencia de opciones de la CLI
| Opción | Descripción | Predeterminado |
|---|---|---|
--model | Tamaño del modelo (tiny, base, small, medium, large) | base |
--language | Código de idioma (en, zh, es, etc.) | Detección automática |
--task | transcribe o translate | transcribe |
--output_format | Formato de salida (txt, srt, vtt, json, tsv) | txt |
--output_dir | Directorio de salida | Directorio actual |
--temperature | Temperatura del muestreo | 0.0 |
--beam_size | Tamaño de haz para la búsqueda en haz | 5 |
--best_of | Número de candidatos | 5 |
--fp16 | Usar precisión FP16 (GPU) | True |
--verbose | Salida detallada | False |
Paso 8: Formatos de audio y vídeo admitidos
Whisper admite los formatos más habituales a través de FFmpeg:
Formatos admitidos
- Audio: MP3, WAV, M4A, FLAC, OGG, AAC, WMA
- Vídeo: MP4, AVI, MKV, MOV, WebM, FLV
- Streaming: puede procesar flujos de audio
Ejemplos de formatos
import whisper
model = whisper.load_model("base")
# Audio formats
model.transcribe("audio.mp3")
model.transcribe("audio.wav")
model.transcribe("audio.m4a")
model.transcribe("audio.flac")
# Video formats (extracts audio automatically)
model.transcribe("video.mp4")
model.transcribe("video.mkv")
model.transcribe("video.webm")
Paso 9: Ejemplo completo para producción
Aquí tiene un ejemplo completo listo para producción:
import whisper
import json
from pathlib import Path
from datetime import datetime
class WhisperTranscriber:
"""Production-ready Whisper transcription service."""
def __init__(self, model_size="base"):
"""Initialize transcriber with specified model."""
print(f"Loading Whisper model: {model_size}")
self.model = whisper.load_model(model_size)
print("✓ Model loaded successfully")
def transcribe_file(self, audio_path, output_dir="transcripts", **kwargs):
"""
Transcribe audio file and save results.
Args:
audio_path: Path to audio file
output_dir: Directory to save outputs
**kwargs: Additional transcribe parameters
"""
audio_path = Path(audio_path)
if not audio_path.exists():
raise FileNotFoundError(f"Audio file not found: {audio_path}")
output_path = Path(output_dir)
output_path.mkdir(exist_ok=True)
print(f"\nTranscribing: {audio_path.name}")
# Transcribe
result = self.model.transcribe(
str(audio_path),
word_timestamps=True,
**kwargs
)
# Prepare output data
output_data = {
"file": str(audio_path),
"transcribed_at": datetime.now().isoformat(),
"language": result["language"],
"language_probability": result.get("language_probability", 0),
"duration": result["segments"][-1]["end"] if result["segments"] else 0,
"text": result["text"],
"segments": result["segments"]
}
# Save outputs
base_name = audio_path.stem
# Save as text
text_file = output_path / f"{base_name}.txt"
with open(text_file, "w", encoding="utf-8") as f:
f.write(result["text"])
# Save as JSON
json_file = output_path / f"{base_name}.json"
with open(json_file, "w", encoding="utf-8") as f:
json.dump(output_data, f, indent=2, ensure_ascii=False)
# Save as SRT
srt_file = output_path / f"{base_name}.srt"
self._save_srt(result["segments"], srt_file)
print(f"✓ Transcription saved:")
print(f" - Text: {text_file}")
print(f" - JSON: {json_file}")
print(f" - SRT: {srt_file}")
return output_data
def _save_srt(self, segments, output_path):
"""Save segments as SRT subtitle file."""
with open(output_path, "w", encoding="utf-8") as f:
for i, segment in enumerate(segments, start=1):
start = self._format_srt_time(segment["start"])
end = self._format_srt_time(segment["end"])
text = segment["text"].strip()
f.write(f"{i}\n{start} --> {end}\n{text}\n\n")
def _format_srt_time(self, seconds):
"""Format seconds to SRT timestamp."""
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}"
# Usage
if __name__ == "__main__":
transcriber = WhisperTranscriber(model_size="base")
result = transcriber.transcribe_file(
"meeting.mp3",
output_dir="transcripts",
language="en",
temperature=0.0
)
print(f"\nLanguage: {result['language']}")
print(f"Duration: {result['duration']:.2f}s")
print(f"\nTranscription preview:")
print(result['text'][:200] + "...")
Paso 10: Buenas prácticas
1. Elija el modelo adecuado
# For speed (testing, demos)
model = whisper.load_model("tiny")
# For balance (general use)
model = whisper.load_model("base") # or "small"
# For accuracy (production)
model = whisper.load_model("medium") # or "large-v2"
2. Especifique el idioma cuando lo conozca
# Faster and more accurate
result = model.transcribe("audio.mp3", language="en")
# Instead of auto-detection
result = model.transcribe("audio.mp3") # Slower
3. Use una temperatura adecuada
# Recommended for most cases
result = model.transcribe("audio.mp3", temperature=0.0)
# For creative content (not recommended for transcription)
result = model.transcribe("audio.mp3", temperature=0.2)
4. Aporte contexto con un prompt inicial
# Technical content
result = model.transcribe(
"meeting.mp3",
initial_prompt="This meeting discusses software architecture, APIs, and deployment strategies."
)
# Medical content
result = model.transcribe(
"consultation.mp3",
initial_prompt="This is a medical consultation about patient symptoms and treatment."
)
5. Reutilice instancias del modelo
# Load once, reuse multiple times
model = whisper.load_model("base")
# Process multiple files
for audio_file in ["file1.mp3", "file2.mp3", "file3.mp3"]:
result = model.transcribe(audio_file)
# Process result...
6. Maneje archivos de audio largos
Para archivos de audio muy largos, considere dividirlos en fragmentos:
import whisper
from pydub import AudioSegment
def transcribe_long_audio(audio_path, chunk_length_ms=600000): # 10 minutes
"""Transcribe long audio by splitting into chunks."""
model = whisper.load_model("base")
# Load audio
audio = AudioSegment.from_file(audio_path)
duration_ms = len(audio)
all_text = []
all_segments = []
# Process in chunks
for i in range(0, duration_ms, chunk_length_ms):
chunk = audio[i:i + chunk_length_ms]
chunk_path = f"chunk_{i}.wav"
chunk.export(chunk_path, format="wav")
result = model.transcribe(chunk_path)
all_text.append(result["text"])
all_segments.extend(result["segments"])
# Clean up chunk file
os.remove(chunk_path)
return {
"text": " ".join(all_text),
"segments": all_segments
}
Problemas frecuentes y soluciones
Problema 1: no se encuentra FFmpeg
Error:
FileNotFoundError: ffmpegSolución:
# Install FFmpeg
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg
# Verify
ffmpeg -version
Problema 2: sin memoria
Error:
RuntimeError: CUDA out of memory o el sistema se queda sin RAMSoluciones:
# Use smaller model
model = whisper.load_model("base") # Instead of "large"
# Or use CPU
import torch
model = whisper.load_model("base", device="cpu")
# Or process in chunks (see above)
Problema 3: transcripción lenta
Problema: la transcripción es muy lenta
Soluciones:
# Use GPU if available
import torch
device = "cuda" if torch.cuda.is_available() else "cpu"
model = whisper.load_model("base", device=device)
# Use smaller model
model = whisper.load_model("tiny") # or "base"
# Reduce beam size (faster but slightly less accurate)
result = model.transcribe("audio.mp3", beam_size=1)
Problema 4: poca precisión
Problema: la transcripción tiene muchos errores
Soluciones:
# Use larger model
model = whisper.load_model("medium") # or "large"
# Specify language
result = model.transcribe("audio.mp3", language="en")
# Provide context
result = model.transcribe(
"audio.mp3",
initial_prompt="Context about the audio content..."
)
# Use optimal settings
result = model.transcribe(
"audio.mp3",
temperature=0.0,
beam_size=5,
best_of=5
)
Casos de uso
1. Transcripción de podcasts
model = whisper.load_model("medium")
result = model.transcribe("podcast.mp3", language="en")
# Save transcript
with open("podcast_transcript.txt", "w") as f:
f.write(result["text"])
2. Generación de subtítulos para YouTube
model = whisper.load_model("base")
result = model.transcribe("video.mp4", language="en")
# Generate SRT
# (Use CLI: whisper video.mp4 --output_format srt)
3. Notas de reuniones
model = whisper.load_model("base")
result = model.transcribe(
"meeting.mp3",
language="en",
initial_prompt="This is a business meeting discussing project updates and deadlines."
)
# Save with timestamps
for segment in result["segments"]:
print(f"[{segment['start']:.0f}s] {segment['text']}")
4. Transcripción de entrevistas
model = whisper.load_model("medium")
result = model.transcribe("interview.mp3", language="en")
# Export for editing
with open("interview.txt", "w") as f:
for segment in result["segments"]:
f.write(f"[{segment['start']:.2f}s] {segment['text']}\n")
5. Traducción de contenido multilingüe
model = whisper.load_model("base")
# Translate to English
result = model.transcribe("spanish_audio.mp3", task="translate")
print(result["text"]) # English translation
Whisper frente a alternativas
| Característica | Whisper | APIs en la nube | Faster-Whisper |
|---|---|---|---|
| Coste | Gratis | Pago por minuto | Gratis |
| Sin conexión | ✅ | ❌ | ✅ |
| Velocidad | Media | Rápida | Rápida (2–4×) |
| Precisión | Alta | Alta | Alta (igual) |
| Configuración | Fácil | Muy fácil | Fácil |
| Tiempo real | ❌ | ✅ | ❌ |
| Privacidad | ✅ Local | ❌ Nube | ✅ Local |
Elija Whisper cuando:
- Quiera transcripción gratuita y sin conexión
- La privacidad sea importante
- Necesite control sobre la infraestructura
- Procese lotes de archivos o contenido archivado
Elija APIs en la nube cuando:
- Necesite transcripción en tiempo real
- Quiera infraestructura gestionada
- Tenga presupuesto para costes de API
- Requiera soporte enterprise
Próximos pasos
Ahora que conoce lo básico, profundice aquí:
- Whisper Python Example – más ejemplos en Python
- Faster-Whisper Guide – transcripción 2–4× más rápida
- Whisper Accuracy Tips – mejore la calidad de la transcripción
- Whisper Transcript Formatting – formatee salidas (SRT, VTT, JSON)
- Whisper for Meetings – transcripción orientada a reuniones
Conclusión
OpenAI Whisper es uno de los modelos voz a texto de código abierto más potentes que existen hoy. Con un sólido soporte multilingüe, alta precisión de transcripción y capacidad total sin conexión, es una excelente opción para desarrolladores y creadores que quieren control total sobre su flujo de transcripción.
Ideas clave:
- Whisper admite más de 99 idiomas con alta precisión
- Elija el tamaño de modelo adecuado a sus necesidades
- Especifique el idioma cuando lo conozca para mejor rendimiento
- Use marcas de tiempo por palabra para un tiempo preciso
- Reutilice instancias del modelo en varios archivos
- Valore faster-whisper para despliegues en producción
Tanto si transcribe podcasts, genera subtítulos o procesa grabaciones de reuniones, Whisper ofrece una solución robusta, gratuita y respetuosa con la privacidad para la transcripción voz a texto.
¿Busca una solución profesional voz a texto? Visite SayToWords y descubra nuestra plataforma de transcripción con IA, con rendimiento optimizado y varios formatos de salida.