Il a été démontré que les modèles de langage pré-formé à grande échelle se sont avérés utiles pour améliorer le naturel des modèles de texte vocale (TTS) en leur permettant de produire des modèles prosodiques plus naturalistes. Cependant, ces modèles sont généralement au niveau des mots ou au niveau du sup-phonème et formés conjointement avec des phonèmes, ce qui les rend inefficaces pour la tâche TTS en aval où seuls des phonèmes sont nécessaires. Dans ce travail, nous proposons un Bert au niveau du phonème (PL-BERT) avec une tâche prétexte de prédire les graphimes correspondants ainsi que les prédictions phonèques masquées ordinaires. Les évaluations subjectives montrent que notre codeur Bert au niveau du phonème a considérablement amélioré les scores d'opinion moyens (MOS) du naturel nominal de la parole synthétisée par rapport aux textes de base de Styletts de pointe (SOTA) sur les textes hors distribution (OOD).
Papier: https://arxiv.org/abs/2301.08810
Échantillons audio: 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 pebbleVeuillez vous référer au cahier Preprocess.ipynb pour plus de détails. Le prétraitement concerne uniquement l'ensemble de données Wikipedia anglais. Je ferai une nouvelle branche pour le japonais si j'ai du temps supplémentaire pour démostrater la formation sur d'autres langues. Vous pouvez également vous référer au # 6 pour le prétraitement dans d'autres langues comme le japonais.
Veuillez exécuter chaque cellule dans le portable Train.ipynb. Vous devrez modifier la ligne config_path = "Configs/config.yml" dans la cellule 2 si vous souhaitez utiliser un fichier de configuration différent. Le code de formation est dans Jupyter Notebook principalement parce que l'EPXeriment initial a été réalisé dans Jupyter Notebook, mais vous pouvez facilement en faire un script Python si vous le souhaitez.
Voici un exemple de la façon de l'utiliser pour les styletts finetuning. Vous pouvez l'utiliser pour d'autres modèles TTS en remplaçant l'encodeur de texte par le PL-BERT pré-formé.
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 )Ligne 257:
_ , p = model . predictor ( d_en , s ,
input_lengths ,
s2s_attn_mono ,
m )et ligne 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' )Le PL-BERT pré-formé sur Wikipedia pour 1M étapes peut être téléchargé sur: PL-BERT Link.
L'ensemble de données Demo sur LJSpeech ainsi que les modèles Styletts pré-modifiés et les modèles pré-formés peuvent être téléchargés ici: Styletts Link. Ce fichier zip contient la modification du code ci-dessus, le modèle PL-BERT pré-formé répertorié ci-dessus, Styletts pré-formé avec PL-BERT, Styletts pré-formés avec PL-BERT et Hifigan pré-formé sur LJSpeech du Repo Styletts.