Mejora de Voz con Autoencoders Variacionales Conscientes del Ruido (NA-VAE)

Fernando Ruiz Haro, Raúl Villa Navarro, Marcelo René Tito Mendoza

Introducción

El ruido ambiental degrada significativamente la inteligibilidad del habla en aplicaciones críticas como audífonos, reconocimiento automático de voz (ASR) o sistemas de telecomunicación. Este problema, conocido como el cocktail party problem [1], consiste en separar la voz de un hablante de las interferencias presentes en el entorno acústico.

Los métodos clásicos de mejora de voz —filtrado de Wiener, sustracción espectral, estimación MMSE— modelan el ruido mediante aproximaciones estadísticas simples. Aunque funcionan correctamente en escenarios controlados, se degradan ante condiciones no vistas o ruido no estacionario.

El aprendizaje profundo ha cambiado este paradigma: en lugar de modelar explícitamente el ruido, los modelos modernos aprenden directamente la distribución estadística de la voz limpia. En este trabajo se implementa el Noise-Aware Variational Autoencoder (NA-VAE), propuesto por Fang et al. (2021) [2], que combina modelado generativo probabilístico con estimación no supervisada del ruido mediante NMF, introduciendo además un encoder consciente del ruido capaz de operar en condiciones de bajo SNR sin información explícita sobre el tipo de ruido.

Estado del arte

La evolución de los sistemas de mejora de voz puede entenderse como una transición progresiva desde modelos discriminativos hacia modelos generativos probabilísticos.

Vincent et al. (2008) [3] introducen el Denoising Autoencoder (DAE): entrenar una red para reconstruir una señal limpia desde una versión corrompida obliga al encoder a aprender representaciones robustas y estables. Lu et al. (2013) [4] aplican este principio al habla con pares ruidoso-limpio reales, superando al estimador MMSE clásico en SNR bajo.

Park y Lee (2017) [5] proponen el R-CED (Redundant Convolutional Encoder-Decoder), una red completamente convolucional con 68× menos parámetros que una FNN equivalente, especialmente interesante para aplicaciones con restricciones computacionales. Leglaive et al. (2018) [6] dan el salto hacia modelos generativos con el marco VAE-NMF: modelan la varianza de la voz con un VAE supervisado y la del ruido con NMF no supervisado, combinados en un filtro de Wiener. Finalmente, Fang et al. (2021) [2] identifican la fragilidad del encoder VAE estándar ante señales ruidosas y proponen el NA-VAE, añadiendo un segundo encoder entrenado para mapear señales ruidosas al espacio latente aprendido con voz limpia.

Materiales

Dataset. Se emplea el corpus VoiceBank-DEMAND [7], estándar de facto en speech enhancement: 11.572 archivos de entrenamiento (28 hablantes) y 824 de test con ruido ambiental diverso (cafetería, tráfico, oficina). El análisis exploratorio sobre 2.500 archivos revela:

  • Frecuencia de muestreo: 48 kHz nativos → 16 kHz tras resampling
  • Duración media: 3.3 s | SNR medio: +5.9 dB (rango: −3.6 a +14.6 dB)
  • Frames espectrales totales de entrenamiento: 469.807

Implementación. PyTorch 2.10 sobre Google Colab con GPU NVIDIA T4 (CUDA 12.8). El notebook completo está disponible en el siguiente repositorio del proyecto — https://github.com/vinara565-design/na-vae-pasd-upm

Desarrollo

Formulación del problema

La señal observada se trabaja en el dominio tiempo-frecuencia mediante STFT. Asumiendo voz y ruido gaussianos complejos independientes, la mezcla se modela como:

Modelo de mezcla
Modelo de mezcla — Leglaive et al. (2018), eq. 2

donde σ²_s,ft es la varianza espectral de la voz, σ²_n,ft la del ruido y g_t una ganancia temporal. El objetivo es estimar ambas varianzas por separado para reconstruir la señal limpia mediante filtrado de Wiener [6].

Preprocesamiento

Cada audio se transforma mediante STFT con ventana sinusoidal, siguiendo Fang et al. (Sec. 4.3): N_FFT=1024, HOP=256 (75% de solapamiento), obteniendo F=513 bins de frecuencia. Se calcula el log-espectro de potencia y se normaliza con Z-score global (μ=−3.56, σ=2.12):

window  = np.sin(np.pi * (np.arange(WIN_LENGTH) + 0.5) / WIN_LENGTH)
stft    = librosa.stft(y, n_fft=1024, hop_length=256, window=window)
log_pow = np.log10(np.abs(stft)**2 + 1e-8)   # [F, T]
norm_in = (log_pow - MEAN_P) / STD_P          # Z-score global

La normalización Z-score global es crítica en Fase 2: la divergencia KL es sensible a la escala, y usar estadísticas diferentes para los datos ruidosos distorsiona el espacio de aprendizaje [2, Sec.4.3].

Arquitectura NA-VAE

Figura 1. Arquitectura NA-VAE: Fase 1 (prior de voz limpia), Fase 2 (NA-Encoder) e inferencia (filtro de Wiener).

Fase 1 – Prior de voz limpia

Un VAE estándar se entrena exclusivamente con voz limpia. El decoder p_θ(s|z) aprende la varianza espectral de la voz σ̂²_s(z_t). Arquitectura (Fang et al., Sec. 4.3): dos capas ocultas de 128 unidades con activación Tanh, espacio latente D=16. El objetivo es el ELBO:

ELBO
Objetivo Fase 1 — ELBO (Fang et al., eq. 5)

La función de pérdida incorpora free bits para evitar el colapso del posterior —un problema habitual en VAEs donde el decoder aprende a ignorar las variables latentes— y KL warmup para estabilizar las primeras épocas:

kl_per_dim = -0.5 * (1 + logvar - mu.pow(2) - logvar.exp())
kl_per_dim = torch.clamp(kl_per_dim, min=FREE_BITS)
loss = F.mse_loss(recon, x) + BETA * kl_per_dim.mean()

Fase 2 – Noise-Aware Encoder

El decoder queda congelado permanentemente. Se entrena un segundo encoder q'_γ(z'_t|x_t) —misma arquitectura, inicializado desde el encoder limpio— que aprende a proyectar señales ruidosas hacia el mismo espacio latente. Intuitivamente, el modelo aprende a “imaginar” la representación latente limpia incluso cuando la entrada contiene ruido. La pérdida minimiza la KL entre ambas distribuciones (Fang et al., eq. 13):

Loss Fase 2
Pérdida Fase 2 — Fang et al. (2021), eq. 13
# KL entre qφ(z|s) [congelado] y qγ(z|x) [entrenando]
kl = 0.5 * (logvar_noisy - logvar_clean - 1.0
            + (var_clean + (mu_clean - mu_noisy)**2) / var_noisy)
loss = torch.mean(torch.sum(kl, dim=1))

Filtro de Wiener

El ruido se modela con NMF no supervisado de rango K=8: σ²_n = WH. El ajuste se realiza sobre los frames del percentil 25 de energía (pausas con ruido puro), evitando capturar componentes vocales. La máscara de denoising es (Fang et al., eq. 9):

Wiener filter
Filtro de Wiener óptimo — Fang et al. (2021), eq. 6

Resultados

Figura 2. Curvas de entrenamiento. Recon Loss Fase 1: 0.137→0.077 (−44%). KL Fase 2: 12.05→11.51 (−4.5%).

La Fase 1 converge correctamente con Recon Loss final de 0.077. La Fase 2 muestra convergencia limitada (−4.5%), consecuencia del espacio latente sobredisperso (KL/dim=1.09 nats, por encima del rango óptimo de 0.3–0.5 nats/dim).

Figura 3. Evaluación sobre 50 audios de test: SNR entrada vs salida, distribución de Δ SNR y mejora por rango.

La evaluación revela un patrón SNR-dependiente sistemático y consistente en todos los experimentos realizados:

Rango SNR entradaN audiosΔ SNR medioTasa de mejora
< 3 dB12+1.23 dB92% (11/12)
3 – 8 dB12−3.83 dB0%
8 – 13 dB13−9.22 dB0%
13 dB13−14.33 dB0%
Global50−6.75 dB22%

El sistema mejora el 92% de los audios con SNR < 3 dB — el escenario de diseño del NA-VAE [2]. La evaluación perceptiva muestra reducción significativa del ruido estacionario y mejora clara de inteligibilidad, aunque con ligero sobre-suavizado espectral y pérdida parcial de altas frecuencias, efectos consistentes con las limitaciones conocidas de los modelos VAE aplicados a audio.

Figura 4. Ablation: NMF vs aproximación simple (izquierda). Evolución del Δ SNR entre versiones, +5.6 dB acumulados (derecha).

El ablation confirma que el NMF (−7.71 dB) no mejora la aproximación simple (−5.58 dB): la estimación de σ²_n es el cuello de botella. El NMF no converge en n_iter=100 en ningún audio, indicando que necesita más iteraciones.

Ejemplos de audio

Se incluyen varios ejemplos perceptivos comparando:

  • señal ruidosa original,
  • reconstrucción mediante NA-VAE.

Señal ruidosa — audio: p232_028

Reconstrucción del audio — audio: p232_028

Señal ruidosa — audio: p232_019

Reconstrucción del audio — audio: p232_019

Discusión

El sistema funciona en el escenario de diseño —SNR < 3 dB— con mejora audible consistente. La divergencia entre SNR objetivo (negativo globalmente) y la calidad perceptiva observada es un fenómeno conocido en el campo: métricas como PESQ o STOI capturarían mejor la mejora perceptiva [1].

Identificamos tres causas técnicas del rendimiento limitado en SNR alto:

Espacio latente sobredisperso. Con β=0.001 la KL/dim=1.09 supera el rango óptimo. El posterior collapse apareció repetidamente en experimentos iniciales, especialmente con β alto sin warmup. El decoder aprende un espectro de voz suavizado que elimina el ruido de fondo pero pierde detalle en frecuencias altas.

Convergencia limitada de Fase 2. Una reducción del 4.5% frente al >80% reportado por Fang et al. [2] indica que el espacio latente disperso dificulta la alineación noisy→clean. El NA-Encoder no llega a imitar con precisión las representaciones del encoder limpio.

NMF sobre mezcla completa. Aunque limitamos el ajuste a frames silenciosos, el NMF no converge en el límite de iteraciones, produciendo estimaciones ruidosas de σ²_n. La fortaleza del sistema —no necesitar información del tipo de ruido en test— tiene como contrapartida esta fragilidad ante una calibración imperfecta.

En este proyecto se ha implementado un NA-VAE en PyTorch sobre el corpus VoiceBank-DEMAND para comprender cómo un modelo generativo puede aprender la distribución estadística de la voz limpia y utilizarla para reconstruir señales degradadas. Los resultados muestran una mejora real en condiciones de SNR bajo — el escenario de diseño del sistema — y una mejora perceptiva audible incluso cuando la métrica objetiva no la refleja, lo que ilustra una limitación conocida del SNR como medida de calidad en speech enhancement. La misma idea subyace en sistemas mucho más avanzados: modelos de difusión aplicados a audio, síntesis de voz neural o separación de fuentes en tiempo real, todos ellos herederos del principio de aprender un prior robusto de la señal limpia.

Referencias

[1] D.L. Wang y J. Chen, “Supervised Speech Separation Based on Deep Learning: An Overview”, IEEE/ACM Trans. Audio Speech Lang. Process., 2018. https://doi.org/10.1109/TASLP.2018.2842159

[2] H. Fang et al., “Variational Autoencoder for Speech Enhancement with a Noise-Aware Encoder”, ICASSP 2021. https://arxiv.org/abs/2102.08706

[3] P. Vincent et al., “Extracting and Composing Robust Features with Denoising Autoencoders”, ICML 2008. https://doi.org/10.1145/1390156.1390294

[4] X. Lu et al., “Speech Enhancement Based on Deep Denoising Autoencoder”, Interspeech 2013. https://doi.org/10.21437/Interspeech.2013-130

[5] S.R. Park y J.W. Lee, “A Fully Convolutional Neural Network for Speech Enhancement”, Interspeech 2017. https://doi.org/10.21437/Interspeech.2017-1465

[6] S. Leglaive et al., “A Variance Modeling Framework Based on Variational Autoencoders for Speech Enhancement”, MLSP 2018. https://doi.org/10.1109/MLSP.2018.8516711

[7] C. Valentini-Botinhao et al., “Investigating RNN-based speech enhancement methods for noise-robust Text-to-Speech”, SSW 2016. https://datashare.ed.ac.uk/handle/10283/2791