Implementação da "Rede de atenção informada de duração para síntese multimodal" (https://arxiv.org/pdf/1909.01700.pdf).
Status : liberado
Durian é arquitetura do codificador para tarefa de síntese de texto em fala. Ao contrário de arquiteturas anteriores como o Tacotron 2, ele não aprende mecanismo de atenção, mas leva em consideração as informações de durações de fonemas. Portanto, é claro, para usar este modelo um modelo um deve ter um conjunto de dados fonemizado e alinhado à duração. No entanto, você pode tentar usar o modelo de duração pré -treinamento no conjunto de dados LJSpeech (ditado CMU usado). Os links serão fornecidos abaixo.
O modelo durian consiste em dois módulos: sintetizador de backbone e preditor de duração. Aqui estão algumas das diferenças mais notáveis de Durian descritas em papel:
O sintetizador de backbone e o modelo de duração são treinados simultaneamente. Para simplificações de implementação, o modelo de duração prevê o alinhamento sobre o número máximo fixo de quadros. Você pode aprender essas saídas como problema de BCE, MSE, resumindo sobre o eixo dos quadros ou para usar as duas perdas (não testei este), defina-o no config.json . As experiências mostraram que a versão Just-BCE do processo de otimização mostrou-se instável com sequências de texto mais longas; portanto, prefira usar MSE+BCE ou Just-MSE (não se importe se você receber alinhamentos ruins no tensorboard).
Você pode verificar o wavfile de demonstração de síntese (foi obtido muito antes da convergência) na pasta demo (vocoder de glow de onda usado).
Primeiro de tudo, verifique se você instalou todos os pacotes usando pip install --upgrade -r requirements.txt . O código é testado usando pytorch==1.5.0
Clone o repositório: git clone https://github.com/ivanvovk/DurrIAN
Para iniciar o treinamento, a versão durian baseada em papel, execute python train.py -c configs/default.json . Você pode especificar para treinar o modelo de linha de base como python train.py -c configs/baseline.json --baseline
Para garantir que tudo funcione bem no ambiente local, você pode executar testes de unidade na pasta tests por python <test_you_want_to_run.py> .
Esta implementação foi treinada usando o conjunto de dados LJSPEECH alinhado por duração por duração com minimização de perda de duração da AC. Você pode encontrá -lo através deste link.
A principal desvantagem deste modelo está exigindo o conjunto de dados alinhado à duração. Você pode encontrar a lista de fileiras LJSpeech LJSECH usada no treinamento da implementação atual na pasta filelists . Para usar seus dados, verifique se você organizou seus filmes da mesma maneira que os LJSpeech os fornecem. No entanto, para economizar tempo e neurônios de seus cérebros, você pode tentar treinar o modelo no seu conjunto de dados sem alinhamento de duração usando o modelo de duração de LJSpeech no meu ponto de verificação do meu modelo (não tentei). Mas se você estiver interessado em alinhar o conjunto de dados pessoal, siga cuidadosamente a próxima seção.
Nos meus experimentos, alinhei o LJSpeech com a ferramenta de alinhamento forçada de Montreal. Se aqui algo não estiver claro, siga as instruções nos documentos do Toolkit. Para começar, o alinhamento de alinhamento tem várias etapas:
Organize seu conjunto de dados corretamente. O MFA exige que ele esteja em uma única pasta de estrutura {utterance_id.lab, utterance_id.wav}. Verifique se todos os seus textos são do formato .lab .
Faça o download do MFA Libere e siga as instruções de instalação através deste link.
Uma vez feito com o MFA, você precisa do seu dicionário de palavras do conjunto de dados com transcrições de fonemas. Aqui você tem várias opções:
bin/mfa_generate_dictionary /path/to/model_g2p.zip /path/to/data dict.txt . Observe que a instalação padrão do MFA fornecerá automaticamente o modelo de pré -treinamento em inglês, que você pode usar. Depois de preparar seus dados, dicionário e modelo G2P, agora você está pronto para o alinhamento. Execute o comando bin/mfa_align /path/to/data dict.txt path/to/model_g2p.zip outdir . Espere até terminar. A pasta outdir conterá uma lista de palavras fora do vocabulário e uma pasta com arquivos especiais do formato .TextGrid , onde os alinhamentos das ondas são armazenados.
Agora queremos processar esses arquivos de grade de texto para obter a lista de fileiras finais. Aqui você pode achar útil o pacote python TextGrid . Instale -o usando pip install TextGrid . Aqui um exemplo de como usá -lo:
import textgrid
tg = textgrid.TextGrid.fromFile('./outdir/data/text0.TextGrid')
Agora tg é o conjunto dois objetos: primeiro contém palavras alinhadas, o segundo contém fonemas alinhados. Você precisa do segundo. Extrair durações (nos quadros! tg tem intervalos em segundos, convertem assim) para o conjunto de dados inteiro, iterando sobre arquivos .TextGrid obtidos e prepare uma lista de fileiras no mesmo formato que eu forneci na pasta filelists .
Encontrei uma visão geral de vários alinhadores. Talvez seja útil. No entanto, eu recomendo que você use o MFA, pois é um dos alinhadores mais precisos, para meu melhor conhecimento.