Se ha demostrado que los modelos de lenguaje previamente capacitado a gran escala son útiles para mejorar la naturalidad de los modelos de texto a voz (TTS) al permitirles producir patrones prosódicos más naturalistas. Sin embargo, estos modelos suelen ser a nivel de palabras o a nivel de fonema y entrenados conjuntamente con fonemas, lo que los hace ineficientes para la tarea TTS aguas abajo donde solo se necesitan fonemas. En este trabajo, proponemos un Bert a nivel de fonema (PL-Bert) con una tarea de pretexto de predecir los grafemas correspondientes junto con las predicciones de fonemas enmascarados regulares. Las evaluaciones subjetivas muestran que nuestro codificador Bert a nivel de fonema ha mejorado significativamente los puntajes de opinión medios (MOS) de la naturalidad nominal del habla sintetizada en comparación con la línea de base de Styletts de última generación (SOTA) en textos de base fuera de distribución (OOD).
Documento: https://arxiv.org/abs/2301.08810
Muestras de 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 pebbleConsulte el preprocess.ipynb del cuaderno para obtener más detalles. El preprocesamiento es solo para el conjunto de datos de Wikipedia en inglés. Haré una nueva rama para japonés si tengo tiempo extra para demostrar la capacitación en otros idiomas. También puede referirse al #6 para su preprocesamiento en otros idiomas como el japonés.
Por favor, ejecute cada celda en el tren de cuaderno.ipynb. Deberá cambiar la línea config_path = "Configs/config.yml" en la celda 2 si desea usar un archivo de configuración diferente. El código de entrenamiento se encuentra en el cuaderno Jupyter principalmente porque el Epxeriment inicial se realizó en el cuaderno Jupyter, pero puede convertirlo fácilmente en un script de Python si lo desea.
Aquí hay un ejemplo de cómo usarlo para la fina de Styletts. Puede usarlo para otros modelos TTS reemplazando el codificador de texto con el PL-Bert pre-entrenado.
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 )línea 257:
_ , p = model . predictor ( d_en , s ,
input_lengths ,
s2s_attn_mono ,
m )y línea 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' )El PL-Bert pre-entrenado en Wikipedia para pasos de 1M se puede descargar en: PL-Bert Link.
La demostración en el conjunto de datos LJSPEECH junto con el repositorio de Styletts pre-modificado y los modelos previamente capacitados se pueden descargar aquí: enlace Styletts. Este archivo ZIP contiene la modificación del código anterior, el modelo PL-Bert pre-entrenado enumerado anteriormente, Styletts previamente capacitados con PL-Bert, Styletts previamente capacitados sin PL-Bert y Hifigan previamente capacitado en LJSPEECch del repositorio de Styletts.