IMS Toucan es un conjunto de herramientas para la capacitación, el uso y la enseñanza de la síntesis de texto a voz de vanguardia, desarrollada en el Instituto de Procesamiento del Lenguaje Natural (IMS), Universidad de Stuttgart, Alemania , hogar oficial del sistema Toucantts masivamente multilingüe. Nuestro sistema es rápido, controlable y no requiere una tonelada de cómputo.

Si encuentra útil este repositorio, considere darle una estrella. Los grandes números me hacen feliz y son muy motivadores. Si quieres motivarme aún más, incluso puedes considerar patrocinar este kit de herramientas. Solo usamos patrocinadores de GitHub para esto, hay estafadores en otras plataformas que pretenden ser el creador. No dejes que te engañen. El código y los modelos son absolutamente gratuitos, y gracias al generoso apoyo de abrazar la cara?, Incluso tenemos una instancia del modelo que se ejecuta en GPU gratis para que cualquiera lo use.
¿Echa un vistazo a nuestra demostración interactiva masivamente multi-lingüística en la cara abrazada?
¿También hemos publicado un conjunto de datos TTS multilingüe masivo en la cara de abrazo?
Se puede encontrar una lista de idiomas compatibles aquí
Python 3.10 es la versión recomendada.
Para instalar este kit de herramientas, clono en la máquina en la que desea usarla (debe tener al menos una GPU habilitada para CUDA si tiene la intención de entrenar modelos en esa máquina. Para inferencia, no necesita una GPU).
Si está utilizando Linux, debe tener los siguientes paquetes instalados o instalarlos con apt-get si no lo ha hecho (en la mayoría de las distribuciones vienen preinstaladas):
libsndfile1
espeak-ng
ffmpeg
libasound-dev
libportaudio2
libsqlite3-dev
Navegue al directorio que ha clonado. Recomendamos crear y activar un entorno virtual para instalar los requisitos básicos en. Los comandos a continuación resumen todo lo que necesita hacer en Linux. Si está ejecutando Windows, la segunda línea debe cambiarse, eche un vistazo a la documentación de VenV.
python -m venv <path_to_where_you_want_your_env_to_be>
source <path_to_where_you_want_your_env_to_be>/bin/activate
pip install --no-cache-dir -r requirements.txt
Ejecute la segunda línea cada vez que comience a usar la herramienta nuevamente para activar el entorno virtual nuevamente, si, por ejemplo, se registró mientras tanto. Para utilizar una GPU, no necesita hacer nada más en una máquina Linux. En una máquina de Windows, eche un vistazo al sitio web oficial de Pytorch para el comando de instalación que permite el soporte de GPU.
Si no desea que los modelos previos y capacitados, así como los archivos de caché resulten del preprocesamiento de sus conjuntos de datos se almacenen en las subcarpetas predeterminadas, puede establecer los directorios correspondientes a nivel mundial editando Utility/storage_config.py para satisfacer sus necesidades (la ruta puede ser relativa al directorio de repositorio o absoluto).
No necesita usar modelos previos a la aparición, pero puede acelerar las cosas enormemente. Se descargarán sobre la marcha automáticamente cuando sean necesarios, gracias a abrazar la cara. y VB en particular.
Espeak-NG es un requisito opcional, que maneja muchos casos especiales en muchos idiomas, por lo que es bueno tenerlo.
En la mayoría de los entornos de Linux ya se instalará, y si no es así, y tiene los derechos suficientes, puede instalarlo simplemente ejecutando
apt-get install espeak-ng
Para Windows , proporcionan un conveniente archivo del instalador .msi en su página de lanzamiento de GitHub. Después de la instalación en sistemas no linux, también deberá decirle a la biblioteca Phonemizer dónde encontrar su instalación de espeak configurando la variable de entorno PHONEMIZER_ESPEAK_LIBRARY , que se discute en este tema.
Para Mac , desafortunadamente es mucho más complicado. Gracias a Sang Hyun Park, aquí hay una guía para instalarlo en Mac: para M1 Macs, el método más conveniente para instalar Espeak-NG en su sistema es a través de un puerto MacPorts de Espeak-NG. MacPorts en sí se puede instalar desde el sitio web de MacPorts, que también requiere Xcode de Apple. Una vez que se hayan instalado Xcode y MacPorts, puede instalar el puerto de Espeak-NG a través de
sudo port install espeak-ng
Como se indica en las instrucciones de instalación de Windows, la instalación de espeak-ng deberá establecerse como una variable para la biblioteca de fonemizador. La variable de entorno es PHONEMIZER_ESPEAK_LIBRARY como se da en el hilo GitHub vinculado anteriormente. Sin embargo, el archivo de instalación espeak-ng en el que necesita establecer esta variable es un archivo .dylib en lugar de un archivo .dll en Mac. Para localizar el archivo de biblioteca espeak-ng, puede ejecutar port contents espeak-ng . El archivo específico que está buscando se llama libespeak-ng.dylib .
Puede cargar sus modelos capacitados, o el practicado proporcionado uno, utilizando InferenceInterfaces/ToucanTTSInterface.py . Simplemente cree un objeto a partir de él con el mango de directorio adecuado que identifica el modelo que desea usar. El resto debería funcionar en segundo plano. Es posible que desee establecer una incrustación de lenguaje o un altavoz incrustado utilizando las funciones set_language y set_speaker_embedding . La mayoría de las cosas deben explicarse por sí misma.
Una InferenceInterface contiene dos métodos para crear audio a partir de texto. Son read_to_file y read_aloud .
Read_to_file toma como entrada una lista de cadenas y un nombre de archivo. Sintetizará las oraciones en la lista y las concatizará con una breve pausa en el medio y las escribirá en el filepático que suministra como el otro argumento.
Read_aloud toma solo una cadena, que luego se convertirá en discurso e inmediatamente jugará usando los altavoces del sistema. Si establece la vista de argumento opcional en verdadero , aparecerá una visualización, que debe cerrar para que el programa continúe.
Su uso se demuestra en run_interactive_demo.py y run_text_to_file_reader.py .
Existen parámetros de escala simples para controlar la duración, la varianza de la curva de tono y la varianza de la curva de energía. Puede cambiarlos en el código cuando use la demostración interactiva o el lector, o simplemente puede pasarlos a la interfaz cuando lo use en su propio código.
Para cambiar el lenguaje del modelo y ver qué idiomas están disponibles en nuestro modelo previo a la aparición, eche un vistazo a la lista vinculada aquí
En el directorio llamado Utilidad hay un archivo llamado path_to_transcript_dicts.py . En este archivo, debe escribir una función que devuelva un diccionario que tenga todas las rutas absolutas a cada uno de los archivos de audio en su conjunto de datos como cadenas como las claves y las transcripciones textuales de los audios correspondientes como los valores.
Luego vaya al directorio TrainingInterfaces/recetas . Allí, haga una copia del archivo finetuning_example_simple.py si solo desea Finetune en un solo conjunto de datos o finetuning_example_multilingual.py si desea Finetune en múltiples conjuntos de datos, potencialmente incluso varios idiomas. Usaremos esta copia como referencia y solo haremos los cambios necesarios para usar el nuevo conjunto de datos. Encuentre las llamadas (s) a la función prepare_tts_corpus . Reemplace el path_to_transcript_dict utilizado allí con el uno (s) que acaba de crear. Luego cambie el nombre del directorio de caché correspondiente a algo que tenga sentido para el conjunto de datos. También tenga en cuenta la variable save_dir , que es donde se guardarán los puntos de control. Este es un valor predeterminado, puede sobrescribirlo al llamar a la tubería más tarde utilizando un argumento de línea de comandos, en caso de que desee ajustar desde un punto de control y, por lo tanto, guardar en un directorio diferente. Finalmente, cambie el argumento de Lang en la creación del conjunto de datos y en la función de llamada a la función de bucle de trenes a la ID de idioma ISO 639-3 que coincida con sus datos.
Los argumentos que se dan al circuito del tren en los ejemplos de sintonización finos están destinados al caso de la sintonización de un modelo previo a la petróleo. Si desea entrenar desde cero, eche un vistazo a una tubería diferente que tenga Toucantts en su nombre y mire los argumentos utilizados allí.
Una vez que esto esté completo, ya casi terminamos, ahora solo necesitamos ponerlo a disposición del archivo run_training_pipeline.py en el nivel superior. En dicho archivo, importe la función Ejecutar desde la tubería que acaba de crear y dale un nombre significativo. Ahora en el Pipeline_Dict , agregue su función importada como valor y use como clave una taquigrafía que tenga sentido.
Una vez que tenga una receta construida, el entrenamiento es súper fácil:
python run_training_pipeline.py <shorthand of the pipeline>
Puede proporcionar cualquiera de los siguientes argumentos, pero no tiene que hacerlo (aunque para la capacitación definitivamente debe especificar al menos una ID de GPU).
--gpu_id <ID of the GPU you wish to use, as displayed with nvidia-smi, default is cpu. If multiple GPUs are provided (comma separated), then distributed training will be used, but the script has to be started with torchrun.>
--resume_checkpoint <path to a checkpoint to load>
--resume (if this is present, the furthest checkpoint available will be loaded automatically)
--finetune (if this is present, the provided checkpoint will be fine-tuned on the data from this pipeline)
--model_save_dir <path to a directory where the checkpoints should be saved>
--wandb (if this is present, the logs will be synchronized to your weights&biases account, if you are logged in on the command line)
--wandb_resume_id <the id of the run you want to resume, if you are using weights&biases (you can find the id in the URL of the run)>
Para la capacitación multi-GPU, debe suministrar múltiples ID de GPU (comas separadas) e iniciar el script con Torchrun. También debe especificar el número de GPU. Esto tiene que coincidir con el número de ID que suministra. Cuidado: ¡Torchrun es incompatible con Nohup! Use TMUX en su lugar para mantener el script en ejecución después de cerrar la sesión del shell.
torchrun --standalone --nproc_per_node=4 --nnodes=1 run_training_pipeline.py <shorthand of the pipeline> --gpu_id "0,1,2,3"
Después de cada época (o alternativamente después de ciertos que cuenta de paso), se escribirán algunos registros en la consola y en el sitio web de pesos y sesgos, si ha iniciado sesión y establece el indicador. Si obtiene CUDA fuera de los errores de memoria, debe disminuir el lote en los argumentos de la llamada al entrenamiento_loop en la tubería que está ejecutando. Intente disminuir el lote en pequeños pasos hasta que no obtenga más de los errores de memoria CUDA.
En el directorio que especificó para guardar, aparecerán archivos de punto de control y datos de visualización del espectrograma. Dado que los puntos de control son bastante grandes, solo se mantendrán los cinco más recientes. La cantidad de pasos de entrenamiento depende en gran medida de los datos que esté utilizando y si está finalmente sintonizando un punto de control previamente provocado o entrenamiento desde cero. Cuantos menos datos tenga, menos pasos que debe tomar para evitar un posible colapso. Si quieres parar antes, solo mata el proceso, ya que todo es Daemonic, todos los procesos de niños deberían morir con él. En caso de que queden algunos procesos fantasmas, puedes usar el siguiente comando para encontrarlos y matarlos manualmente.
fuser -v /dev/nvidia*
Cada vez que se guarda un punto de control, también se crea una versión comprimida que se puede usar para la inferencia, que se llama Best.py
Aquí hay algunos puntos que fueron presentados por los usuarios:
run_scorer.py .UserWarning: Detected call of lr_scheduler.step() before optimizer.step(). - Utilizamos un planificador personalizado y la antorcha cree incorrectamente que llamamos al programador y al optimizador en el orden incorrecto. Solo ignora esta advertencia, no tiene sentido.WARNING[XFORMERS]: xFormers can't load C++/CUDA extensions. [...] - Otra advertencia sin sentido. En realidad, no usamos Xformers nosotros mismos, es solo parte de las dependencias de una de nuestras dependencias, pero no se usa en ningún lugar.The torchaudio backend is switched to 'soundfile'. Note that 'sox_io' is not supported on Windows. [...] - Simplemente sucede en Windows y no afecta nada.WARNING:phonemizer:words count mismatch on 200.0% of the lines (2/1) [...] - No tenemos idea de por qué ESPEAK comenzó a dar esta advertencia, sin embargo, no parece afectar nada, por lo que parece seguro ignorarlo.NaN : las tasas de aprendizaje predeterminadas funcionan en datos limpios. Si sus datos están menos limpios, intente usar el anotador para encontrar muestras problemáticas o reducir la tasa de aprendizaje. El problema más común es que haya pausas en el discurso, pero nada que les sugiera en el texto. Es por eso que ASR Corpera, que deja de lado la puntuación, suele ser difícil de usar para TTS. Los módulos básicos de Pytorch de FastSpeech 2 y GST se toman de ESPNet, los módulos Pytorch de Hifi-Gan se toman del repositorio paralelo de Wavegan. Algunos módulos relacionados con el Postnet basado en el FlowMewing condicional como se describe en Matchatts se toman de la base de código Matchatts oficial y algunos se toman de la base de código Stabletts. Para la conversión de grafema a fonema, confiamos en el mencionado ESPEAK-NG y Transphone. Utilizamos Codec, un códec de audio neural como representación intermedia para almacenar en caché los datos del tren para ahorrar espacio.
@inproceedings{lux2021toucan,
year = 2021,
title = {{The IMS Toucan system for the Blizzard Challenge 2021}},
author = {Florian Lux and Julia Koch and Antje Schweitzer and Ngoc Thang Vu},
booktitle = {Blizzard Challenge Workshop},
publisher = {ISCA Speech Synthesis SIG}
}
@inproceedings{lux2022laml,
year = 2022,
title = {{Language-Agnostic Meta-Learning for Low-Resource Text-to-Speech with Articulatory Features}},
author = {Florian Lux and Ngoc Thang Vu},
booktitle = {ACL}
}
@inproceedings{lux2022cloning,
year = 2022,
title = {{Exact Prosody Cloning in Zero-Shot Multispeaker Text-to-Speech}},
author = {Lux, Florian and Koch, Julia and Vu, Ngoc Thang},
booktitle = {SLT},
publisher = {IEEE}
}
@inproceedings{lux2022lrms,
year = 2022,
title = {{Low-Resource Multilingual and Zero-Shot Multispeaker TTS}},
author = {Florian Lux and Julia Koch and Ngoc Thang Vu},
booktitle = {AACL}
}
@inproceedings{lux2023controllable,
year = 2023,
title = {{Low-Resource Multilingual and Zero-Shot Multispeaker TTS}},
author = {Florian Lux and Pascal Tilli and Sarina Meyer and Ngoc Thang Vu},
booktitle = {Interspeech}
publisher = {ISCA}
}
@inproceedings{lux2023blizzard,
year = 2023,
title = {{The IMS Toucan System for the Blizzard Challenge 2023}},
author = {Florian Lux and Julia Koch and Sarina Meyer and Thomas Bott and Nadja Schauffler and Pavel Denisov and Antje Schweitzer and Ngoc Thang Vu},
booktitle = {Blizzard Challenge Workshop},
publisher = {ISCA Speech Synthesis SIG}
}
@inproceedings{lux2024massive,
year = 2024,
title = {{Meta Learning Text-to-Speech Synthesis in over 7000 Languages}},
author = {Florian Lux and Sarina Meyer and Lyonel Behringer and Frank Zalkow and Phat Do and Matt Coler and Emanuël A. P. Habets and Ngoc Thang Vu},
booktitle = {Interspeech}
publisher = {ISCA}
}