
Implementación de Pytorch de modelos de síntesis de texto a voz basados en redes convolucionales:
Las muestras de audio están disponibles en https://r9y9.github.io/deepvoice3_pytorch/.
Los cuadernos que se supone que deben ejecutarse en https://colab.research.google.com están disponibles:
NOTA : Los modelos previos a la aparición no son compatibles con el maestro. Para actualizarse pronto.
| Url | Modelo | Datos | Parámetros hiper | Git Commit | Pasos |
|---|---|---|---|---|---|
| enlace | DeepVoice3 | Ljspeech | enlace | ABF0A21 | 640k |
| enlace | Nyanko | Ljspeech | builder=nyanko,preset=nyanko_ljspeech | BA59DC7 | 585k |
| enlace | Deepoice3 de múltiples altavoces | VCTK | builder=deepvoice3_multispeaker,preset=deepvoice3_vctk | 0421749 | 300k + 300k |
Para usar modelos previamente capacitados, se recomienda encarecidamente que esté en la confirmación específica de GIT mencionada anteriormente. es decir,
git checkout ${commit_hash}
Luego siga la sección "Sintetizar desde un punto de control" en el ReadMe de la confirmación de GIT específica. Tenga en cuenta que la última versión de desarrollo del repositorio puede no funcionar.
Podrías intentarlo por ejemplo:
# pretrained model (20180505_deepvoice3_checkpoint_step000640000.pth)
# hparams (20180505_deepvoice3_ljspeech.json)
git checkout 4357976
python synthesis.py --preset=20180505_deepvoice3_ljspeech.json
20180505_deepvoice3_checkpoint_step000640000.pth
sentences.txt
output_dir
hparams.py para más detalles.builder especifica qué modelo desea usar. deepvoice3 , deepvoice3_multispeaker [1] y nyanko [2] se superponen.Instale los paquetes enumerados anteriormente primero y luego
git clone https://github.com/r9y9/deepvoice3_pytorch && cd deepvoice3_pytorch
pip install -e ".[bin]"
Hay muchos parámetros hiper que se pueden girar depende del modelo y los datos en los que esté trabajando. Para conjuntos de datos y modelos típicos, se proporcionan parámetros que se sabe que funcionan bien ( preestablecidos ) en el repositorio. Consulte el directorio presets para obtener más detalles. Notar que
preprocess.pytrain.pysynthesis.py Acepta --preset=<json> Parámetro opcional, que especifica dónde cargar parámetros preestablecidos. Si va a utilizar parámetros preestablecidos, debe usar el mismo --preset=<json> en todo el preprocesamiento, entrenamiento y evaluación. p.ej,
python preprocess.py --preset=presets/deepvoice3_ljspeech.json ljspeech ~/data/LJSpeech-1.0
python train.py --preset=presets/deepvoice3_ljspeech.json --data-root=./data/ljspeech
en lugar de
python preprocess.py ljspeech ~/data/LJSpeech-1.0
# warning! this may use different hyper parameters used at preprocessing stage
python train.py --preset=presets/deepvoice3_ljspeech.json --data-root=./data/ljspeech
Uso:
python preprocess.py ${dataset_name} ${dataset_path} ${out_dir} --preset=<json>
${dataset_name} s son:
ljspeech (EN, altavoz único)vctk (EN, múltiple vapor)jsut (JP, altavoz único)nikl_m (KO, múltiple altavoz)nikl_s (ko, altavoz único) Suponiendo que utilice parámetros preestablecidos que se sabe que funcionan bien para el conjunto de datos LJSPEECH/DeepVoice3 y tiene datos en ~/data/LJSpeech-1.0 , entonces puede preprocesar datos por:
python preprocess.py --preset=presets/deepvoice3_ljspeech.json ljspeech ~/data/LJSpeech-1.0/ ./data/ljspeech
Cuando esto se haga, verá características extraídas (espectrogramas MEL y espectrogramas lineales) en ./data/ljspeech .
La construcción de su propio conjunto de datos, con metadatos en formato JSON (compatible con CarpedM20/múltiple-speaker-tacotron-tensorflow) es actualmente compatible. Uso:
python preprocess.py json_meta ${list-of-JSON-metadata-paths} ${out_dir} --preset=<json>
Es posible que deba modificar el archivo JSON preestablecido preexistente, especialmente n_speakers . Para Multispeaker inglés, comience con presets/deepvoice3_vctk.json .
Suponiendo que tenga el conjunto de datos A (altavoz A) y el conjunto de datos B (altavoz B), cada uno descrito en el archivo de metadatos JSON ./datasets/datasetA/alignment.json y ./datasets/datasetB/alignment.json , entonces puede preprocesar datos por:
python preprocess.py json_meta "./datasets/datasetA/alignment.json,./datasets/datasetB/alignment.json" "./datasets/processed_A+B" --preset=(path to preset json file)
Algunos conjuntos de datos, especialmente el conjunto de datos generado automáticamente, puede incluir un largo silencio y ruidos iniciales indeseables, socavando el modelo SEQ2SEQ de nivel CHAR. (por ejemplo, VCTK, aunque esto está cubierto en VCTK_PROPROCESS)
Para lidiar con el problema, gentle_web_align.py
gentle_web_align.py usa Gentle, una herramienta de alineación de texto de voz basada en Kaldi. Esto accede a una aplicación suave para la web, se alinea segmentos de sonido dados con transcripciones y convierte el resultado en archivos de etiquetas de estilo HTK, que se procesarán en preprocess.py . Gentle se puede ejecutar en Linux/Mac/Windows (a través de Docker).
Los resultados preliminares muestran que si bien HTK/Festival/Method basado en Merlin en vctk_preprocess/prepare_vctk_labels.py funciona mejor en VCTK, Gentle es más estable con clips de audio con ruido ambiental. (por ejemplo, extractos de película)
Uso: (suponiendo que Gentle se ejecute en localhost:8567 (predeterminado cuando no se especifica)))
datasetA/wavs y las transcripciones están en datasetA/txts ) python gentle_web_align.py -w "datasetA/wavs/*.wav" -t "datasetA/txts/*.txt" --server_addr=localhost --port=8567
datasetB/speakerN/blahblah.wav y datasetB/speakerN/blahblah.txt ) python gentle_web_align.py --nested-directories="datasetB" --server_addr=localhost --port=8567
Una vez que tenga alineación de fonemas para cada enunciado, puede extraer características ejecutando preprocess.py
Uso:
python train.py --data-root=${data-root} --preset=<json> --hparams="parameters you may want to override"
Supongamos que construye un modelo de estilo DeepVoice3 utilizando el conjunto de datos LJSPEECH, luego puede capacitar a su modelo por:
python train.py --preset=presets/deepvoice3_ljspeech.json --data-root=./data/ljspeech/
Los puntos de control del modelo (.pth) y las alineaciones (.png) se guardan en el directorio ./checkpoints por 10000 pasos de forma predeterminada.
Pleae Verifique esto por adelantado y siga los comandos a continuación.
python preprocess.py nikl_s ${your_nikl_root_path} data/nikl_s --preset=presets/deepvoice3_nikls.json
python train.py --data-root=./data/nikl_s --checkpoint-dir checkpoint_nikl_s --preset=presets/deepvoice3_nikls.json
Los registros se arrojan en el directorio ./log de forma predeterminada. Puede monitorear registros por TensorBoard:
tensorboard --logdir=log
Dada una lista de texto, synthesis.py sintetiza señales de audio del modelo capacitado. El uso es:
python synthesis.py ${checkpoint_path} ${text_list.txt} ${output_dir} --preset=<json>
Ejemplo test_list.txt:
Generative adversarial network or variational auto-encoder.
Once upon a time there was a dear little girl who was loved by every one who looked at her, but most of all by her grandmother, and there was nothing that she would not have given to the child.
A text-to-speech synthesis system typically consists of multiple stages, such as a text analysis frontend, an acoustic model and an audio synthesis module.
VCTK y NIKL son un conjunto de datos compatible para construir un modelo de múltiples altavoces.
Dado que algunas muestras de audio en VCTK tienen largos silencios que afectan el rendimiento, se recomienda hacer una alineación de fonemas y eliminar silencios de acuerdo con VCTK_Process.
Una vez que tenga alineación de fonemas para cada enunciado, puede extraer funciones por:
python preprocess.py vctk ${your_vctk_root_path} ./data/vctk
Ahora que tiene datos preparados, puede entrenar una versión múltiple de DeepVoice3 por:
python train.py --data-root=./data/vctk --checkpoint-dir=checkpoints_vctk
--preset=presets/deepvoice3_vctk.json
--log-event-path=log/deepvoice3_multispeaker_vctk_preset
Si desea reutilizar la incrustación aprendida de otro conjunto de datos, entonces puede hacerlo en su lugar:
python train.py --data-root=./data/vctk --checkpoint-dir=checkpoints_vctk
--preset=presets/deepvoice3_vctk.json
--log-event-path=log/deepvoice3_multispeaker_vctk_preset
--load-embedding=20171213_deepvoice3_checkpoint_step000210000.pth
Esto puede mejorar un poco la velocidad de entrenamiento.
Podrá obtener muestras de audio limpias en ../nikl_precoSs. Los detalles se encuentran aquí.
Una vez que Nikl Corpus está listo para usar desde el preprocesamiento, puede extraer características por:
python preprocess.py nikl_m ${your_nikl_root_path} data/nikl_m
Ahora que tiene datos preparados, puede entrenar una versión múltiple de DeepVoice3 por:
python train.py --data-root=./data/nikl_m --checkpoint-dir checkpoint_nikl_m
--preset=presets/deepvoice3_niklm.json
Si tiene datos muy limitados, puede considerar probar el modelo previamente capacitado. Por ejemplo, utilizando el modelo previamente capacitado en LJSpeech, puede adaptarlo a los datos del hablante VCTK p225 (30 minutos) mediante el siguiente comando:
python train.py --data-root=./data/vctk --checkpoint-dir=checkpoints_vctk_adaptation
--preset=presets/deepvoice3_ljspeech.json
--log-event-path=log/deepvoice3_vctk_adaptation
--restore-parts="20171213_deepvoice3_checkpoint_step000210000.pth"
--speaker-id=0
Desde mi experiencia, puede obtener una calidad de habla razonable muy rápidamente en lugar de entrenar al modelo desde cero.
Hay dos opciones importantes utilizadas anteriormente:
--restore-parts=<N> : especifica dónde cargar los parámetros del modelo. Las diferencias de la opción --checkpoint=<N> son 1) --restore-parts=<N> ignora todos los parámetros no válidos, mientras que --checkpoint=<N> no. 2) --restore-parts=<N> Dígale al entrenador que comience desde 0 pasos, mientras que --checkpoint=<N> dígale al entrenador que continúe desde el último paso. --checkpoint=<N> debería estar bien si está utilizando exactamente el mismo modelo y continúa entrenando, pero sería útil si desea personalizar su arquitectura de modelos y tomar ventajas del modelo previamente capacitado.--speaker-id=<N> : especifica qué altavoz de datos se usa para el entrenamiento. Esto solo debe especificarse si está utilizando un conjunto de datos de múltiples altavoces. En cuanto a VCTK, la ID del altavoz se asigna automáticamente de forma incremental (0, 1, ..., 107) de acuerdo con el speaker_info.txt en el conjunto de datos. Si está entrenando al modelo de múltiples altavoces, la adaptación de los altavoces solo funcionará cuando n_speakers sea idéntica .
Esto puede suceder dependiendo de los backends que tenga para matplotlib. Intente cambiar el backend para matplotlib y vea si funciona de la siguiente manera:
MPLBACKEND=Qt5Agg python train.py ${args...}
En el #78, Engiecat informó que cambiar el backend de Matplotlib de Tkinter (TKAGG) a PYQT5 (QT5AGG) solucionó el problema.
Parte del código se adaptó de los siguientes proyectos:
Banner y logotipo creado por @jraulhernandezi (#76)