Modelos de linguagem pré-treinados em larga escala demonstraram ser úteis para melhorar a naturalidade dos modelos de texto em fala (TTS), permitindo que eles produzam padrões prosodic mais naturalistas. No entanto, esses modelos geralmente são no nível da palavra ou em nível de suposição e treinados em conjunto com fonemas, tornando-os ineficientes para a tarefa TTS a jusante, onde apenas os fonemas são necessários. Neste trabalho, propomos um Bert de nível fonema (PL-Bert) com uma tarefa de pretexto de prever os grafemas correspondentes, juntamente com as previsões de fonemas mascaradas regulares. Avaliações subjetivas mostram que nosso codificador BERT em nível de fonema melhorou significativamente os escores médios de opinião (MOS) da naturalidade nominal da fala sintetizada em comparação com os estilos de base de ponta (SOTA) em textos fora da distribuição (OOD).
Papel: https://arxiv.org/abs/2301.08810
Amostras de áudio: 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 pebbleConsulte o notebook preprocess.ipynb para obter mais detalhes. O pré -processamento é apenas para o conjunto de dados da Wikipedia em inglês. Farei uma nova filial para japoneses se tiver tempo extra para demonstrar treinamento em outros idiomas. Você também pode se referir ao #6 para pré -processamento em outros idiomas como o japonês.
Por favor, execute cada célula no notebook Train.ipynb. Você precisará alterar a linha config_path = "Configs/config.yml" na célula 2 se desejar usar um arquivo de configuração diferente. O código de treinamento está no Jupyter Notebook principalmente porque o Epxerimento inicial foi realizado no Jupyter Notebook, mas você pode facilmente torná -lo um script Python, se quiser.
Aqui está um exemplo de como usá -lo para Styletts Finetuning. Você pode usá-lo para outros modelos TTS substituindo o codificador de texto pelo PL-Bert pré-treinado.
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 )Linha 257:
_ , p = model . predictor ( d_en , s ,
input_lengths ,
s2s_attn_mono ,
m )e linha 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' )O PL-Bert pré-treinado na Wikipedia para 1 milhão de etapas pode ser baixado em: PL-Bert Link.
A demonstração no conjunto de dados LJSpeech, juntamente com o repo Styletts pré-modificado e os modelos pré-treinados podem ser baixados aqui: Link Styletts. Este arquivo ZIP contém a modificação do código acima, o modelo PL-Bert pré-treinado listado acima, estilos pré-treinados com estilos pré-treinados com pL-Bert, estilos pré-treinados sem o Hifigan de LJSpeech do LJSPEECH do repo Styletts.