Nota : Esta es la versión de desarrollo. Si necesita una versión estable, consulte el V0.1.1.
El objetivo del repositorio es proporcionar una implementación del Vocoder de Wavenet, que puede generar muestras de voz en bruto de alta calidad condicionadas en características lingüísticas o acústicas.
Las muestras de audio están disponibles en https://r9y9.github.io/wavenet_vocoder/.
Está disponible un cuaderno que se supone que debe ejecutarse en https://colab.research.google.com:
Nota : Este no es en sí mismo un modelo de texto a voz (TTS). Con un modelo previamente capacitado proporcionado aquí, puede sintetizar la forma de onda dado un espectrograma MEL , no un texto sin procesar. Necesitará un modelo de predicción de espectrograma MEL (como Tacotron2) para usar los modelos previamente capacitados para TTS.
NOTA : En cuanto al modelo previo al estado previo para LJSpeech, el modelo se ajustó varias veces y se entrenó para más de 1000k pasos en total. Consulte los problemas ( #1, #75, #45) para saber cómo se entrenó el modelo.
| URL modelo | Datos | URL Hyper Params | Git Commit | Pasos |
|---|---|---|---|---|
| enlace | Ljspeech | enlace | 2092A64 | 1000k ~ pasos |
| enlace | CMU Ártico | enlace | B1A1076 | 740k pasos |
Para usar modelos previamente capacitados, primero consulte la confirmación específica de GIT anotada anteriormente. es decir,
git checkout ${commit_hash}
Y luego sigue la sección "Sintetizar desde un punto de control" en el ReadMe. Tenga en cuenta que la versión antigua de Synthesis.py puede no aceptar --preset=<json> parámetro y es posible que tenga que cambiar hparams.py de acuerdo con el archivo Preset (JSON).
Podrías intentarlo por ejemplo:
# Assuming you have downloaded LJSpeech-1.1 at ~/data/LJSpeech-1.1
# pretrained model (20180510_mixture_lj_checkpoint_step000320000_ema.pth)
# hparams (20180510_mixture_lj_checkpoint_step000320000_ema.json)
git checkout 2092a64
python preprocess.py ljspeech ~/data/LJSpeech-1.1 ./data/ljspeech
--preset=20180510_mixture_lj_checkpoint_step000320000_ema.json
python synthesis.py --preset=20180510_mixture_lj_checkpoint_step000320000_ema.json
--conditional=./data/ljspeech/ljspeech-mel-00001.npy
20180510_mixture_lj_checkpoint_step000320000_ema.pth
generated
Puede encontrar un archivo WAV generado en el directorio generated . ¿Me pregunto cómo funciona? Luego eche un vistazo al código :)
El repositorio consta de 1) Biblioteca Pytorch, 2) herramientas de línea de comandos y 3) recetas de estilo ESPNet. La primera es una biblioteca de Pytorch para proporcionar funcionalidad de Wavanet. El segundo es un conjunto de herramientas para ejecutar la capacitación/inferencia de Wavenet, el procesamiento de datos, etc. La última es la receta reproducible que combinan la biblioteca Wavenet y las herramientas de utilidad. Por favor, échales un vistazo a su propósito. Si desea construir su Wavenet en su conjunto de datos (supongo que este es el caso más probable), la receta es la forma para usted.
git clone https://github.com/r9y9/wavenet_vocoder && cd wavenet_vocoder
pip install -e .
Si solo necesita la parte de la biblioteca, puede instalarla desde PYPI:
pip install wavenet_vocoder
El repositorio proporciona recetas de estilo kaldi para hacer que los experimentos sean reproducibles y fácilmente manejables. Las recetas disponibles son las siguientes:
mulaw256 : Wavenet que utiliza la distribución de salida categórica. La entrada es una forma de onda cuantificada Mulaw de 8 bits.mol : Mezcla de logística (mol) Wavenet. La entrada es audio sin procesar de 16 bits.gaussian : Wavenet de un solo gaussiano (también conocido como maestro Wavenet of Clarinet). La entrada es audio sin procesar de 16 bits. Toda la receta ha run.sh , que especifica todos los pasos para realizar entrenamiento/inferencia de Wavenet, incluido el preprocesamiento de datos. Consulte Run.Sh en el directorio EGS para más detalles.
Aviso : el acondicionamiento global para Wavenet de múltiples altavoces no es compatible con las recetas anteriores (aunque no debería ser difícil de implementar). Consulte V0.1.12 para ver la función, o si realmente necesita la función, plantee un problema.
Las recetas están diseñadas para ser genéricas para que uno pueda usarlas para cualquier conjunto de datos. Para aplicar recetas a su propio conjunto de datos, debe colocar todos los archivos WAV en un solo directorio plano. es decir,
> tree -L 1 ~/data/LJSpeech-1.1/wavs/ | head
/Users/ryuichi/data/LJSpeech-1.1/wavs/
├── LJ001-0001.wav
├── LJ001-0002.wav
├── LJ001-0003.wav
├── LJ001-0004.wav
├── LJ001-0005.wav
├── LJ001-0006.wav
├── LJ001-0007.wav
├── LJ001-0008.wav
├── LJ001-0009.wav
¡Eso es todo! El último paso es modificar db_root en run.sh o dar db_root como argmment de línea de comandos para run.sh.
./run.sh --stage 0 --stop-stage 0 --db-root ~/data/LJSpeech-1.1/wavs/
Una receta generalmente consiste en múltiples pasos. Se recomienda ejecutar la receta paso a paso para comprender cómo funciona por primera vez. Para hacerlo, especifique stage y stop_stage de la siguiente manera:
./run.sh --stage 0 --stop-stage 0
./run.sh --stage 1 --stop-stage 1
./run.sh --stage 2 --stop-stage 2
En situaciones típicas, necesitaría especificar dispositivos CUDA explícitamente para un paso de entrenamiento.
CUDA_VISIBLE_DEVICES="0,1" ./run.sh --stage 2 --stop-stage 2
Las herramientas de línea de comandos son escritas con Docopt. Vea cada documento para los usos básicos.
Volcar los hiperparámetros a un archivo JSON.
Uso:
python tojson.py --hparams="parameters you want to override" <output_json_path>
Uso:
python preprocess.py wavallin ${dataset_path} ${out_dir} --preset=<json>
Nota: Para el entrenamiento de GPU múltiple, es mejor que se asegure de que Batch_Size % num_gpu == 0
Uso:
python train.py --dump-root=${dump-root} --preset=<json>
--hparams="parameters you want to override"
Dado un directorio que contiene características de acondicionamiento local, sintetice las formas de onda para ellas.
Uso:
python evaluate.py ${dump_root} ${checkpoint} ${output_dir} --dump-root="data location"
--preset=<json> --hparams="parameters you want to override"
Opciones:
--num-utterances=<N> : número de expresiones que se generarán. Si no se especifica, genere todos los puntos de vista. Esto es útil para la depuración. AVISO : Esto probablemente no esté funcionando ahora. Utilice Evaluate.py en su lugar.
Sintetizar la forma de onda Da una característica de acondicionamiento.
Uso:
python synthesis.py ${checkpoint_path} ${output_dir} --preset=<json> --hparams="parameters you want to override"
Opciones importantes:
--conditional=<path> : (requerido para wavenet condicional) ruta de las características condicionales locales (.npy). Si esto se especifica, el número de pasos de tiempo para generar se determina por el tamaño de la característica condicional.AVISO : Esto probablemente no esté funcionando ahora. Consulte V0.1.1 para la versión de trabajo.
python train.py --dump-root=./data/cmu_arctic/
--hparams="cin_channels=-1,gin_channels=-1"
Debe deshabilitar el acondicionamiento global y local estableciendo gin_channels y cin_channels en valores negativos.
python train.py --dump-root=./data/cmu_arctic/ --speaker-id=0
--hparams="cin_channels=80,gin_channels=-1"
AVISO : Esto probablemente no esté funcionando ahora. Consulte V0.1.1 para la versión de trabajo.
python train.py --dump-root=./data/cmu_arctic/
--hparams="cin_channels=80,gin_channels=16,n_speakers=7"
Los registros se arrojan en el directorio ./log de forma predeterminada. Puede monitorear registros por TensorBoard:
tensorboard --logdir=log
¡¡Muchas gracias!! Si encuentra uno nuevo, envíe un PR.