Es hat sich gezeigt, dass großflächige vorgebrachte Sprachmodelle hilfreich sind, um die Natürlichkeit von Text-zu-Sprach-Modellen (TTS) zu verbessern, indem sie es ihnen ermöglichen, naturalistischere prosodische Muster zu erzeugen. Diese Modelle sind jedoch normalerweise Wortniveau oder Sup-Phonem-Ebene und sind gemeinsam mit Phonemen trainiert, was sie für die nachgelagerte TTS-Aufgabe ineffizient macht, bei der nur Phoneme benötigt werden. In dieser Arbeit schlagen wir einen Bert (Pl-Bert) auf Phonemebene mit einer Vorwand auf, die entsprechenden Grapheme zusammen mit den regelmäßigen maskierten Phonemvorhersagen vorherzusagen. Subjektive Bewertungen zeigen, dass unser Bert-Encoder auf Phonemebene die mittleren Meinungsbewertungen (MOS) der Nennleistung der synthetisierten Sprache im Vergleich zu den SOTA-Baseline Moder-the-Art (SOTA) auf OD-of-the-Art-Styletts-Baseline erheblich verbessert hat.
Papier: https://arxiv.org/abs/2301.08810
Audio-Samples: https://pl-tbert.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 pebbleWeitere Informationen finden Sie im Notebook Precess.ipynb. Die Vorverarbeitung gilt nur für den englischen Wikipedia -Datensatz. Ich werde eine neue Filiale für Japanisch machen, wenn ich zusätzliche Zeit habe, um das Training in anderen Sprachen zu demostrieren. Sie können sich auch auf #6 für die Vorverarbeitung in anderen Sprachen wie Japanisch beziehen.
Bitte führen Sie jede Zelle im Notebook -Train.ipynb aus. Sie müssen die config_path = "Configs/config.yml" in Zelle 2 ändern, wenn Sie eine andere Konfigurationsdatei verwenden möchten. Der Trainingscode befindet sich im Jupyter -Notizbuch vor allem, weil die erste Epxeriment im Jupyter -Notebook durchgeführt wurde. Wenn Sie möchten, können Sie es jedoch leicht zu einem Python -Skript machen.
Hier ist ein Beispiel dafür, wie man es für Styletts -Finetuning verwendet. Sie können es für andere TTS-Modelle verwenden, indem Sie den Textcodierer durch den vorgebildeten Pl-Bert ersetzen.
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 )Zeile 257:
_ , p = model . predictor ( d_en , s ,
input_lengths ,
s2s_attn_mono ,
m )und Zeile 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' )Der vorgebildete PL-Bert auf Wikipedia für 1-m-Schritte kann heruntergeladen werden unter: Pl-Bert Link.
Die Demo des LJSpeech-Datensatzes zusammen mit dem vorvermodifizierten Styletts Repo und vorgebildeten Modellen kann hier heruntergeladen werden: Styletts Link. Diese ZIP-Datei enthält die obige Codeänderung, das oben ausgebildete PL-Bert-Modell, vorgebildete Styletts mit Pl-Bert, vorgebildete Styletts mit Pl-Bert und vorgebildetem Hifigan auf Ljspeech aus dem Styletts Repo.