Dies ist die offizielle Implementierung unseres ICASP 2024 Paper Voiceflow.

Dieses Repo wird auf Python 3.9 unter Linux getestet. Sie können die Umgebung mit Conda einrichten
# 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 Beachten Sie, dass wir die Mühe, Torchdyn zu installieren, die Tarchdyn 1.0.6 -Version hier lokal bei torchdyn/ direkt kopieren.
Der folgende Vorgang erfordert möglicherweise auch bash und perl -Befehle in Ihrer Umgebung.
Dieses Repo stützt sich auf die Datenorganisation im Kaldi-Stil. Alle Datendateien zur Datenbeschreibung sollten in Daten/ in data/ in Daten versetzt werden. Ein grundlegendes Beispiel finden Sie data/ljspeech/example . In diesem Beispiel sind die folgenden einfachen Textdateien erforderlich:
wav.scp : organisiert als utt /path/to/wav .utts.list : Jede Zeile gibt eine Äußerung an. Dies kann durch cut -d ' ' -f 1 wav.scp > utts.list erhalten werden.utt2spk : organisiert als utt spk_name .text und phn_duration : Gibt die Phonemsequenz und die entsprechenden Ganzzahldauern (in Frames) an. Außerdem gibt es eine data/ljspeech/phones.txt um alle Telefone zusammen mit ihren Indizes im Wörterbuch anzugeben. Für ljspeech geben wir die verarbeitete Datei online an. Sie können es herunterladen und auf data/ljspeech/{train,val} entpacken. Wenn Sie in Ihrem eigenen Datensatz trainieren möchten, müssen Sie diese Dateien möglicherweise selbst erstellen (oder die Datenladungsstrategie ändern).
Nachdem Sie diese offensichtlichen Dateien haben, machen Sie bitte Folgendes, um das Melspektogramm für das Training zu extrahieren:
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". Beachten Sie, dass wir hier standardmäßig 16 -kHz -Daten verwenden. Dadurch werden feats/fbank und feats/normed_fbank erstellt, wo die SCP- und ARK-Dateien im Kaldi-Stil die Mel-Spektrogram-Daten speichern. Die normierten Merkmale werden für das Training verwendet.
Wenn Sie Lautsprecher-IDs (wie LJSpeech, anstatt vorbereitete Lautsprecher-Einbettungen wie XVectors) für das Training verwenden möchten, rennen Sie bitte:
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. Konfigurationen für das Training werden als YAML -Datei in configs/ gespeichert. Datenmanifits und Funktionen für das Training und Validierungssatz werden in diesen YAML -Dateien angegeben. Sie müssen dort doppelt zitierte Dateipfade ändern, wenn Sie Ihre eigenen Daten trainieren müssen.
Dann wird das Training von durchgeführt
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 Es wird logs/${model_name} zum Protokollieren und Überprüfen erstellt.
Mehrere Notizen:
use_gt_dur auf false festlegen, um den MAS -Algorithmus einzuschalten. In dieser Einstellung ist es besser, add_blank auf true zu setzen. Nach dem Training des Modells bis zu einem gewissen Grad kann es für den Strömungsberichtungsprozess bereit sein. Durch die Durchflussreparatur müssen Daten unter Verwendung des trainierten Modells generiert und das Paar (Rauschen, Daten) verwendet werden, um das Modell erneut zu trainieren. Da dieser Prozess immer den gesamten Trainingsdatensatz beinhalten sollte, wird empfohlen, auf mehreren GPUs zur parallele Decodierung auszuführen. Wir bieten ein Skript dazu:
# 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. Dadurch wird synthetic_wav/${model_name}/generate_for_reflow/train für die Speicherung erstellt. noise.scp zusammen mit feats.scp wird gespeichert. Nach dem Dekodieren des Trainingssatzes können Sie auch die Validierungsabschlüsse nach --dataset val dekodieren.
Geben Sie dann die Pfade zu diesen feats.scp und noise.scp in einer neuen Konfiguration YAML an, wie in der 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 "
...Jetzt ist es wieder für das Training im Reflow bereit, mit demselben Skript im Training, aber neuen YAML -Konfigurationsdateien. Fühlen Sie sich frei, ein geschultes Modell für die Wiederaufnahme in das neue Log DIR zu kopieren. Außerdem ist es möglich, die Modellstruktur und den Zug von Grund auf die Reflow -Daten zu ändern.
Ähnlich wie "Daten für den Reflow generieren" kann die Modellinferenz durch durchgeführt werden durch
python inference_dataset.py -c configs/ ${your_yaml} -m ${model_name} --EMA
--solver euler -t 10 Dadurch werden Melspektrogramme für die in Ihrer Konfiguration festgelegte Validierungs-Validierung synthetisiert und speichert sie unter synthetic_wav/${model_name}/tts_gt_spk/feats.scp . Lautsprecher, Geschwindigkeit und Temperatur können angegeben werden. In tools.get_hparams_decode() -Funktion finden Sie eine vollständige Optionen.
Inferenz kann dann im hifigan/ Verzeichnis erfolgen. Bitte beachten Sie die Readme dort.
Während der Entwicklung wurden die folgenden Repositorys verwiesen:
utils/ . Dieses Repository enthält auch einige experimentelle Funktionen.
Sprachumwandlung . Da Glowtts über die Disentangling -Eigenschaft von Normalisierungsströmen eine Sprachumwandlung durchführen können, ist es vernünftig, dass die Flussanpassung auch durchführen kann. Method model.tts.GradTTS.voice_conversion gibt einen vorläufigen Versuch.
Wahrscheinlichkeitsschätzung . Differentielle Gleichungsbasis generative Modelle können Datenwahrscheinlichkeiten nach der sofortigen Formel ändern, die Änderung der Variablen zu schätzen
In der Praxis wird Integral durch die Summierung ersetzt und die Divergenz durch den Schätzer der Fertigkeitshutchinson-Spuren ersetzt. Siehe Anhang D.2 in Song, et. Al für theoretische Details. Ich habe dies in model.tts.GradTTS.compute_likelihood implementiert.
model.cfm.OTCFM ausprobiert, obwohl es vorerst nicht sehr gut funktioniert.GradLogPEstimator2d durch die Konfiguration model.fm_net_type angeben. Derzeit wird auch die Schätzerarchitektur des Diffsingers unterstützt. Sie können mehr hinzufügen, z. B. in Matcha-TTS eingeführt.model.tts.GradTTS.forward unterstützt jetzt Beta Binomial Prior für Ausrichtungskarten; Und wenn Sie möchten, können Sie das Variable MAS_target in etwas anderes ändern, z. B. durch fließentransformiertes Rauschen!Fühlen Sie sich frei, diese Arbeit zu zitieren, wenn sie hilft?
@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}
}