
Consejos de precisión de Whisper: cómo mejorar la calidad de la transcripción
Eric King
Author
Consejos de precisión de Whisper: cómo mejorar la calidad de la transcripción
OpenAI Whisper ya es uno de los modelos de reconocimiento de voz de código abierto más precisos, pero hay varias estrategias para maximizar la calidad de la transcripción. Esta guía cubre consejos prácticos, ejemplos de código y buenas prácticas para mejorar la precisión de Whisper en sus casos de uso.
Esta guía es ideal para:
- Desarrolladores que optimizan la precisión de la transcripción con Whisper
- Creadores de contenido que transcriben podcasts y vídeos
- Investigadores que trabajan con datos de audio
- Cualquiera que busque consejos de precisión de Whisper
Comprender los factores de precisión de Whisper
Antes de las optimizaciones, conviene saber qué afecta a la precisión de Whisper:
- Calidad del audio (lo más importante)
- Tamaño del modelo
- Precisión de la detección de idioma
- Preprocesado del audio
- Parámetros de configuración
- Duración del audio y segmentación
Consejo 1: Elija el tamaño de modelo adecuado
Whisper ofrece cinco tamaños de modelo, cada uno equilibra velocidad y precisión de forma distinta:
import whisper
# Model sizes from fastest to most accurate:
# tiny, base, small, medium, large
# For maximum accuracy, use medium or large
model = whisper.load_model("medium") # Best balance
# or
model = whisper.load_model("large") # Maximum accuracy
Guía de selección de modelos:
| Model | Accuracy | Speed | Use When |
|---|---|---|---|
| tiny | ⭐⭐ | ⭐⭐⭐⭐⭐ | Quick testing, simple audio |
| base | ⭐⭐⭐ | ⭐⭐⭐⭐ | General purpose, balanced |
| small | ⭐⭐⭐⭐ | ⭐⭐⭐ | Good accuracy, reasonable speed |
| medium | ⭐⭐⭐⭐⭐ | ⭐⭐ | High accuracy needed |
| large | ⭐⭐⭐⭐⭐⭐ | ⭐ | Best accuracy, noisy audio |
Ejemplo de código:
import whisper
def transcribe_with_optimal_model(audio_path, prioritize_accuracy=True):
"""
Select model based on accuracy vs speed priority.
Args:
audio_path: Path to audio file
prioritize_accuracy: True for accuracy, False for speed
"""
if prioritize_accuracy:
model_size = "medium" # or "large" for best accuracy
else:
model_size = "base" # or "small" for balanced
model = whisper.load_model(model_size)
result = model.transcribe(audio_path)
return result
# For critical transcriptions
result = transcribe_with_optimal_model("important_meeting.mp3", prioritize_accuracy=True)
Conclusión clave: Use los modelos
medium o large cuando la precisión sea crítica. El coste en velocidad suele merecer la pena para contenido importante.Consejo 2: Especifique el idioma cuando lo conozca
Whisper puede detectar el idioma automáticamente, pero indicarlo explícitamente mejora la precisión:
import whisper
model = whisper.load_model("base")
# Auto-detect (less accurate)
result_auto = model.transcribe("audio.mp3")
# Specify language (more accurate)
result_en = model.transcribe("audio.mp3", language="en")
result_zh = model.transcribe("audio.mp3", language="zh")
result_es = model.transcribe("audio.mp3", language="es")
Por qué ayuda:
- Reduce errores de detección de idioma
- Mejora la precisión con hablantes multilingües
- Acelera el procesamiento (omite la detección)
- Mejor manejo de acentos y dialectos
Ejemplo con detección de idioma:
import whisper
import langdetect
def transcribe_with_language_detection(audio_path, model_size="base"):
"""
Detect language first, then transcribe with explicit language.
"""
model = whisper.load_model(model_size)
# Quick language detection
result_quick = model.transcribe(audio_path, language=None)
detected_lang = result_quick["language"]
# Re-transcribe with detected language for better accuracy
result = model.transcribe(audio_path, language=detected_lang)
return result
result = transcribe_with_language_detection("audio.mp3")
Consejo 3: Preprocese el audio antes de transcribir
El preprocesado puede mejorar notablemente la precisión de Whisper:
import whisper
import numpy as np
from scipy.io import wavfile
from scipy import signal
def preprocess_audio(audio_path, output_path):
"""
Preprocess audio to improve transcription accuracy.
"""
# Read audio file
sample_rate, audio = wavfile.read(audio_path)
# Normalize audio (scale to [-1, 1])
if audio.dtype == np.int16:
audio = audio.astype(np.float32) / 32768.0
elif audio.dtype == np.int32:
audio = audio.astype(np.float32) / 2147483648.0
# Remove DC offset
audio = audio - np.mean(audio)
# Normalize volume
max_val = np.max(np.abs(audio))
if max_val > 0:
audio = audio / max_val * 0.95 # Leave headroom
# Resample to 16kHz (Whisper's optimal sample rate)
if sample_rate != 16000:
num_samples = int(len(audio) * 16000 / sample_rate)
audio = signal.resample(audio, num_samples)
sample_rate = 16000
# Save preprocessed audio
wavfile.write(output_path, sample_rate, (audio * 32767).astype(np.int16))
return output_path
# Usage
preprocessed = preprocess_audio("raw_audio.wav", "preprocessed.wav")
model = whisper.load_model("base")
result = model.transcribe(preprocessed)
Pasos de preprocesado:
- Normalizar niveles – volumen consistente
- Eliminar offset DC – eliminar sesgo constante
- Remuestrear a 16 kHz – frecuencia óptima para Whisper
- Eliminar silencios – centrarse en el habla
- Reducir ruido – limpiar el fondo
Consejo 4: Use la temperatura para mejores resultados
El parámetro
temperature de Whisper controla la aleatoriedad. Valores más bajos pueden mejorar la precisión:import whisper
model = whisper.load_model("base")
# Default temperature (0.0)
result_default = model.transcribe("audio.mp3")
# Lower temperature for more deterministic results
result_low_temp = model.transcribe(
"audio.mp3",
temperature=0.0, # Most deterministic
best_of=5, # Try multiple decodings, pick best
beam_size=5 # Beam search size
)
Ajustes de temperatura:
temperature=0.0: Más determinista, mejor para precisióntemperature=0.2: Ligera aleatoriedad, buen equilibriotemperature=0.6: Por defecto, equilibrado- Valores más altos: más creativo pero menos preciso
Buena práctica:
def transcribe_with_optimal_settings(audio_path, model_size="base"):
"""
Use optimal settings for maximum accuracy.
"""
model = whisper.load_model(model_size)
result = model.transcribe(
audio_path,
temperature=0.0, # Most deterministic
best_of=5, # Try 5 decodings, pick best
beam_size=5, # Beam search
patience=1.0, # Patience for beam search
condition_on_previous_text=True, # Use context
initial_prompt="This is a conversation about technology." # Context hint
)
return result
Consejo 5: Proporcione un prompt inicial de contexto
Dar contexto sobre el contenido mejora la precisión:
import whisper
model = whisper.load_model("base")
# Without context
result_basic = model.transcribe("meeting.mp3")
# With context (much better accuracy)
result_context = model.transcribe(
"meeting.mp3",
initial_prompt="This is a business meeting discussing project timelines and deliverables."
)
# For technical content
result_tech = model.transcribe(
"lecture.mp3",
initial_prompt="This is a computer science lecture about machine learning and neural networks."
)
Cuándo usar prompts iniciales:
- Contenido técnico: incluya términos del dominio
- Nombres y lugares: mencione sustantivos propios importantes
- Acentos: describa el acento o dialecto
- Contexto: describa el entorno o el tema
Ejemplo:
def transcribe_with_context(audio_path, context_description):
"""
Transcribe with context for better accuracy.
"""
model = whisper.load_model("medium")
result = model.transcribe(
audio_path,
initial_prompt=context_description,
language="en"
)
return result
# Example usage
result = transcribe_with_context(
"interview.mp3",
"This is an interview with Dr. Sarah Johnson about medical research. "
"The conversation includes technical medical terminology."
)
Consejo 6: Maneje bien los archivos de audio largos
Los archivos muy largos pueden reducir la precisión. Así puede manejarlos:
import whisper
from pydub import AudioSegment
import os
def transcribe_long_audio(audio_path, model_size="base", chunk_length_minutes=30):
"""
Transcribe long audio by splitting into optimal chunks.
"""
model = whisper.load_model(model_size)
# Load audio
audio = AudioSegment.from_file(audio_path)
chunk_length_ms = chunk_length_minutes * 60 * 1000
# 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 = []
all_segments = []
for i, chunk in enumerate(chunks):
chunk_path = f"temp_chunk_{i}.wav"
chunk.export(chunk_path, format="wav")
print(f"Transcribing chunk {i+1}/{len(chunks)}")
result = model.transcribe(chunk_path)
# Adjust timestamps for chunk offset
offset = i * chunk_length_ms / 1000.0
for segment in result["segments"]:
segment["start"] += offset
segment["end"] += offset
all_segments.append(segment)
full_text.append(result["text"])
# Clean up
os.remove(chunk_path)
# Combine results
combined_result = {
"text": " ".join(full_text),
"segments": all_segments,
"language": result["language"]
}
return combined_result
# Usage
result = transcribe_long_audio("long_podcast.mp3", model_size="medium", chunk_length_minutes=30)
Buenas prácticas para audio largo:
- Dividir en fragmentos de 20–30 minutos
- Usar el mismo tamaño de modelo en todos los fragmentos
- Mantener contexto entre fragmentos
- Fusionar segmentos con marcas de tiempo correctas
Consejo 7: Optimice para audio ruidoso
Whisper tolera bien el ruido, pero puede mejorar aún más:
import whisper
import noisereduce as nr
import soundfile as sf
import numpy as np
def transcribe_noisy_audio(audio_path, model_size="medium"):
"""
Reduce noise before transcription for better accuracy.
"""
# Load audio
audio, sample_rate = sf.read(audio_path)
# Reduce noise
reduced_noise = nr.reduce_noise(
y=audio,
sr=sample_rate,
stationary=False, # For non-stationary noise
prop_decrease=0.8 # Reduce noise by 80%
)
# Save cleaned audio
cleaned_path = "cleaned_audio.wav"
sf.write(cleaned_path, reduced_noise, sample_rate)
# Transcribe with larger model (better for noisy audio)
model = whisper.load_model(model_size)
result = model.transcribe(cleaned_path)
# Clean up
os.remove(cleaned_path)
return result
# Usage
result = transcribe_noisy_audio("noisy_recording.mp3", model_size="medium")
Para audio ruidoso:
- Use modelos
mediumolarge - Preprocese con reducción de ruido
- Aumente el parámetro
best_of - Proporcione contexto sobre las condiciones de ruido
Consejo 8: Use marcas de tiempo por palabra para más control
Las marcas de tiempo a nivel de palabra permiten un control más fino:
import whisper
model = whisper.load_model("base")
# Get word timestamps
result = model.transcribe(
"audio.mp3",
word_timestamps=True # Enable word-level timestamps
)
# Access word timestamps
for segment in result["segments"]:
print(f"Segment: {segment['text']}")
print(f"Start: {segment['start']:.2f}s, End: {segment['end']:.2f}s")
if "words" in segment:
for word in segment["words"]:
print(f" Word: {word['word']} ({word['start']:.2f}s - {word['end']:.2f}s)")
Casos de uso:
- Subtítulos: sincronización precisa por palabra
- Corrección de errores: identificar palabras problemáticas
- Búsqueda: encontrar palabras concretas en el texto
- Análisis del habla: patrones de habla
Consejo 9: Combine varias decodificaciones
El parámetro
best_of prueba varias decodificaciones y elige la mejor:import whisper
model = whisper.load_model("base")
# Single decoding (default)
result_single = model.transcribe("audio.mp3")
# Multiple decodings, pick best (more accurate)
result_best = model.transcribe(
"audio.mp3",
best_of=5, # Try 5 decodings
temperature=(0.0, 0.2, 0.4, 0.6, 0.8) # Different temperatures
)
Compromisos:
- Precisión: mayor con varias decodificaciones
- Velocidad: más lenta (5× con
best_of=5) - Úselo cuando: la precisión sea crítica y la velocidad menos importante
Consejo 10: Postprocese las transcripciones
El postprocesado puede corregir errores habituales de Whisper:
import re
import whisper
def post_process_transcript(text):
"""
Fix common transcription errors.
"""
# Fix common contractions
text = re.sub(r"\b(\w+) '(\w+)\b", r"\1'\2", text) # Fix spacing in contractions
# Fix common homophones (add your own)
replacements = {
"there": "their", # Context-dependent
"its": "it's", # Context-dependent
# Add more based on your domain
}
# Capitalize sentences
sentences = re.split(r'([.!?]\s+)', text)
capitalized = []
for i, sentence in enumerate(sentences):
if sentence.strip():
capitalized.append(sentence[0].upper() + sentence[1:] if len(sentence) > 1 else sentence.upper())
else:
capitalized.append(sentence)
return "".join(capitalized)
# Usage
model = whisper.load_model("base")
result = model.transcribe("audio.mp3")
processed_text = post_process_transcript(result["text"])
Ejemplo completo: optimización de precisión lista para producción
Ejemplo completo que combina varios consejos de precisión:
import whisper
import os
from pathlib import Path
def transcribe_with_maximum_accuracy(
audio_path,
model_size="medium",
language=None,
context_prompt=None,
output_format="txt"
):
"""
Transcribe audio with maximum accuracy using best practices.
Args:
audio_path: Path to audio file
model_size: Whisper model size (medium or large recommended)
language: Language code (None for auto-detect)
context_prompt: Initial prompt for context
output_format: Output format (txt, json, srt)
"""
# Load model (medium or large for best accuracy)
print(f"Loading Whisper model: {model_size}")
model = whisper.load_model(model_size)
# Prepare transcription parameters
transcribe_kwargs = {
"temperature": 0.0, # Most deterministic
"best_of": 5, # Try multiple decodings
"beam_size": 5, # Beam search
"patience": 1.0,
"condition_on_previous_text": True,
"word_timestamps": True, # Get word-level timestamps
}
# Add language if specified
if language:
transcribe_kwargs["language"] = language
# Add context prompt if provided
if context_prompt:
transcribe_kwargs["initial_prompt"] = context_prompt
# Transcribe
print(f"Transcribing: {audio_path}")
result = model.transcribe(audio_path, **transcribe_kwargs)
# Post-process
result["text"] = post_process_transcript(result["text"])
# Save result
base_name = Path(audio_path).stem
output_path = f"{base_name}_transcript.{output_format}"
if output_format == "txt":
with open(output_path, "w", encoding="utf-8") as f:
f.write(result["text"])
elif output_format == "json":
import json
with open(output_path, "w", encoding="utf-8") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
print(f"✓ Transcription saved: {output_path}")
print(f" Language: {result['language']}")
print(f" Duration: {result['segments'][-1]['end']:.2f}s")
return result
# Example usage
result = transcribe_with_maximum_accuracy(
audio_path="important_meeting.mp3",
model_size="medium",
language="en",
context_prompt="This is a business meeting discussing quarterly results and project updates.",
output_format="txt"
)
Comparación de precisión: antes y después de optimizar
Qué puede esperar con la optimización:
| Optimization | Accuracy Improvement | Speed Impact |
|---|---|---|
| Model size (base → medium) | +15-20% | -50% |
| Language specification | +5-10% | +10% (faster) |
| Initial prompt | +5-15% | No impact |
| Temperature=0.0 | +2-5% | No impact |
| best_of=5 | +3-8% | -80% (5x slower) |
| Audio preprocessing | +10-20% | Minimal |
Las mejoras combinadas pueden aumentar la precisión un 30–50% respecto a la configuración por defecto.
Resumen de buenas prácticas
Para máxima precisión:
- ✅ Use el modelo
mediumolarge - ✅ Especifique el idioma explícitamente
- ✅ Proporcione contexto con
initial_prompt - ✅ Use
temperature=0.0para resultados deterministas - ✅ Active
word_timestampspara salida detallada - ✅ Preprocese audio ruidoso
- ✅ Divida archivos largos en fragmentos
- ✅ Use
best_of=5para contenido crítico
Para equilibrio velocidad/precisión:
- ✅ Use el modelo
smallobase - ✅ Deje que Whisper detecte el idioma automáticamente
- ✅ Use la temperatura por defecto
- ✅ Omita el parámetro
best_of - ✅ Procese archivos con preprocesado mínimo
Errores frecuentes a evitar
❌ Usar el modelo tiny para contenido importante
Solución: Use al menos
base, preferiblemente small o medium❌ No especificar el idioma
Solución: Especifique siempre el idioma cuando lo conozca
❌ Ignorar el contexto
Solución: Use
initial_prompt para contenido especializado❌ Usar ajustes por defecto con audio ruidoso
Solución: Use modelos mayores y preprocesado
❌ Procesar archivos muy largos sin dividir
Solución: Divida en fragmentos de 20–30 minutos
Solución de problemas de precisión
Problema: Baja precisión con términos técnicos
Solución:
result = model.transcribe(
"technical_audio.mp3",
initial_prompt="This audio contains technical terminology related to machine learning, neural networks, and deep learning."
)
Problema: Mala precisión con acentos
Solución:
# Use larger model
model = whisper.load_model("medium")
# Provide accent context
result = model.transcribe(
"accented_audio.mp3",
initial_prompt="This speaker has a British accent.",
language="en"
)
Problema: Errores con nombres propios
Solución:
# Include names in initial prompt
result = model.transcribe(
"interview.mp3",
initial_prompt="This interview features Dr. Sarah Johnson and Professor Michael Chen discussing research."
)
Conclusión
Mejorar la precisión de Whisper consiste en tomar las decisiones adecuadas:
- Selección del modelo: Elija
mediumolargepara contenido crítico - Configuración: Use temperatura y decodificación óptimas
- Contexto: Proporcione información del dominio
- Preprocesado: Limpie el audio antes de transcribir
- Postprocesado: Corrija errores habituales automáticamente
Ideas clave:
- El tamaño del modelo tiene el mayor impacto en la precisión
- Especificar el idioma mejora mucho los resultados
- Los prompts de contexto ayudan con contenido especializado
- Varias decodificaciones (
best_of) aumentan la precisión pero ralentizan el proceso - La calidad del audio sigue siendo el factor más importante
Siguiendo estos consejos de precisión de Whisper, puede lograr una calidad de transcripción comparable o superior a servicios comerciales de voz a texto, manteniendo el control total de sus datos y su flujo de trabajo.
¿Listo para mejorar la precisión de Whisper? Empiece usando un modelo mayor e indicando el idioma: verá mejoras de inmediato.