Esta é a implementação oficial do nosso ICASSP 2024 Paper VoiceFlow.

Este repo é testado no Python 3.9 no Linux. Você pode configurar o ambiente com conda
# Install required packages
conda create -n vflow python==3.9 # or any name you like
conda activate vflow
pip install -r requirements.txt
# Then, set PATH
source path.sh # change the env name in it if you don't use "vflow"
# Install monotonic_align for MAS
cd model/monotonic_align
python setup.py build_ext --inplace Observe que, para evitar o problema de instalar a Torchdyn, copiamos diretamente a versão Torchdyn 1.0.6 aqui localmente em torchdyn/ .
O processo a seguir também pode precisar de comandos bash e perl em seu ambiente.
Este repositório depende da organização de dados no estilo Kaldi. Todos os arquivos de descrição de dados devem ser colocados em subdiretos em data/ . Consulte data/ljspeech/example para um exemplo básico. Neste exemplo, os seguintes arquivos de texto sem formatação são necessários:
wav.scp : Organizado como utt /path/to/wav .utts.list : Cada linha especifica uma expressão. Isso pode ser obtido por cut -d ' ' -f 1 wav.scp > utts.list .utt2spk : organizado como utt spk_name .text e phn_duration : especifica a sequência do fonema e as durações inteiras correspondentes (em quadros). Além disso, existe um arquivo de data/ljspeech/phones.txt para especificar todos os telefones juntamente com seus índices no dicionário. Para o LJSpeech, fornecemos o arquivo processado online. Você pode baixá -lo e descompactar para data/ljspeech/{train,val} . Se você deseja treinar em seu próprio conjunto de dados, talvez seja necessário criar esses arquivos (ou alterar a estratégia de carregamento de dados).
Depois de ter esses arquivos de manifesto, faça o seguinte para extrair o espectrograma MEL para treinamento:
bash extract_fbank.sh --stage 0 --stop_stage 2 --nj 16
# nj: number of parallel jobs.
# Have a look into the script if you need to change something
# Bash variables before "parse_options.sh" can be passed by CLI, e.g. "--key value". Observe que padrão usamos dados de 16kHz aqui. Isso criará feats/fbank e feats/normed_fbank , onde os arquivos SCP e ARK do estilo Kaldi armazenam os dados do espectrograma MEL. Os recursos normados serão usados para treinamento.
Se você deseja usar os IDs de alto-falante (como o LJSpeech, em vez de usar incorporações de alto-falante pré-traçado, como Xvectores) para treinamento, execute:
make_utt2spk_id.py data/ljspeech/train/utt2spk data/ljspeech/val/utt2spk
# You can add more files in CLI. Will write utt2num_frames in the same directory to these files. As configurações para o treinamento são armazenadas como arquivo YAML nas configs/ . Os manifestos de dados e os recursos do conjunto de treinamento e validação serão especificados nesses arquivos YAML. Você precisará alterar os caminhos de arquivo de citação dupla, se precisar treinar seus próprios dados.
Então, o treinamento é realizado por
python train.py -c configs/ ${your_yaml} -m ${model_name}
# e.g. python train.py -c configs/lj_16k_gt_dur.yaml -m lj_16k_gt_dur Ele criará logs/${model_name} para registro e check -se.
Várias notas:
use_gt_dur como false para ativar o algoritmo MAS. Nesta configuração, é melhor definir add_blank como true . Depois de treinar o modelo até certo ponto, ele pode estar pronto para o processo de retificação de fluxo. A retificação do fluxo requer gerar dados usando o modelo treinado e usar o par (ruído, dados) para treinar o modelo novamente. Como esse processo deve sempre envolver todo o conjunto de dados de treinamento, é recomendável ser executado em várias GPUs para decodificação paralela. Nós fornecemos um script para fazer isso:
# Set CUDA_VISIBLE_DEVICES, or the program will use all available GPUs.
python generate_for_reflow.py -c configs/ ${your_yaml} -m ${model_name}
--EMA --max-utt-num 100000000
--dataset train
--solver euler -t 10
--gt-dur
# --EMA specifies to load EMA checkpoint (latest)
# --max-utt-num sets the number of utterances to decode (in this case, arbitrarily high)
# --solver euler -t 10 specifies the solver and timesteps. Could be adaptive solvers like dopri5.
# --gt-dur forces the model to use ground truth duration for decoding. Isso criará synthetic_wav/${model_name}/generate_for_reflow/train para armazenamento. noise.scp juntamente com feats.scp serão armazenados. Depois de decodificar o conjunto de treinamento, você também pode decodificar a validação definida por --dataset val .
Em seguida, especifique os caminhos para esses feats.scp e noise.scp em uma nova configuração YAML, como no lj_16k_gt_dur_reflow.yaml :
perform_reflow : true
...
data :
train :
feats_scp : " synthetic_wav/lj_16k_gt_dur/train/feats.scp "
noise_scp : " synthetic_wav/lj_16k_gt_dur/train/noise.scp "
...Agora ele está pronto para treinar novamente em reflow, com o mesmo script no treinamento, mas novos arquivos de configuração da YAML. Sinta -se à vontade para copiar um modelo treinado para o novo diretor de log para retomar. Além disso, é possível alterar a estrutura do modelo e treinar do zero nos dados do reflexão.
Semelhante a "gerar dados para reflow", a inferência do modelo pode ser feita por
python inference_dataset.py -c configs/ ${your_yaml} -m ${model_name} --EMA
--solver euler -t 10 Isso sintetizará os espectrogramas MEL para a validação definida na sua configuração, armazenando-os em synthetic_wav/${model_name}/tts_gt_spk/feats.scp . O falante, velocidade e temperatura podem ser especificados; Consulte a função tools.get_hparams_decode() para obter um conjunto completo de opções.
A inferência pode ser feita no hifigan/ Diretório. Por favor, consulte o ReadMe lá.
Durante o desenvolvimento, os seguintes repositórios foram referidos:
utils/ . Este repositório também contém algumas funcionalidades experimentais.
Conversão de voz . Como os Glowtts podem executar a conversão de voz através da propriedade sem desvencoração de normalizar os fluxos, é razoável que a correspondência de fluxo também possa executá -la. Method model.tts.GradTTS.voice_conversion oferece uma tentativa preliminar.
Estimativa de probabilidade . Modelos generativos baseados em equações diferenciais têm a capacidade de estimar as probabilidades de dados pela fórmula instantânea de mudança de variável
Na prática, a integral é substituída por soma e a divergência é substituída pelo estimador de traços de habilidades-hutchinson. Veja o Apêndice D.2 em Song, et. al para detalhes teóricos. Eu implementei isso em model.tts.GradTTS.compute_likelihood .
model.cfm.OTCFM , embora não funcione muito bem por enquanto.GradLogPEstimator2d pela configuração model.fm_net_type . Atualmente, a arquitetura do estimador do DiffSinger também é suportada. Você pode adicionar mais, por exemplo, que introduziu no Matcha-TTS.model.tts.GradTTS.forward agora suporta binomial beta antes dos mapas de alinhamento; E se você quiser, você pode alterar a variável MAS_target para outra coisa, por exemplo, ruído transformado em fluxo!Sinta -se à vontade para citar este trabalho se ajudar?
@INPROCEEDINGS{guo2024voiceflow,
author={Guo, Yiwei and Du, Chenpeng and Ma, Ziyang and Chen, Xie and Yu, Kai},
booktitle={ICASSP 2024 - 2024 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
title={{VoiceFlow}: Efficient Text-To-Speech with Rectified Flow Matching},
year={2024},
volume={},
number={},
pages={11121-11125},
keywords={Signal processing algorithms;Signal processing;Acoustics;Mathematical models;Vectors;Trajectory;Speech processing;Text-to-speech;flow matching;rectified flow;efficiency;speed-quality tradeoff},
doi={10.1109/ICASSP48485.2024.10445948}
}