O IMS Toucan é um kit de ferramentas para treinamento, uso e ensino de síntese de texto em fala, desenvolvido no Instituto de Processamento de Linguagem Natural (IMS), Universidade de Stuttgart, Alemanha , lar oficial do sistema Toucantts massivamente multilíngue. Nosso sistema é rápido, controlável e não requer uma tonelada de computação.

Se você achar esse repositório útil, considere dar -lhe uma estrela. Grandes números me deixam feliz e são muito motivadores. Se você deseja me motivar ainda mais, pode até considerar patrocinar este kit de ferramentas. Usamos apenas patrocinadores do Github para isso, existem golpistas em outras plataformas que fingem ser o criador. Não os deixe enganar. O código e os modelos são absolutamente gratuitos e, graças ao apoio generoso de abraçar o rosto?, Temos até uma instância do modelo em execução na GPU grátis para alguém usar.
Confira nossa demonstração interativa massivamente-lingual em abraçar o rosto?
Também publicamos um conjunto de dados TTS multilíngue massivamente multilíngue no rosto abraçado?
Uma lista de idiomas suportados pode ser encontrada aqui
Python 3.10 é a versão recomendada.
Para instalar este kit de ferramentas, clone -o na máquina em que você deseja usá -lo (deve ter pelo menos um GPU habilitado para CUDA se você pretende treinar modelos nessa máquina. Para inferência, você não precisa de uma GPU).
Se você estiver usando o Linux, deve ter os pacotes a seguir instalados ou instalá-los com apt-get se não tiver (na maioria das distribuições que elas vêm pré-instaladas):
libsndfile1
espeak-ng
ffmpeg
libasound-dev
libportaudio2
libsqlite3-dev
Navegue até o diretório que você clonou. Recomendamos criar e ativar um ambiente virtual para instalar os requisitos básicos. Os comandos abaixo resumem tudo o que você precisa fazer no Linux. Se você estiver executando o Windows, a segunda linha precisará ser alterada, dê uma olhada na documentação do 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
Execute a segunda linha toda vez que começar a usar a ferramenta novamente para ativar o ambiente virtual novamente, se você efetuou o login nesse meio tempo. Para fazer uso de uma GPU, você não precisa fazer mais nada em uma máquina Linux. Em uma máquina Windows, dê uma olhada no site oficial do Pytorch para o comando de instalação que permite o suporte à GPU.
Se você não deseja os modelos pré -treinados e treinados, bem como os arquivos de cache resultantes do pré -processamento de seus conjuntos de dados a serem armazenados nas subpastas padrão, você pode definir diretórios correspondentes globalmente, editando Utility/storage_config.py para atender às suas necessidades (o caminho pode ser relativo ao diretório de raiz do repositório ou absoluto).
Você não precisa usar modelos pré -traidos, mas isso pode acelerar tremendamente as coisas. Eles serão baixados automaticamente quando forem necessários, graças a abraçar o rosto? e VB em particular.
O Espeak-NG é um requisito opcional, que lida com muitos casos especiais em vários idiomas, por isso é bom ter.
Na maioria dos ambientes Linux, ele já será instalado e, se não for, e você tem os direitos suficientes, você pode instalá -lo simplesmente executando
apt-get install espeak-ng
Para o Windows , eles fornecem um arquivo de instalador .msi conveniente na página de lançamento do GitHub. Após a instalação em sistemas não-Linux, você também precisará informar à biblioteca Phonemizer onde encontrar sua instalação Espeak, configurando a variável PHONEMIZER_ESPEAK_LIBRARY Environment, que é discutida neste problema.
Para Mac , infelizmente é muito mais complicado. Graças ao Sang Hyun Park, aqui está um guia para instalá-lo no Mac: para M1 Macs, o método mais conveniente para instalar Espeak-NG no seu sistema é através de uma porta Macports da Espeak-NG. O próprio Macports pode ser instalado no site da Macports, que também requer o Xcode da Apple. Depois que o Xcode e Macports forem instalados, você pode instalar a porta do Espeak-NG via
sudo port install espeak-ng
Conforme indicado nas instruções de instalação do Windows, a instalação do Espeak-NG precisará ser definida como uma variável para a biblioteca do Phonemizer. A variável de ambiente é PHONEMIZER_ESPEAK_LIBRARY conforme fornecido no thread GitHub vinculado acima. No entanto, o arquivo de instalação Espeak-NG para você definir essa variável é um arquivo .dylib em vez de um arquivo .dll no mac. Para localizar o arquivo de biblioteca Espeak-NG, você pode executar port contents espeak-ng . O arquivo específico que você está procurando é chamado libespeak-ng.dylib .
Você pode carregar seus modelos treinados, ou o pré -treinamento, fornecendo um, usando o InferenceInterfaces/ToucanTTSInterface.py . Basta criar um objeto com o identificador de diretório adequado, identificando o modelo que você deseja usar. O resto deve funcionar em segundo plano. Você pode definir uma incorporação de idiomas ou uma incorporação de alto -falante usando as funções Set_Language e Set_Speaker_Embedding . A maioria das coisas deve ser auto-explicativa.
Um inferenceInterface contém dois métodos para criar áudio a partir do texto. Eles são read_to_file e read_aloud .
read_to_file toma como entrada uma lista de strings e um nome de arquivo. Ele sintetizará as frases na lista e as concatenará com uma breve pausa no meio e as escreverá no FilePath que você fornece como o outro argumento.
Read_aloud pega apenas uma string, que ela converterá para a fala e reproduzirá imediatamente usando os alto -falantes do sistema. Se você definir a visualização de argumento opcional como True , uma visualização será exibida, que você precisa fechar para que o programa continue.
Seu uso é demonstrado em run_interactive_demo.py e run_text_to_file_reader.py .
Existem parâmetros de escala simples para controlar a duração, a variação da curva de afinação e a variação da curva de energia. Você pode alterá -los no código ao usar a demonstração interativa ou o leitor ou simplesmente passá -los para a interface quando o usar em seu próprio código.
Para alterar a linguagem do modelo e ver quais idiomas estão disponíveis em nosso modelo pré -treinado, dê uma olhada na lista vinculada aqui
No diretório chamado utilitário , existe um arquivo chamado path_to_transcript_dicts.py . Neste arquivo, você deve escrever uma função que retorne um dicionário que tenha todos os caminhos absolutos para cada um dos arquivos de áudio no seu conjunto de dados como strings como as chaves e as transcrições textuais dos áudios correspondentes como valores.
Em seguida, vá para o Directory TrainingInterfaces/Recipes . Lá, faça uma cópia do arquivo finetuning_example_simple.py se você deseja apenas o FineTune em um único conjunto de dados ou finetuning_example_multilingual.py se você deseja definir em vários conjuntos de dados, potencialmente até vários idiomas. Usaremos essa cópia como referência e faremos apenas as alterações necessárias para usar o novo conjunto de dados. Encontre as chamadas para a função prepare_tts_corpus . Substitua o path_to_transcript_dict usado lá pelo (s) que você acabou de criar. Em seguida, altere o nome do diretório de cache correspondente para algo que faz sentido para o conjunto de dados. Procure também a variável save_dir , que é para onde os pontos de verificação serão salvos. Esse é um valor padrão, você pode substituí-lo ao ligar para o pipeline posteriormente usando um argumento da linha de comando, caso você queira ajustar um ponto de verificação e, assim, salvar em um diretório diferente. Por fim, altere o argumento Lang na criação do conjunto de dados e na função de chamada para o loop de trem para o ID do idioma ISO 639-3 que corresponde aos seus dados.
Os argumentos que são dados ao loop de trem nos exemplos de Finetuning são destinados ao caso de finetuning de um modelo pré -treinado. Se você deseja treinar do zero, dê uma olhada em um pipeline diferente que tenha toucantts em seu nome e observe os argumentos usados lá.
Uma vez concluído, quase terminamos, agora precisamos disponibilizá -lo para o arquivo run_training_pipeline.py no nível superior. No referido arquivo, importe a função Run a partir do pipeline que você acabou de criar e dê um nome significativo. Agora, no The Pipeline_dict , adicione sua função importada como valor e use como chave uma abreviação que faz sentido.
Depois de construir uma receita, o treinamento é super fácil:
python run_training_pipeline.py <shorthand of the pipeline>
Você pode fornecer qualquer um dos argumentos a seguir, mas não precisa (embora, para o treinamento, você definitivamente deve especificar pelo menos um ID da 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 treinamento multi-GPU, você deve fornecer vários IDs de GPU (separados por vírgula) e iniciar o script com Torchrun. Você também precisa especificar o número de GPUs. Isso precisa corresponder ao número de IDs que você fornece. Cuidado: Torchrun é incompatível com Nohup! Use o TMUX para manter o script funcionando depois de sair do shell.
torchrun --standalone --nproc_per_node=4 --nnodes=1 run_training_pipeline.py <shorthand of the pipeline> --gpu_id "0,1,2,3"
Depois de cada época (ou alternativamente após determinadas etapas), alguns logs serão gravados no console e no site de pesos e preconceitos, se você estiver conectado e definir o sinalizador. Se você tirar o CUDA dos erros de memória, precisará diminuir o tamanho do lote nos argumentos da chamada para o treinamento do pipeline que você está executando. Tente diminuir o tamanho do lotes em pequenas etapas até obter mais de erros de memória do CUDA.
No diretório que você especificou para salvar, arquivos de ponto de verificação e dados de visualização do espectrograma aparecerão. Como os pontos de verificação são bastante grandes, apenas os cinco mais recentes serão mantidos. A quantidade de etapas de treinamento depende muito dos dados que você está usando e se você está no Finetuning de um ponto de verificação pré -treinado ou treinamento do zero. Quanto menos dados você tiver, menos etapas você deve executar para evitar um possível colapso. Se você quiser parar mais cedo, basta matar o processo, já que tudo é daemônico, todos os processos infantis devem morrer com ele. Caso haja alguns processos fantasmas deixados para trás, você pode usar o seguinte comando para encontrá-los e matá-los manualmente.
fuser -v /dev/nvidia*
Sempre que um ponto de verificação é salvo, também é criada uma versão compactada que pode ser usada para inferência, que é nomeada melhor.py
Aqui estão alguns pontos que foram criados pelos usuários:
run_scorer.py .UserWarning: Detected call of lr_scheduler.step() before optimizer.step(). - Usamos um agendador personalizado e a tocha pensa incorretamente que chamamos o agendador e o otimizador na ordem errada. Basta ignorar esse aviso, é completamente sem sentido.WARNING[XFORMERS]: xFormers can't load C++/CUDA extensions. [...] - Outro aviso sem sentido. Na verdade, não usamos o Xformers, é apenas parte das dependências de uma de nossas dependências, mas não é usado em nenhum lugar.The torchaudio backend is switched to 'soundfile'. Note that 'sox_io' is not supported on Windows. [...] - apenas acontece no Windows e não afeta nada.WARNING:phonemizer:words count mismatch on 200.0% of the lines (2/1) [...] - Não temos idéia de por que o Espeak começou a dar esse aviso, mas isso parece não afetar nada, por isso parece seguro ignorar.NaN - as taxas de aprendizado padrão funcionam em dados limpos. Se seus dados estiverem menos limpos, tente usar o goleador para encontrar amostras problemáticas ou reduzir a taxa de aprendizado. O problema mais comum é que haverá pausas no discurso, mas nada que sugere neles no texto. É por isso que o ASR Corpora, que deixa de fora pontuação, geralmente é difícil de usar para o TTS. Os módulos básicos de Pytorch do FastSpeech 2 e GST são retirados da ESPNET, os módulos Pytorch de Hifi-Gan são retirados do repositório de paralelo owavegan. Alguns módulos relacionados ao post -Net baseados em fluxo condicional, conforme descrito em matchatts, são retirados da base de código de matchatts oficiais e outros são retirados da base de código Stabletts. Para conversão de grafema para fonema, contamos com o mencionado Espeak-NG, bem como o Transphone. Utilizamos o Codec, um codec de áudio neural como representação intermediária para armazenar em cache os dados do trem para economizar espaço.
@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}
}