大規模な事前に訓練された言語モデルは、より自然な韻律パターンを生成できるようにすることにより、テキストツーチー(TTS)モデルの自然性を改善するのに役立つことが示されています。ただし、これらのモデルは通常、単語レベルまたはsup-phonemeレベルであり、音素で共同で訓練されているため、音素のみが必要な下流のTTSタスクに対しては非効率的です。この作業では、通常のマスクされた音素予測とともに、対応するグラフェームを予測する口実のタスクを備えた音素レベルのBert(PL-Bert)を提案します。主観的評価は、私たちの音素レベルのBERTエンコーダーが、最先端の(SOTA)Stylettsベースラインと比較して、合成された音声の定格自然性の平均意見スコア(MO)の平均意見スコア(MO)を大幅に改善したことを示しています。
論文:https://arxiv.org/abs/2301.08810
オーディオサンプル:https://pl-bert.github.io/
git clone https://github.com/yl4579/PL-BERT.git
cd PL-BERTconda create --name BERT python=3.8
conda activate BERT
python -m ipykernel install --user --name BERT --display-name " BERT "pip install pandas singleton-decorator datasets " transformers<4.33.3 " accelerate nltk phonemizer sacremoses pebble詳細については、ノートブックPreprocess.ipynbを参照してください。前処理は、英語のウィキペディアデータセットのみです。他の言語でのトレーニングを区別する時間がある場合は、日本語用の新しいブランチを作成します。また、日本のような他の言語での前処理については、#6を参照することもできます。
Notebook Train.ipynbで各セルを実行してください。別のconfigファイルを使用する場合は、セル2の行config_path = "Configs/config.yml"変更する必要があります。トレーニングコードはJupyter Notebookにあります。主に初期の概要がJupyter Notebookで行われたためですが、必要に応じて簡単にPythonスクリプトにすることができます。
Stylets Finetuningに使用する方法の例を以下に示します。テキストエンコーダーを事前に訓練したPLバートに置き換えることにより、他のTTSモデルに使用できます。
from transformers import AlbertConfig , AlbertModel
log_dir = "YOUR PL-BERT CHECKPOINT PATH"
config_path = os . path . join ( log_dir , "config.yml" )
plbert_config = yaml . safe_load ( open ( config_path ))
albert_base_configuration = AlbertConfig ( ** plbert_config [ 'model_params' ])
bert = AlbertModel ( albert_base_configuration )
files = os . listdir ( log_dir )
ckpts = []
for f in os . listdir ( log_dir ):
if f . startswith ( "step_" ): ckpts . append ( f )
iters = [ int ( f . split ( '_' )[ - 1 ]. split ( '.' )[ 0 ]) for f in ckpts if os . path . isfile ( os . path . join ( log_dir , f ))]
iters = sorted ( iters )[ - 1 ]
checkpoint = torch . load ( log_dir + "/step_" + str ( iters ) + ".t7" , map_location = 'cpu' )
state_dict = checkpoint [ 'net' ]
from collections import OrderedDict
new_state_dict = OrderedDict ()
for k , v in state_dict . items ():
name = k [ 7 :] # remove `module.`
if name . startswith ( 'encoder.' ):
name = name [ 8 :] # remove `encoder.`
new_state_dict [ name ] = v
bert . load_state_dict ( new_state_dict )
nets = Munch ( bert = bert ,
# linear projection to match the hidden size (BERT 768, StyleTTS 512)
bert_encoder = nn . Linear ( plbert_config [ 'model_params' ][ 'hidden_size' ], args . hidden_dim ),
predictor = predictor ,
decoder = decoder ,
pitch_extractor = pitch_extractor ,
text_encoder = text_encoder ,
style_encoder = style_encoder ,
text_aligner = text_aligner ,
discriminator = discriminator ) # for stability
for g in optimizer . optimizers [ 'bert' ]. param_groups :
g [ 'betas' ] = ( 0.9 , 0.99 )
g [ 'lr' ] = 1e-5
g [ 'initial_lr' ] = 1e-5
g [ 'min_lr' ] = 0
g [ 'weight_decay' ] = 0.01 bert_dur = model . bert ( texts , attention_mask = ( ~ text_mask ). int ()). last_hidden_state
d_en = model . bert_encoder ( bert_dur ). transpose ( - 1 , - 2 )
d , _ = model . predictor ( d_en , s ,
input_lengths ,
s2s_attn_mono ,
m )257行目:
_ , p = model . predictor ( d_en , s ,
input_lengths ,
s2s_attn_mono ,
m )および415行:
bert_dur = model . bert ( texts , attention_mask = ( ~ text_mask ). int ()). last_hidden_state
d_en = model . bert_encoder ( bert_dur ). transpose ( - 1 , - 2 )
d , p = model . predictor ( d_en , s ,
input_lengths ,
s2s_attn_mono ,
m ) optimizer . step ( 'bert_encoder' )
optimizer . step ( 'bert' )ウィキペディアの事前に訓練されたPL-BERTは、1Mのステップで:PL-Bert Linkからダウンロードできます。
LJSpeechデータセットのデモと、事前に変更されたStyletts Repoおよび事前に訓練されたモデルは、ここからダウンロードできます:Styletts Link。このZIPファイルには、上記のコード変更、上記の事前に訓練されたPL-BERTモデル、PL-BERTの事前に訓練されたスタイレット、PL-BERTの事前訓練を受けたStyletts、およびStyletts RepoのLJSpeechでの事前訓練を受けたHifiganが含まれています。