これは、ICASSP 2024 Paper VoiceFlowの公式実装です。

このレポは、LinuxのPython 3.9でテストされています。 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 Torchdynのインストールの問題を回避するために、ここでTorchdyn 1.0.6バージョンをtorchdyn/でローカルに直接コピーします。
次のプロセスでは、環境でbashおよびperlコマンドが必要になる場合があります。
このレポは、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}に解凍できます。独自のデータセットでトレーニングしたい場合は、これらのファイルを自分で作成する必要がある場合があります(または、データの読み込み戦略を変更します)。
これらのマニフェストファイルを使用した後、トレーニングのためにメルスペクトルグラムを抽出するために以下を実行してください。
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のデータをデフォルトで使用することに注意してください。これによりfeats/fbankとfeats/normed_fbankが作成されます。ここでは、KaldiスタイルのSCPおよびARKファイルがメルスペクトルデータを保存します。規範化された機能は、トレーニングに使用されます。
トレーニングには、スピーカーID(ljspeechなど、xvectorsなどの前提条件の埋め込みを使用する代わりに)を使用する場合は、実行してください。
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に設定して、MASアルゴリズムをオンにすることができます。この設定では、 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.これによりsynthetic_wav/${model_name}/generate_for_reflow/train for Storageが作成されます。 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構成ファイルがあります。再開するために、訓練されたモデルを新しいログ監督に自由にコピーしてください。また、モデル構造を変更し、リフローデータでゼロからトレーニングすることができます。
「リフローのデータを生成する」と同様に、モデルの推論は
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は、フローを正常化するという解き角を介して音声変換を実行できるため、フローマッチングも実行できることは合理的です。メソッドmodel.tts.GradTTS.voice_conversion 、予備的な試みを提供します。
尤度の推定。微分方程式ベースの生成モデルは、瞬間的な変化の式によってデータの尤度を推定する機能を備えています
実際には、積分は合計に置き換えられ、発散はスキルのハッチンソントレース推定器に置き換えられます。 Song、et。の付録D.2を参照してください。理論的な詳細については。これを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}
}