
WaveGrad
Implementação (Pytorch) do vocoder de graduação de alta fidelidade do Google Brain (papel). Primeira implementação no GitHub com geração de alta qualidade por 6-as-antererações.
Status
Fator em tempo real (RTF)
Número de parâmetros : 15.810.401
| Modelo | Estável | RTX 2080 TI | Tesla K80 | Intel Xeon 2.3GHz* |
|---|
| 1000 iterações | + | 9.59 | - | - |
| 100 iterações | + | 0,94 | 5.85 | - |
| 50 iterações | + | 0,45 | 2.92 | - |
| 25 iterações | + | 0,22 | 1.45 | - |
| 12 iterações | + | 0,10 | 0,69 | 4.55 |
| 6 iterações | + | 0,04 | 0,33 | 2.09 |
* Nota : Usei uma versão antiga da Intel Xeon CPU.
Sobre
O WaveGrad é um modelo condicional para geração de formas de onda através da estimativa de gradientes da densidade de dados com qualidade de amostragem similar a wavenet. Esse vocoder não é GaN, nem um fluxo normalizando, nem um modelo autoregressivo clássico . O principal conceito de vocoder é baseado em modelos probabilísticos de difusão (DDPM), que utilizam dinâmica de Langevin e estruturas correspondentes a pontuação . Além disso, em comparação com o DDPM clássico, o WaveGrad alcança a convergência super-rápida (6 iterações e provavelmente mais baixa) Wrt Langevin Dynamics Scheme de amostragem iterativa.
Instalação
- Clone este repo:
git clone https://github.com/ivanvovk/WaveGrad.git
cd WaveGrad
- Instalar requisitos:
pip install -r requirements.txt
Treinamento
1 Preparando dados
- Faça com que os filmes de trem e teste de seus dados de áudio, como os incluídos na pasta
filelists . - Faça um arquivo de configuração* na pasta
configs .
* Nota: se você quiser alterar hop_length para o STFT, verifique se o produto de seus factors de amostragem na configuração é igual ao seu novo hop_length .
2 Treinamento de GPU único e distribuído
- Open
runs/train.sh Script e especifique dispositivos GPU visíveis e caminho para o seu arquivo de configuração. Se você especificar mais de uma GPU, o treinamento será executado no modo distribuído. - Run
sh runs/train.sh
3 tensorboard e log
Para rastrear seu processo de treinamento, execute o Tensorboard por tensorboard --logdir=logs/YOUR_LOGDIR_FOLDER . Todas as informações e pontos de verificação de registro serão armazenados em logs/YOUR_LOGDIR_FOLDER . logdir é especificado no arquivo de configuração.
4 Pesquisa de grade de cronograma de ruído
Depois que o modelo é treinado, a pesquisa da grade da melhor programação* para um número necessário de iterações nos notebooks/inference.ipynb . O código suporta o paralelismo, para que você possa especificar mais de um número de trabalhos para acelerar a pesquisa.
* Nota : A pesquisa da grade é necessária apenas para um pequeno número de iterações (como 6 ou 7). Para um número maior, basta experimentar o Fibonacci Sequence benchmark.fibonacci(...) Inicialização: usei para 25 iteração e funciona bem. A partir do bom cronograma de 25-presas, por exemplo, você pode criar um cronograma de ordem superior copiando elementos.
Cronogramas de ruído para modelo pré -terenciado
- O cronograma de 6-presas foi obtido usando a pesquisa de grade. Depois, com base no esquema obtido, à mão, encontrei uma aproximação um pouco melhor.
- O cronograma de 7-presas foi obtido da mesma maneira.
- O cronograma de 12-presas foi obtido da mesma maneira.
- O cronograma de 25-presas foi obtido usando
benchmark.fibonacci(...) . - O cronograma de 50 presas foi obtido repetindo elementos do esquema de 25-presas.
- O cronograma de 100 alffetos foi obtido da mesma maneira.
- O cronograma de 1000-presas foi obtido da mesma maneira.
Inferência
CLI
Coloque seus espectrogramas MEL em alguma pasta. Fazer uma lista de fileiras. Em seguida, execute este comando com seus próprios argumentos:
sh runs/inference.sh -c < your-config > -ch < your-checkpoint > -ns < your-noise-schedule > -m < your-mel-filelist > -v " yes "
Notebook Jupyter
Mais detalhes da inferência são fornecidos no notebooks/inference.ipynb . Lá você também pode encontrar como definir um cronograma de ruído para o modelo e fazer a pesquisa da grade pelo melhor esquema.
Outro
Áudios gerados
Exemplos de áudios gerados são fornecidos na pasta generated_samples . A degradação da qualidade entre as inferências de 1000-ele-elevações e 6-presas não é perceptível se for encontrada o melhor cronograma para este último.
Ponto de verificação pré -ridato
Você pode encontrar um arquivo de ponto de verificação pré -treinado* no LJSpeech (22KHz) através deste link do Google Drive.
* Nota : o ponto de verificação carregado é um dict com uma única chave 'model' .
Detalhes importantes, questões e comentários
- Durante o treinamento, o WaveGrad usa um cronograma de ruído padrão com 1000 iterações e betas de escala linear do intervalo (1E-6, 0,01). Para inferência, você pode definir outro cronograma com menos iterações. Ajuste os betas com cuidado, a qualidade da saída realmente depende muito disso.
- Por padrão, o modelo é executado de maneira mista de precisão. O tamanho do lote é modificado em comparação com o papel (256 -> 96) desde que os autores treinaram seu modelo na TPU.
- Após ~ 10k de treinamento de iterações (1-2 horas) em uma única GPU, o modelo executa uma boa geração para inferência de 50-defeitos. O tempo total de treinamento é de cerca de 1-2 dias (para convergência absoluta).
- Em algum momento, o treinamento pode começar a se comportar estranho e louco (perdas explodidas), por isso introduzi a agendamento da taxa de aprendizado (LR) e o recorte de gradiente. Se a perda explodir para seus dados, tente diminuir um pouco o Schedule Gamma do LR. Deve ajudar.
- Por padrão, o comprimento do salto do seu STFT é igual a 300 (portanto, o fator de amostragem total total). Outros casos não são testados, mas você pode tentar. Lembre -se de que o fator total de amostragem de amostragem ainda deve ser igual ao seu novo comprimento de lúpulo.
História das atualizações
- ( Novo : 24/10/2020) Atualização enorme. Treinamento distribuído e suporte de precisão mista. Codificação posicional mais correta. Suporte da CLI para inferência. Pesquisa de grade paralela. O tamanho do modelo diminuiu significativamente.
- Novas informações RTF para NVIDIA Tesla K80 GPU Card (popular no serviço do Google Colab) e CPU Intel Xeon 2.3GHz.
- Atualização enorme. Novo exemplo de amostra bem gerada bem gerada por 6-ele-elevações. Novo API de configuração de cronograma de ruído. Adicionado o melhor código de pesquisa de grade de programação.
- Treinamento aprimorado, introduzindo um agendador de taxas de aprendizado mais inteligente. Obteve a síntese de alta fidelidade.
- Treinamento estável e inferência de múltiplas defeitos. O agendamento de ruído de 6-presas é suportado.
- Treinamento estável e inferência de alerração fixa com um ruído estático significativo de fundo restante. Todos os problemas de codificação posicional são resolvidos.
- Treinamento estável de modelos de aladeração de 25, 50 e 1000 e 1000. Não encontrou escala linear (c = 5000 do papel) da codificação posicional (bug).
- Treinamento estável de modelos de aladeração de 25, 50 e 1000 e 1000. Codificação posicional fixa. A amostragem de segmento paralela é substituída por amostragem completa.
- ( Liberação, primeiro no github ). Amostragem de segmento paralelo e codificação posicional quebrada. Qualidade ruim com cliques da concatenação da geração de segmento paralelo.
Referências
- Nanxina Chen et al., WaveGrad: estimando gradientes para geração de formas de onda
- Jonathan Ho et al., Modelos probabilísticos de difusão denoising
- REPOSITÓRIO DE MODELOS DE MODELOS DE DENOISING DIFLUSION (Implementação de Tensorflow), dos quais os cálculos de difusão foram adotados