
Cómo eliminar el ruido de fondo para STT: guía completa de reducción de ruido para speech-to-text
Eric King
Author
Cómo eliminar el ruido de fondo para STT: guía completa de reducción de ruido para speech-to-text
El ruido de fondo es uno de los desafíos más comunes al transcribir grabaciones de audio. Ya sea ruido de tráfico, tecleo de teclado, aire acondicionado o ruido de multitudes, eliminar el ruido de fondo antes del procesamiento de speech-to-text puede mejorar significativamente la precisión de la transcripción.
Esta guía completa cubre métodos prácticos para eliminar ruido de fondo para STT, desde soluciones de software sencillas hasta técnicas avanzadas de procesamiento de audio.
¿Por qué eliminar el ruido de fondo para STT?
El ruido de fondo impacta negativamente la precisión de speech-to-text de varias formas:
- La relación señal-ruido (SNR) reducida hace más difícil que los modelos distingan la voz
- Enmascaramiento de frecuencias cuando el ruido se superpone con las frecuencias de la voz
- Confusión del modelo cuando los patrones de ruido se parecen al habla
- Menores puntuaciones de confianza que generan más errores de transcripción
- Mayor tiempo de procesamiento porque los modelos tienen dificultades con entradas ruidosas
Beneficios de eliminar ruido:
- ✅ Mayor precisión de transcripción (a menudo mejora un 10-30%)
- ✅ Mejor reconocimiento de palabras, especialmente términos técnicos
- ✅ Procesamiento más rápido con audio más limpio
- ✅ Timestamps y segmentación más confiables
- ✅ Mejor manejo de voz baja
Comprender los tipos de ruido de fondo
Los distintos tipos de ruido requieren estrategias de eliminación diferentes:
1. Ruido constante (estacionario)
- Ejemplos: Aire acondicionado, zumbido de ventilador, zumbido eléctrico, ruido blanco
- Características: Frecuencia y amplitud consistentes
- Eliminación: Más fácil de eliminar con sustracción espectral o filtrado
2. Ruido variable (no estacionario)
- Ejemplos: Tráfico, murmullo de gente, tecleo de teclado, crujido de papel
- Características: Cambia con el tiempo, patrones impredecibles
- Eliminación: Requiere técnicas más avanzadas como modelos de deep learning
3. Ruido impulsivo
- Ejemplos: Clics, chasquidos, portazos, timbres de teléfono
- Características: Picos cortos y repentinos
- Eliminación: Requiere detección y reemplazo/interpolación
4. Ruido periódico
- Ejemplos: Pitidos, alarmas, sonidos repetitivos
- Características: Patrones regulares en frecuencias específicas
- Eliminación: Se puede filtrar con notch filters
Método 1: usar software de edición de audio
Audacity (gratis, código abierto)
Audacity es un editor de audio potente y gratuito con reducción de ruido integrada:
Pasos:
- Abre tu archivo de audio en Audacity
- Selecciona una sección con solo ruido (sin voz)
- Ve a Effect → Noise Reduction
- Haz clic en Get Noise Profile
- Selecciona toda la pista de audio
- Ve a Effect → Noise Reduction nuevamente
- Ajusta la configuración:
- Noise reduction (dB): 12-24 dB (empieza con 15)
- Sensitivity: 6.0 (predeterminado)
- Frequency smoothing (bands): 3 (predeterminado)
- Haz clic en OK para aplicar
Buenas prácticas:
- Usa una muestra de ruido de 0.5-2 segundos
- Elige una sección con ruido representativo
- Empieza con ajustes moderados y aumenta si es necesario
- Previsualiza antes de aplicar a toda la pista
Adobe Audition
Adobe Audition ofrece reducción de ruido profesional:
- Abre el archivo de audio
- Selecciona la sección con solo ruido
- Ve a Effects → Noise Reduction/Restoration → Capture Noise Print
- Selecciona la pista completa
- Ve a Effects → Noise Reduction/Restoration → Noise Reduction (process)
- Ajusta:
- Noise Reduction: 40-80% (empieza con 60%)
- Reduce by: 6-12 dB
- High Frequency Transition: 4000-8000 Hz
- Haz clic en Apply
Método 2: bibliotecas de procesamiento de audio en Python
Usar la biblioteca noisereduce
La biblioteca
noisereduce ofrece reducción de ruido fácil de usar:import noisereduce as nr
import soundfile as sf
# Load audio file
audio_data, sample_rate = sf.read("noisy_audio.wav")
# Method 1: Stationary noise reduction (for constant noise)
reduced_noise = nr.reduce_noise(
y=audio_data,
sr=sample_rate,
stationary=True,
prop_decrease=0.8 # Reduce noise by 80%
)
# Method 2: Non-stationary noise reduction (for variable noise)
reduced_noise = nr.reduce_noise(
y=audio_data,
sr=sample_rate,
stationary=False,
prop_decrease=0.8
)
# Save cleaned audio
sf.write("cleaned_audio.wav", reduced_noise, sample_rate)
Instalación:
pip install noisereduce soundfile
Usar librosa para spectral gating
import librosa
import numpy as np
import soundfile as sf
def spectral_gate(audio_path, threshold_db=-40):
"""Remove noise using spectral gating."""
# Load audio
y, sr = librosa.load(audio_path, sr=None)
# Compute short-time Fourier transform (STFT)
stft = librosa.stft(y)
magnitude = np.abs(stft)
phase = np.angle(stft)
# Convert to dB
magnitude_db = librosa.amplitude_to_db(magnitude)
# Apply threshold (remove frequencies below threshold)
magnitude_db_cleaned = np.where(
magnitude_db > threshold_db,
magnitude_db,
-80 # Silence very quiet parts
)
# Convert back to linear scale
magnitude_cleaned = librosa.db_to_amplitude(magnitude_db_cleaned)
# Reconstruct audio
stft_cleaned = magnitude_cleaned * np.exp(1j * phase)
y_cleaned = librosa.istft(stft_cleaned)
return y_cleaned, sr
# Usage
cleaned_audio, sample_rate = spectral_gate("noisy_audio.wav", threshold_db=-35)
sf.write("cleaned_audio.wav", cleaned_audio, sample_rate)
Usar scipy para filtrado de paso alto
Elimina ruido de baja frecuencia (como retumbo o viento):
from scipy import signal
import soundfile as sf
def high_pass_filter(audio_path, cutoff_freq=80):
"""Remove low-frequency noise with high-pass filter."""
# Load audio
audio_data, sample_rate = sf.read(audio_path)
# Design high-pass filter
nyquist = sample_rate / 2
normalized_cutoff = cutoff_freq / nyquist
b, a = signal.butter(4, normalized_cutoff, btype='high')
# Apply filter
filtered_audio = signal.filtfilt(b, a, audio_data)
return filtered_audio, sample_rate
# Usage
cleaned_audio, sr = high_pass_filter("noisy_audio.wav", cutoff_freq=100)
sf.write("cleaned_audio.wav", cleaned_audio, sr)
Método 3: reducción de ruido basada en deep learning
Usar RNNoise
RNNoise es un modelo de deep learning diseñado específicamente para reducción de ruido:
import rnnoise
import numpy as np
import soundfile as sf
def rnnoise_denoise(audio_path):
"""Remove noise using RNNoise model."""
# Load audio
audio_data, sample_rate = sf.read(audio_path)
# RNNoise expects 16kHz mono audio
if sample_rate != 16000:
import librosa
audio_data = librosa.resample(audio_data, orig_sr=sample_rate, target_sr=16000)
sample_rate = 16000
# Convert to mono if stereo
if len(audio_data.shape) > 1:
audio_data = np.mean(audio_data, axis=1)
# Process in chunks (RNNoise processes 480 samples at a time)
chunk_size = 480
denoised_audio = []
denoiser = rnnoise.RNNoise()
for i in range(0, len(audio_data), chunk_size):
chunk = audio_data[i:i+chunk_size]
if len(chunk) < chunk_size:
chunk = np.pad(chunk, (0, chunk_size - len(chunk)))
denoised_chunk = denoiser.process(chunk)
denoised_audio.extend(denoised_chunk)
return np.array(denoised_audio), sample_rate
# Usage
cleaned_audio, sr = rnnoise_denoise("noisy_audio.wav")
sf.write("cleaned_audio.wav", cleaned_audio, sr)
Instalación:
pip install rnnoise
Usar Demucs de Facebook
Demucs puede separar la voz del ruido de fondo:
from demucs.pretrained import get_model
from demucs.audio import AudioFile
import torch
def demucs_separation(audio_path):
"""Separate speech from noise using Demucs."""
# Load pre-trained model
model = get_model('htdemucs')
model.eval()
# Load audio
wav = AudioFile(audio_path).read(streams=0, samplerate=model.sample_rate, channels=model.audio_channels)
ref = wav.mean(0)
wav = (wav - ref.mean()) / ref.std()
wav = torch.from_numpy(wav).float()
# Separate sources
with torch.no_grad():
sources = model(wav[None])
sources = sources * ref.std() + ref.mean()
# Extract vocals (speech) - usually index 0 or 3
speech = sources[0, 0].cpu().numpy()
return speech, model.sample_rate
# Usage
speech_audio, sr = demucs_separation("noisy_audio.wav")
sf.write("speech_only.wav", speech_audio, sr)
Método 4: herramientas online de reducción de ruido
1. Audacity Online (versión en la nube)
- Gratis, basado en navegador
- Bueno para procesamiento rápido
- Tamaño de archivo limitado
2. Adobe Podcast Enhance
- Reducción de ruido impulsada por IA
- Gratis para uso limitado
- Excelentes resultados para voz
3. Krisp.ai
- Supresión de ruido en tiempo real
- API disponible para integración
- Bueno para audio en vivo
4. Cleanvoice.ai
- Eliminación automática de ruido
- Maneja múltiples tipos de ruido
- Procesamiento por lotes disponible
Flujo de trabajo completo: preprocesamiento de audio para STT
Aquí tienes un script completo de Python que combina múltiples técnicas:
import librosa
import noisereduce as nr
import soundfile as sf
from scipy import signal
import numpy as np
def preprocess_audio_for_stt(audio_path, output_path):
"""Complete audio preprocessing pipeline for STT."""
# Step 1: Load audio
print("Loading audio...")
y, sr = librosa.load(audio_path, sr=16000, mono=True)
# Step 2: Remove DC offset
print("Removing DC offset...")
y = y - np.mean(y)
# Step 3: High-pass filter (remove low-frequency noise)
print("Applying high-pass filter...")
nyquist = sr / 2
normalized_cutoff = 80 / nyquist
b, a = signal.butter(4, normalized_cutoff, btype='high')
y = signal.filtfilt(b, a, y)
# Step 4: Normalize volume
print("Normalizing volume...")
max_val = np.max(np.abs(y))
if max_val > 0:
y = y / max_val * 0.95 # Normalize to 95% to avoid clipping
# Step 5: Noise reduction
print("Reducing noise...")
y = nr.reduce_noise(
y=y,
sr=sr,
stationary=False, # Use non-stationary for variable noise
prop_decrease=0.8 # Reduce noise by 80%
)
# Step 6: Final normalization
print("Final normalization...")
max_val = np.max(np.abs(y))
if max_val > 0:
y = y / max_val * 0.95
# Step 7: Save processed audio
print(f"Saving to {output_path}...")
sf.write(output_path, y, sr)
print("Preprocessing complete!")
return y, sr
# Usage
preprocess_audio_for_stt("noisy_recording.wav", "cleaned_for_stt.wav")
Buenas prácticas para eliminar ruido
1. Elige el método adecuado
- Ruido constante: Usa sustracción espectral o reducción de ruido estacionario
- Ruido variable: Usa reducción no estacionaria o modelos de deep learning
- Ruido impulsivo: Usa eliminación de clics o interpolación
- Múltiples tipos de ruido: Combina múltiples técnicas
2. Preserva la calidad de la voz
- No proceses en exceso (puede introducir artefactos)
- Usa ajustes moderados de reducción de ruido (60-80%)
- Preserva el rango de frecuencias de la voz humana (80-8000 Hz)
- Mantén características naturales del habla
3. Prueba e itera
- Siempre previsualiza antes de aplicar a toda la pista
- Compara audio original vs. procesado
- Prueba la precisión de transcripción con ambas versiones
- Ajusta la configuración según los resultados
4. Considera tu modelo de STT
- Algunos modelos (como Whisper) manejan bien el ruido
- El preprocesamiento no siempre es necesario
- Prueba con y sin preprocesamiento
- Los modelos más grandes son más robustos al ruido
Errores comunes que debes evitar
❌ Reducción de ruido demasiado agresiva
- Puede eliminar frecuencias de la voz
- Crea artefactos y distorsión
- Hace que la voz suene robótica
❌ Eliminar demasiada baja frecuencia
- Puede eliminar componentes importantes de la voz
- Hace que la voz suene delgada o metálica
- Afecta la naturalidad
❌ No probar con tu modelo de STT
- El preprocesamiento puede no mejorar la precisión
- Algunos modelos funcionan mejor con audio original
- Siempre haz pruebas A/B
❌ Ignorar el formato de audio
- Asegura una frecuencia de muestreo adecuada (se recomienda 16kHz)
- Usa formatos sin pérdida cuando sea posible
- Evita compresión doble
Integración con speech-to-text
Uso con OpenAI Whisper
import whisper
import noisereduce as nr
import soundfile as sf
def transcribe_with_noise_reduction(audio_path):
"""Transcribe audio with noise reduction preprocessing."""
# Step 1: Reduce noise
audio_data, sr = sf.read(audio_path)
cleaned_audio = nr.reduce_noise(
y=audio_data,
sr=sr,
stationary=False,
prop_decrease=0.75
)
# Save temporary cleaned file
temp_path = "temp_cleaned.wav"
sf.write(temp_path, cleaned_audio, sr)
# Step 2: Transcribe with Whisper
model = whisper.load_model("base")
result = model.transcribe(temp_path)
# Clean up
import os
os.remove(temp_path)
return result["text"]
# Usage
transcription = transcribe_with_noise_reduction("noisy_audio.wav")
print(transcription)
Uso con la API de SayToWords
import requests
import noisereduce as nr
import soundfile as sf
def transcribe_with_saytowords(audio_path):
"""Preprocess and transcribe with SayToWords."""
# Preprocess audio
audio_data, sr = sf.read(audio_path)
cleaned_audio = nr.reduce_noise(
y=audio_data,
sr=sr,
stationary=False,
prop_decrease=0.8
)
# Save cleaned audio
cleaned_path = "cleaned_for_api.wav"
sf.write(cleaned_path, cleaned_audio, sr)
# Upload and transcribe
with open(cleaned_path, 'rb') as f:
files = {'file': f}
response = requests.post(
'https://api.saytowords.com/transcribe',
files=files,
headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
return response.json()
Medir la efectividad de la reducción de ruido
Comparación antes/después
import librosa
import numpy as np
def measure_snr(audio_path):
"""Estimate signal-to-noise ratio."""
y, sr = librosa.load(audio_path, sr=None)
# Simple SNR estimation
signal_power = np.mean(y ** 2)
noise_floor = np.percentile(np.abs(y), 10) ** 2
snr_db = 10 * np.log10(signal_power / noise_floor) if noise_floor > 0 else 0
return snr_db
# Compare before and after
original_snr = measure_snr("noisy_audio.wav")
cleaned_snr = measure_snr("cleaned_audio.wav")
print(f"Original SNR: {original_snr:.2f} dB")
print(f"Cleaned SNR: {cleaned_snr:.2f} dB")
print(f"Improvement: {cleaned_snr - original_snr:.2f} dB")
Conclusión
Eliminar el ruido de fondo antes del procesamiento de speech-to-text puede mejorar significativamente la precisión de transcripción. El mejor enfoque depende de:
- Tipo de ruido (constante vs. variable)
- Calidad de audio (frecuencia de muestreo, profundidad de bits)
- Herramientas disponibles (software vs. programación)
- Modelo STT (algunos manejan mejor el ruido que otros)
Recomendaciones rápidas:
- Para procesamiento rápido: Usa Audacity o herramientas online
- Para automatización: Usa bibliotecas de Python como
noisereduce - Para mejores resultados: Combina múltiples técnicas
- Para producción: Prueba con tu modelo STT específico
Recuerda: No todo audio necesita preprocesamiento. Algunos modelos modernos de STT como Whisper son bastante robustos al ruido. Siempre prueba tanto el audio original como el procesado para ver cuál da mejores resultados en tu caso de uso específico.
Recursos adicionales
¿Necesitas ayuda con reducción de ruido para tu audio específico? Prueba SayToWords Speech-to-Text, que incluye manejo de ruido integrado y opciones de preprocesamiento.