
Wavegrad
Implementación (Pytorch) del Vocoder Wavegrad de alta fidelidad de Google Brain (documento). Primera implementación en GitHub con generación de alta calidad para 6 iteraciones.
Estado
Factor en tiempo real (RTF)
Número de parámetros : 15.810.401
| Modelo | Estable | RTX 2080 TI | Tesla K80 | Intel Xeon 2.3Ghz* |
|---|
| 1000 iteraciones | + + | 9.59 | - | - |
| 100 iteraciones | + + | 0.94 | 5.85 | - |
| 50 iteraciones | + + | 0.45 | 2.92 | - |
| 25 iteraciones | + + | 0.22 | 1.45 | - |
| 12 iteraciones | + + | 0.10 | 0.69 | 4.55 |
| 6 iteraciones | + + | 0.04 | 0.33 | 2.09 |
* Nota : usó una versión antigua de la CPU Intel Xeon.
Acerca de
WaveGrad es un modelo condicional para la generación de forma de onda mediante la estimación de gradientes de la densidad de datos con calidad de muestreo similar a Wavenet. Este vocoder no es GaN, ni flujo normalizador, ni modelo autorregresivo clásico . El concepto principal de VoCoder se basa en la renovación de modelos probabilísticos de difusión (DDPM), que utilizan la dinámica de Langevin y los marcos de correspondencia . Además, en comparación con el clásico DDPM, WaveGrad logra una convergencia súper rápida (6 iteraciones y probablemente más bajo) esquema de muestreo iterativo WRT Langevin Dynamics.
Instalación
- Clon este repositorio:
git clone https://github.com/ivanvovk/WaveGrad.git
cd WaveGrad
- Requisitos de instalación:
pip install -r requirements.txt
Capacitación
1 Preparación de datos
- Realice el tren y pruebe filelistas de sus datos de audio como los que se incluyen en la carpeta
filelists . - Haga un archivo de configuración* en la carpeta
configs .
* Nota: Si va a cambiar hop_length para STFT, asegúrese de que el producto de sus factors de muestreo en configuración sea igual a su nueva hop_length .
2 Capacitación de GPU individual y distribuida
- Abra el script
runs/train.sh y especifique los dispositivos GPU visibles y la ruta a su archivo de configuración. Si especifica más de una GPU, la capacitación se ejecutará en modo distribuido. - Correr
sh runs/train.sh
3 Tensorboard y registro
Para rastrear su proceso de entrenamiento, ejecute TensorBoard por tensorboard --logdir=logs/YOUR_LOGDIR_FOLDER . Toda la información de registro y los puntos de control se almacenarán en logs/YOUR_LOGDIR_FOLDER . logdir se especifica en el archivo de configuración.
4 Búsqueda de cuadrícula de programación de ruido
Una vez que el modelo está capacitado, la búsqueda de la cuadrícula para el mejor horario* para un número necesario de iteraciones en notebooks/inference.ipynb . El código admite el paralelismo, por lo que puede especificar más de un número de trabajos para acelerar la búsqueda.
* Nota : La búsqueda en la cuadrícula es necesaria solo para un pequeño número de iteraciones (como 6 o 7). Para un número mayor, solo pruebe benchmark.fibonacci(...) Inicialización: lo usé para 25 iteración y funciona bien. Desde un buen horario de 25 iteración, por ejemplo, puede construir un horario de orden superior copiando elementos.
Horarios de ruido para el modelo previo
- El horario de 6-iteración se obtuvo utilizando la búsqueda de cuadrícula. Después, basado en el esquema obtenido, a mano, encontré una aproximación ligeramente mejor.
- El horario de 7-iteración se obtuvo de la misma manera.
- El horario de 12 iteración se obtuvo de la misma manera.
- Se obtuvo un horario de 25-iteración utilizando
benchmark.fibonacci(...) . - El horario de 50 iteración se obtuvo repitiendo elementos del esquema de iteración de 25.
- El horario de 100 iteraciones se obtuvo de la misma manera.
- El horario de 1000 iteración se obtuvo de la misma manera.
Inferencia
CLI
Coloque sus espectrogramas MEL en alguna carpeta. Hacer un filelista. Luego ejecute este comando con sus propios argumentos:
sh runs/inference.sh -c < your-config > -ch < your-checkpoint > -ns < your-noise-schedule > -m < your-mel-filelist > -v " yes "
Cuaderno de jupyter
Se proporcionan más detalles de inferencia en notebooks/inference.ipynb . Allí también puede encontrar cómo establecer un cronograma de ruido para el modelo y hacer una búsqueda en la red para el mejor esquema.
Otro
Audios generados
Los ejemplos de audios generados se proporcionan en la carpeta generated_samples . La degradación de la calidad entre las inferencias de 1000 iteración y 6 iteración no es notable si se encuentra el mejor horario para este último.
Puntos de control previos al detenido
Puede encontrar un archivo de punto de control previamente previo al punto* en LJSPEECH (22kHz) a través de este enlace de Google Drive.
* Nota : el punto de control cargado es un dict con una sola clave 'model' .
Detalles importantes, problemas y comentarios
- Durante el entrenamiento, Wavegrad utiliza un programa de ruido predeterminado con 1000 iteraciones y betas de escala lineal desde el rango (1e-6, 0.01). Para la inferencia, puede establecer otro horario con menos iteraciones. Sintonice las betas con cuidado, la calidad de la salida depende mucho de ello.
- Por defecto, el modelo se ejecuta de una manera de precisión mixta. El tamaño del lote se modifica en comparación con el documento (256 -> 96) ya que los autores capacitaron su modelo en TPU.
- Después de ~ 10k iteraciones de entrenamiento (1-2 horas) en una sola GPU, el modelo realiza una buena generación para una inferencia de 50 iteración. El tiempo total de entrenamiento es de aproximadamente 1-2 días (para la convergencia absoluta).
- En algún momento, el entrenamiento puede comenzar a comportarse raro y loco (la pérdida explota), por lo que he introducido programación de tasa de aprendizaje (LR) y recorte de gradiente. Si la pérdida explota para sus datos, intente disminuir un poco el gamma LR Scheduler. Debería ayudar.
- Por defecto, la longitud del lúpulo de su STFT es igual a 300 (por lo tanto, el factor total de muestreo ascendente). No se prueban otros casos, pero puede intentarlo. Recuerde, ese factor total de muestreo ascendente debe ser igual a su nueva longitud de lúpulo.
Historial de actualizaciones
- ( Nuevo : 14/10/2020) gran actualización. Capacitación distribuida y soporte de precisión mixta. Codificación posicional más correcta. Soporte de CLI para la inferencia. Búsqueda de cuadrícula paralela. El tamaño del modelo disminuyó significativamente.
- Nueva información RTF para la tarjeta GPU NVIDIA TESLA K80 (popular en el servicio Google Colab) y CPU Intel Xeon 2.3GHz.
- Gran actualización. Nuevo ejemplo de muestra bien generada por 6 iteración. Nueva API de configuración del horario de ruido. Se agregó el mejor código de búsqueda de cuadrícula de programación.
- Entrenamiento mejorado mediante la introducción de un programador de tarifas de aprendizaje más inteligentes. Obtuvo síntesis de alta fidelidad.
- Entrenamiento estable e inferencia múltiple. Se admite la programación de ruido de 6 iteración.
- Entrenamiento estable e inferencia de iteración fija con un ruido estático de fondo significativo. Todos los problemas de codificación posicional se resuelven.
- Entrenamiento estable de modelos de iteración fijada de 25, 50 y 1000. No encontró escala lineal (c = 5000 del papel) de codificación posicional (error).
- Entrenamiento estable de modelos de iteración fijada de 25, 50 y 1000. Codificación posicional fija en la reducción de escala. El muestreo del segmento paralelo se reemplaza por un muestreo completo.
- ( Lanzamiento, primero en Github ). Muestreo del segmento paralelo y codificación posicional rota reducción de escala. Mala calidad con clics desde la concatenación de la generación del segmento paralelo.
Referencias
- Nanxin Chen et al., Wavegrad: estimación de gradientes para la generación de forma de onda
- Jonathan Ho et al., Modelos probabilísticos de difusión Denoing Diffusion
- Repositorio de modelos probabilísticos de difusión de difusión Denoing (implementación de tensorflow), de la cual se han adoptado cálculos de difusión