이것은 ICASSP 2024 Paper VoiceFlow의 공식 구현입니다.

이 repo는 Linux의 Python 3.9 에서 테스트됩니다. 콘다로 환경을 설정할 수 있습니다
# 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 Torchdyn 설치의 어려움을 피하기 위해 torchdyn/ 에서 Torchdyn 1.0.6 버전을 직접 복사합니다.
다음 프로세스는 환경에서 bash 및 perl 명령이 필요할 수도 있습니다.
이 repo는 Kaldi 스타일 데이터 조직에 의존합니다. 모든 데이터 설명 파일은 data/ 의 하위 디렉토리에 넣어야합니다. 기본 예제는 data/ljspeech/example 참조하십시오. 이 예에서는 다음과 같은 일반 텍스트 파일이 필요합니다.
wav.scp : utt /path/to/wav 로 구성되었습니다.utts.list : 모든 라인은 발화를 지정합니다. 이것은 cut -d ' ' -f 1 wav.scp > utts.list 로 얻을 수 있습니다.utt2spk : utt spk_name 으로 구성되었습니다.text 및 phn_duration : 음소 시퀀스와 해당 정수 지속 시간 (프레임)을 지정합니다. 또한 사전의 인덱스와 함께 모든 전화를 지정할 수있는 data/ljspeech/phones.txt 파일이 있습니다. ljspeech의 경우, 처리 된 파일을 온라인으로 제공합니다. data/ljspeech/{train,val} 에 대한 내진을 다운로드하여 압축 할 수 있습니다. 자신의 데이터 세트를 훈련하려면 이러한 파일을 직접 만들거나 데이터로드 전략을 변경해야 할 수도 있습니다.
이러한 Manifest 파일을 사용한 후에는 다음을 수행하여 훈련을 위해 Mel-Spectrogram을 추출하십시오.
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". 여기에서 16kHz 데이터를 사용하는 것이 기본값입니다. 이로 인해 Kaldi 스타일의 SCP 및 ARK 파일이 Mel-Spectrogram 데이터를 저장하는 feats/fbank 및 feats/normed_fbank 가 생성됩니다. 규범적인 기능은 훈련에 사용됩니다.
훈련을 위해 xvectors와 같은 사전에 사전 스피커 임베딩을 사용하는 대신 ljspeech와 같은 스피커 ID를 사용하려면 다음을 실행하십시오.
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. 훈련을위한 구성은 configs/ 에서 Yaml 파일로 저장됩니다. 교육 및 검증 세트를위한 데이터가 나타나고 기능은 해당 YAML 파일에 지정됩니다. 자신의 데이터를 훈련시켜야하는 경우 이중 인용 파일 경로를 변경해야합니다.
그런 다음 훈련을 수행합니다
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 로깅 및 체크 포인팅을 위해 logs/${model_name} 생성합니다.
몇 가지 메모 :
use_gt_dur false 로 설정할 수 있습니다. 이 설정에서는 add_blank true 로 설정하는 것이 좋습니다. 모델을 어느 정도 훈련 한 후에는 흐름 정류 프로세스를 준비 할 수 있습니다. 흐름 정류는 훈련 된 모델을 사용하여 데이터를 생성하고 (노이즈, 데이터) 쌍을 사용하여 모델을 다시 훈련해야합니다. 이 프로세스에는 항상 전체 교육 데이터 세트가 포함되어야하므로 병렬 디코딩을 위해 여러 GPU에서 실행하는 것이 좋습니다. 우리는 이것을하기 위해 스크립트를 제공합니다.
# 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. 이렇게하면 STACKENT를위한 synthetic_wav/${model_name}/generate_for_reflow/train 생성됩니다. noise.scp feats.scp 와 함께 저장됩니다. 훈련 세트를 디코딩 한 후 --dataset val 에서 설정 한 유효성 검사를 해독 할 수도 있습니다.
그런 다음 lj_16k_gt_dur_reflow.yaml 에서와 같이 새로운 구성 YAML에서 이러한 feats.scp 및 noise.scp 의 경로를 지정하십시오.
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 "
...이제 훈련에서 동일한 스크립트를 사용하지만 새로운 YAML 구성 파일을 사용하여 Reflow에서 다시 교육 할 준비가되었습니다. 훈련 된 모델을 새로운 로그 디포에 복사하여 재개하십시오. 또한 모델 구조를 변경하고 리플 로우 데이터에서 처음부터 훈련 할 수 있습니다.
"Reflow 용 데이터 생성"과 유사하게 모델 추론을 수행 할 수 있습니다.
python inference_dataset.py -c configs/ ${your_yaml} -m ${model_name} --EMA
--solver euler -t 10 이렇게하면 구성에서 설정된 유효성 검사에 대한 Mel-Spectrograms를 종합하여 synthetic_wav/${model_name}/tts_gt_spk/feats.scp 에 저장합니다. 스피커, 속도 및 온도를 지정할 수 있습니다. 완전한 옵션 세트에 대해서는 tools.get_hparams_decode() 함수를 참조하십시오.
그런 다음 hifigan/ Directory에서 추론을 수행 할 수 있습니다. 거기에서 ReadMe를 참조하십시오.
개발 중에 다음 저장소를 참조했습니다.
utils/ 의 대부분의 유틸리티 스크립트에 대한 Kaldi 및 Unicats-CTX-VEC2WAV. 이 저장소에는 일부 실험 기능도 포함되어 있습니다.
음성 변환 . Glowtts는 정규화 흐름의 분리 속성을 통해 음성 변환을 수행 할 수 있으므로 흐름 일치도 수행 할 수있는 것이 합리적입니다. Method model.tts.GradTTS.voice_conversion 예비 시도를 제공합니다.
가능성 추정 . 미분 방정식 기반 생성 모델은 순간 변수 변화 공식에 의해 데이터 가능성을 추정하는 능력이 있습니다.
실제로, 적분은 합산으로 대체되며, 발산은 스킬 슈친슨 트레이스 추정기로 대체됩니다. Song, et.의 부록 D.2를 참조하십시오. 이론적 세부 사항에 대한 AL. 나는 이것을 model.tts.GradTTS.compute_likelihood 에서 구현했다.
model.cfm.OTCFM 에서 시도했지만 지금은 잘 작동하지 않습니다.model.fm_net_type 구성에 의해 GradLogPEstimator2d 외에 추정기를 지정할 수 있습니다. 현재 Diffsinger의 추정기 아키텍처도 지원됩니다. Matcha-TTS에 도입 된 더 많은 것을 추가 할 수 있습니다.model.tts.GradTTS.forward 이제 정렬 맵의 베타 이항을 지원합니다. 원한다면 변수 MAS_target 다른 것으로 변경하여 유량 변환 노이즈를 변경할 수 있습니다!도움이되면이 작업을 자유롭게 인용하십시오.
@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}
}