대규모 사전 훈련 된 언어 모델은 TTS (Text-Toecee) 모델의 자연성을 향상시키는 데 도움이되는 것으로 나타났습니다. 그러나 이러한 모델은 일반적으로 단어 수준 또는 Supphoneme 수준이며 음소와 공동으로 훈련되어 음소 만 필요한 다운 스트림 TTS 작업에 비효율적입니다. 이 작업에서 우리는 일반 마스크가있는 음소 예측과 함께 해당 그래프를 예측하는 구실 작업을 갖춘 음소 수준의 BERT (PL-BERT)를 제안합니다. 주관적 평가에 따르면, 우리의 음소수 수준의 Bert 인코더는 DESTRIBURIVE (OUD) 텍스트의 최첨단 (SOTA) Styletts 기준선과 비교하여 합성 된 음성의 정격 자연성의 평균 의견 점수 (MOS)를 크게 향상 시켰습니다.
종이 : 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자세한 내용은 Notebook Preprocess.ipynb를 참조하십시오. 전처리는 영어 Wikipedia 데이터 세트 전용입니다. 다른 언어에 대한 훈련을 데모 스트레이트 할 시간이 더 있으면 일본어에 대한 새로운 지점을 만들 것입니다. 일본어와 같은 다른 언어로 전처리에 대해서는 #6을 참조 할 수도 있습니다.
노트북 열차에서 각 셀을 실행하십시오. 다른 구성 파일을 사용하려면 셀 2에서 줄 config_path = "Configs/config.yml" 변경해야합니다. 교육 코드는 주로 초기 epxeriment가 Jupyter Notebook에서 수행 되었기 때문에 주로 Jupyter 노트북에 있지만 원하는 경우 쉽게 Python 스크립트로 만들 수 있습니다.
다음은 Styletts Finetuning에 사용하는 방법의 예입니다. 텍스트 인코더를 미리 훈련 된 PL-Bert로 바꾸어 다른 TTS 모델에 사용할 수 있습니다.
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' )1m 단계의 Wikipedia에서 미리 훈련 된 PL-Bert는 PL-Bert Link에서 다운로드 할 수 있습니다.
사전 수정 된 스타일 레트 리포 및 미리 훈련 된 모델과 함께 LJSpeech 데이터 세트의 데모는 여기에서 다운로드 할 수 있습니다 : Styletts Link. 이 ZIP 파일에는 위에 나열된 미리 훈련 된 PL-BERT 모델, pl-bert가있는 사전 훈련 된 스타일, pl-bert가있는 사전 훈련 된 스타일 및 스타일 레트 리포지기에서 ljspeech에서 미리 훈련 된 hifigan의 위의 코드 수정이 포함되어 있습니다.