Было показано, что крупномасштабные предварительно обученные языковые модели полезны для повышения естественности моделей текста в речь (TTS), позволяя им производить более натуралистические просодические паттерны. Тем не менее, эти модели обычно являются уровнем уровня слов или на уровне SUP-Phoneme и совместно обучаемыми с фонемами, что делает их неэффективными для нижестоящей задачи TTS, где необходимы только фонемы. В этой работе мы предлагаем берт (PL-Bert) на уровне фонем с предлогом задачи прогнозирования соответствующих графем вместе с регулярными предсказаниями фонем в масках. Субъективные оценки показывают, что наш берт-энкодер на уровне фонем значительно улучшил средние баллы мнения (МО) оценок естественности синтезированной речи по сравнению с самыми современными (SOTA) стилетами, базовыми в текстах на выездном (OOD).
Бумага: 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 для предварительной обработки на других языках, таких как японский.
Пожалуйста, запустите каждую ячейку в ноутбуке. Вам нужно будет изменить строку config_path = "Configs/config.yml" в ячейке 2, если вы хотите использовать другой файл config. Учебный код находится в ноутбуке Jupyter, в первую очередь потому, что первоначальный Epxeriment проводился в ноутбуке Jupyter, но вы можете легко сделать его сценарием Python, если хотите.
Вот пример того, как использовать его для создания Styletts. Вы можете использовать его для других моделей TTS, заменив текстовый кодер на предварительно обученный PL-Bert.
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. Этот zip-файл содержит приведенную выше модификацию кода, предварительно обученную модель PL-BERT, перечисленная выше, предварительно обученные стилеты с PL-BERT, предварительно обученные стилеты без PL-BERT и предварительно обученный Hifigan на LJSPEECH из репо Стилета.