En este tutorial, caminamos por un flujo de trabajo avanzado pero práctico utilizando Cerebro del habla. Comenzamos generando nuestras propias muestras de habla limpia con GTT, agregando deliberadamente ruido para simular escenarios del mundo real y luego aplicar el modelo Metricgan+ de Speechbrain para mejorar el audio. Una vez que el audio se cene, ejecutamos el reconocimiento automático de voz con un sistema CRDNN rescorado con modelo de idioma y comparamos las tasas de error de palabras antes y después de la mejora. Al adoptar este enfoque paso a paso, podemos experimentar de primera mano cómo Speechbrain nos permite construir una tubería completa para la mejora y el reconocimiento del habla en solo unas pocas líneas de código. Mira el Códigos completos aquí.
!pip -q install -U speechbrain gTTS jiwer pydub librosa soundfile torchaudio
!apt -qq install -y ffmpeg >/dev/null
import os, time, math, random, warnings, shutil, glob
warnings.filterwarnings("ignore")
import torch, torchaudio, numpy as np, librosa, soundfile as sf
from gtts import gTTS
from pydub import AudioSegment
from jiwer import wer
from pathlib import Path
from dataclasses import dataclass
from typing import List, Tuple
from IPython.display import Audio, display
from speechbrain.pretrained import EncoderDecoderASR, SpectralMaskEnhancement
root = Path("sb_demo"); root.mkdir(exist_ok=True)
sr = 16000
device = "cuda" if torch.cuda.is_available() else "cpu"
Comenzamos configurando nuestro entorno Colab con todas las bibliotecas y herramientas requeridas. Instalamos Speechbrain junto con paquetes de procesamiento de audio, definimos rutas y parámetros básicos y preparamos el dispositivo para que estemos listos para construir nuestra tubería de voz. Mira el Códigos completos aquí.
def tts_to_wav(text: str, out_wav: str, lang="en"):
mp3 = out_wav.replace(".wav", ".mp3")
gTTS(text=text, lang=lang).save(mp3)
a = AudioSegment.from_file(mp3, format="mp3").set_channels(1).set_frame_rate(sr)
a.export(out_wav, format="wav")
os.remove(mp3)
def add_noise(in_wav: str, snr_db: float, out_wav: str):
y, _ = librosa.load(in_wav, sr=sr, mono=True)
rms = np.sqrt(np.mean(y**2) + 1e-12)
n = np.random.normal(0, 1, len(y))
n = n / (np.sqrt(np.mean(n**2)+1e-12))
target_n_rms = rms / (10**(snr_db/20))
y_noisy = np.clip(y + n * target_n_rms, -1.0, 1.0)
sf.write(out_wav, y_noisy, sr)
def play(title, path):
print(f"▶ {title}: {path}")
display(Audio(path, rate=sr))
def clean_txt(s: str) -> str:
return " ".join("".join(ch.lower() if ch.isalnum() or ch.isspace() else " " for ch in s).split())
@dataclass
class Sample:
text: str
clean_wav: str
noisy_wav: str
enhanced_wav: str
Definimos pequeñas utilidades que alimentan nuestra tubería de extremo a extremo. Sintetizamos el habla con GTTS y lo convirtimos en WAV, inyectamos el ruido gaussiano controlado en una SNR objetivo y agregamos ayudantes para obtener una vista previa de audio y normalizar el texto. También creamos una muestra de datos de muestra, por lo que rastreamos cuidadosamente las rutas limpias, ruidosas y mejoradas de cada expresión. Mira el Códigos completos aquí.
sentences = [
"Artificial intelligence is transforming everyday life.",
"Open source tools enable rapid research and innovation.",
"SpeechBrain brings flexible speech pipelines to Python."
]
samples: List[Sample] = []
print("🗣️ Synthesizing short utterances with gTTS...")
for i, s in enumerate(sentences, 1):
cw = str(root/f"clean_{i}.wav")
nw = str(root/f"noisy_{i}.wav")
ew = str(root/f"enhanced_{i}.wav")
tts_to_wav(s, cw)
add_noise(cw, snr_db=3.0 if i%2 else 0.0, out_wav=nw)
samples.append(Sample(text=s, clean_wav=cw, noisy_wav=nw, enhanced_wav=ew))
play("Clean #1", samples[0].clean_wav)
play("Noisy #1", samples[0].noisy_wav)
print("⬇️ Loading pretrained models (this downloads once) ...")
asr = EncoderDecoderASR.from_hparams(
source="speechbrain/asr-crdnn-rnnlm-librispeech",
run_opts={"device": device},
savedir=str(root/"pretrained_asr"),
)
enhancer = SpectralMaskEnhancement.from_hparams(
source="speechbrain/metricgan-plus-voicebank",
run_opts={"device": device},
savedir=str(root/"pretrained_enh"),
)
En este paso, generamos tres oraciones habladas con GTT, salvamos versiones limpias y ruidosas, y las organizamos en nuestros objetos de muestra. Luego cargamos los modelos ASR y Metricgan+ de mejora ASR y Metricgan+ previamente capacitados de Speechbrain, proporcionándonos todos los componentes necesarios para transformar el audio ruidoso en una transcripción desocada. Mira el Códigos completos aquí.
def enhance_file(in_wav: str, out_wav: str):
sig = enhancer.enhance_file(in_wav)
if sig.dim() == 1: sig = sig.unsqueeze(0)
torchaudio.save(out_wav, sig.cpu(), sr)
def transcribe(path: str) -> str:
hyp = asr.transcribe_file(path)
return clean_txt(hyp)
def eval_pair(ref_text: str, wav_path: str) -> Tuple[str, float]:
hyp = transcribe(wav_path)
return hyp, wer(clean_txt(ref_text), hyp)
print("\n🔬 Transcribing noisy vs enhanced (MetricGAN+)...")
rows = []
t0 = time.time()
for smp in samples:
enhance_file(smp.noisy_wav, smp.enhanced_wav)
hyp_noisy, wer_noisy = eval_pair(smp.text, smp.noisy_wav)
hyp_enh, wer_enh = eval_pair(smp.text, smp.enhanced_wav)
rows.append((smp.text, hyp_noisy, wer_noisy, hyp_enh, wer_enh))
t1 = time.time()
Creamos funciones auxiliares para mejorar el audio ruidoso, transcribir el discurso y evaluar a WER en contra del texto de referencia. Luego ejecutamos estos pasos en todas nuestras muestras, comparando versiones ruidosas y mejoradas, y registramos las transcripciones y las tasas de error junto con el tiempo de procesamiento. Mira el Códigos completos aquí.
def fmt(x): return f"{x:.3f}" if isinstance(x, float) else x
print(f"\n⏱️ Inference time: {t1 - t0:.2f}s on {device.upper()}")
print("\n# ---- Results (Noisy → Enhanced) ----")
for i, (ref, hN, wN, hE, wE) in enumerate(rows, 1):
print(f"\nUtterance {i}")
print("Ref: ", ref)
print("Noisy ASR:", hN)
print("WER noisy:", fmt(wN))
print("Enh ASR: ", hE)
print("WER enh: ", fmt(wE))
print("\n🧵 Batch decoding (looping API):")
batch_files = [s.clean_wav for s in samples] + [s.noisy_wav for s in samples]
bt0 = time.time()
batch_hyps = [transcribe(p) for p in batch_files]
bt1 = time.time()
for p, h in zip(batch_files, batch_hyps):
print(os.path.basename(p), "->", h[:80] + ("..." if len(h) > 80 else ""))
print(f"⏱️ Batch elapsed: {bt1 - bt0:.2f}s")
play("Enhanced #1 (MetricGAN+)", samples[0].enhanced_wav)
avg_wn = sum(wN for _,_,wN,_,_ in rows) / len(rows)
avg_we = sum(wE for _,_,_,_,wE in rows) / len(rows)
print("\n📈 Summary:")
print(f"Avg WER (Noisy): {avg_wn:.3f}")
print(f"Avg WER (Enhanced): {avg_we:.3f}")
print("Tip: Try different SNRs or longer texts, and switch device to GPU if available.")
Resumimos nuestro experimento mediante la inferencia de tiempo, imprimiendo transcripciones por desorden y contrastando antes y después de la mejora. También decimos múltiples archivos, escuchamos una muestra mejorada e informamos que el promedio de los informes vemos claramente las ganancias de Metricgan+ en nuestra tubería.
En conclusión, vemos claramente el poder de integrar la mejora del habla y ASR en una tubería unificada con Speechbrain. Al generar audio, corromperlo con ruido, mejorarlo y finalmente transcribirlo, obtenemos información práctica sobre cómo estos modelos mejoran la precisión de reconocimiento en entornos ruidosos. Los resultados destacan los beneficios prácticos del uso de tecnologías de habla de código abierto. Concluimos con un marco de trabajo que se puede extender fácilmente para conjuntos de datos más grandes, diferentes modelos de mejora o tareas ASR personalizadas.
Mira el Códigos completos aquí. No dude en ver nuestro Página de Github para tutoriales, códigos y cuadernos. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín.
Asif Razzaq es el CEO de MarktechPost Media Inc .. Como empresario e ingeniero visionario, ASIF se compromete a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, MarktechPost, que se destaca por su cobertura profunda de noticias de aprendizaje automático y de aprendizaje profundo que es técnicamente sólido y fácilmente comprensible por una audiencia amplia. La plataforma cuenta con más de 2 millones de vistas mensuales, ilustrando su popularidad entre el público.