指南:基于 LibriTTS 與 E-Branchformer 的 IPA+標點轉(zhuǎn)寫系統(tǒng))
人工智能語音音頻深度學習NLP【免費下載鏈接】espnetEnd-to-End Speech Processing Toolkit項目地址https://gitcode.com/gh_mirrors/es/espnet點擊查看免費下載導讀本文圍繞 ESPnet 倉庫中 egs2/libritts/asr1 這一音素級 ASRAutomatic Speech Recognition實驗配方展開講解如何基于 LibriTTS 語料構(gòu)建一個輸出為 IPA國際音標音素序列并保留標點的識別系統(tǒng)。該系統(tǒng)的核心設(shè)計目標是產(chǎn)出可直接作為基于音素的 TTSPhone-based TTS輸入端的轉(zhuǎn)寫結(jié)果從而將文本grapheme到音素phoneme的轉(zhuǎn)換負擔從 TTS 前端遷移到 ASR 后端。讀完本文你將掌握音素化數(shù)據(jù)準備流程、espeak_ng_english_us_vits這一 g2pgrapheme-to-phoneme方案的底層實現(xiàn)原理、E-Branchformer 訓練配置的完整參數(shù)含義以及該系統(tǒng)的 WER/CER/TER 量化表現(xiàn)。一、系統(tǒng)目標為什么需要音素標點的 ASR 輸出該配方在 egs2/libritts/asr1/README.md 中開宗明義本系統(tǒng)的目的是產(chǎn)生適合作為基于音素 TTS 直接輸入的輸出。這與常規(guī)的字素級graphemeASR 有本質(zhì)區(qū)別常規(guī) ASR 輸出自然語言文本單詞、字詞供人閱讀或作為語音識別評測基準本配方輸出音素序列IPA 符號與標點語義上等價于語音 → 音素轉(zhuǎn)寫可直接喂給音素級 TTS 前端避免 TTS 端再做一輪 g2p 轉(zhuǎn)換。從數(shù)據(jù)流角度看這正是把 TTS 流水線中的 g2p 環(huán)節(jié)前置到 ASR 中聯(lián)合解決ASR 學習聲學特征 → 音素串含標點的映射而音素串本身就是 TTS 可直接消費的中間表示。因此該模型可視為語音轉(zhuǎn)寫speech-to-phoneme transcription專用系統(tǒng)其評測指標WER/CER/TER也全部基于音素序列計算。二、實驗環(huán)境與依賴原文檔記錄了該配方的實測環(huán)境詳見 egs2/libritts/asr1/README.md項目版本Python3.10.8GCC 11.3.1ESPnetespnet 202308PyTorch2.0.1cu118訓練硬件A600048 GB× 2 GPU需要特別說明由于本配方依賴 eSpeak NG 進行音素化必須安裝相應的 g2p 依賴。從源碼看espeak_ng_english_us_vits走的是phonemizer庫的espeak后端見下文源碼解析小節(jié)因此復現(xiàn)前需要確保環(huán)境中安裝了phonemizer及其 espeak-ng 后端。三、數(shù)據(jù)處理從 LibriTTS 到音素化訓練集3.1 數(shù)據(jù)下載與目錄組織數(shù)據(jù)準備腳本為 local/data.sh它通過 db.sh 讀取LIBRITTS環(huán)境變量指定的數(shù)據(jù)根目錄并從www.openslr.org/resources/60下載 LibriTTS 的七個子集dev-clean、dev-other、test-clean、test-othertrain-clean-100、train-clean-360、train-other-500下載完成后在$db_root/LibriTTS/.complete打上標記以避免重復下載。隨后stage 0對每個子集調(diào)用 local/data_prep.sh 生成 Kaldi 風格數(shù)據(jù)目錄wav.scp、text、utt2spk、spk2gender、spk2utt再用utils/fix_data_dir.sh修復最后調(diào)用local/phonemize_dir.py做音素化stage 1用utils/combine_data.sh合并數(shù)據(jù)——dev由dev-cleandev-other合并train-960由三個訓練子集合并合計約 960 小時。local/data_prep.sh 沿用了 LibriTTS 的標準做法以reader_chapter作為說話人粒度utt2spk按章節(jié)劃分便于按章節(jié)計算 CMVN轉(zhuǎn)寫文本取自每個 wav 對應的.normalized.txt文件。3.2 音素化核心腳本phonemize_dir.py音素化由 local/phonemize_dir.py 完成其邏輯非常簡潔清晰from espnet2.text.phoneme_tokenizer import PhonemeTokenizer tokenizer PhonemeTokenizer(espeak_ng_english_us_vits) with ( open(f{idir}/text, encodingutf-8) as itext, open(f{idir}/text.phn, w, encodingutf-8) as otext, ): for line in itext: utt, text line.strip(\n).split( , maxsplit1) tokens tokenizer.text2tokens(text) text_phn .join(tokens).replace(space, ) otext.write(f{utt} {text_phn}\n) os.replace(f{idir}/text, f{idir}/text.orig) os.replace(f{idir}/text.phn, f{idir}/text)要點拆解使用PhonemeTokenizer(espeak_ng_english_us_vits)將每句英文文本轉(zhuǎn)為音素 token 序列token 序列用.join()拼回字符串再統(tǒng)一把space占位符替換為真實空格從而把詞邊界還原為空格分隔處理完成后原文本備份為text.orig音素文本正式覆蓋text因此訓練集、驗證集、測試集的text文件都是音素序列ASR 模型學到的是聲學特征 → 音素標點的映射。3.3 底層 g2pespeak_ng_english_us_vits 的實現(xiàn)PhonemeTokenizer定義于 espnet2/text/phoneme_tokenizer.pyespeak_ng_english_us_vits分支位于該文件約 L598-L610elif g2p_type espeak_ng_english_us_vits: # VITS official implementation-like processing # Reference: https://github.com/jaywalnut310/vits self.g2p Phonemizer( languageen-us, backendespeak, with_stressTrue, preserve_punctuationTrue, stripTrue, word_separator , phone_separator, split_by_single_tokenTrue, )從源碼結(jié)構(gòu)看該 g2p 方案的關(guān)鍵參數(shù)決定了音素化結(jié)果的質(zhì)量backendespeak調(diào)用phonemizer庫的 eSpeak NG 后端Phonemizer類是對 bootphon/phonemizer 的封裝見 espnet2/text/phoneme_tokenizer.py L384-L437內(nèi)部通過phonemizer.backend.BACKENDS[backend]實例化languageen-us使用美式英語發(fā)音規(guī)則with_stressTrue保留重音符號——IPA 音素中的主/次重音如 ? 與 ?對 TTS 韻律至關(guān)重要preserve_punctuationTrue保留標點——這正是IPA 標點系統(tǒng)中標點來源標點會被當作獨立 token 輸出word_separator 、phone_separator、split_by_single_tokenTrue采用 VITS 官方實現(xiàn)類似的處理方式——詞邊界用空格分隔、音素間不加分隔符、按單 token 拆分拆分時Phonemizer.__call__會把空格替換為space占位符再由phonemize_dir.py統(tǒng)一還原。此外espnet2/text/phoneme_tokenizer.py 的g2p_choices列表L25-L56 附近還提供了g2p_en、pyopenjtalk日語、pypinyin_g2p中文、g2pk韓語、espeak_ng_*多語種等眾多方案本配方選用的espeak_ng_english_us_vits正是為英文音素級 TTS 量身定制的一檔。四、訓練配置詳解4.1 入口腳本 run.sh訓練入口為 run.sh通過./asr.sh以參數(shù)方式注入全部超參數(shù)train_settrain-960 valid_setdev test_setstest-clean test-other dev-clean dev-other asr_configconf/train_asr.yaml inference_configconf/decode_asr.yaml ./asr.sh \ --lang en \ --ngpu 2 \ --nbpe 100 \ --max_wav_duration 30 \ --speed_perturb_factors 0.9 1.0 1.1 \ --audio_format flac.ark \ --feats_type raw \ --use_lm false \ --asr_config ${asr_config} \ --inference_config ${inference_config} \ --train_set ${train_set} \ --valid_set ${valid_set} \ --test_sets ${test_sets} \ --lm_train_text data/${train_set}/text \ --bpe_train_text data/${train_set}/text $參數(shù)語義如下參數(shù)取值作用--lang enen目標語言為英語--ngpu 22雙 GPU 分布式訓練--nbpe 100100BPE 詞表大小 100——由于輸出是音素序列詞表天然很小100 個 BPE 單元足夠覆蓋音素標點組合--max_wav_duration 3030秒過濾超過 30 秒的長音頻--speed_perturb_factors0.9 1.0 1.1三倍速擾動0.9×/1.0×/1.1×做數(shù)據(jù)增強--audio_format flac.arkflac.ark音頻以 FLAC 編碼的 ark 格式存儲--feats_type rawraw不預提取特征直接在訓練中計算前端特征--use_lm falsefalse不使用外部語言模型音素序列無需 LM 建模--asr_configconf/train_asr.yaml訓練配置--inference_configconf/decode_asr.yaml解碼配置--bpe_train_textdata/train-960/text在音素化后的訓練文本上訓練 BPE 模型值得注意的是run.sh末尾的$允許命令行追加參數(shù)覆蓋默認值這與 ESPnet 所有配方的習慣一致如覆蓋--asr_config指向 conf/tuning/train_asr_e_branchformer.yaml。4.2 模型結(jié)構(gòu)E-Branchformer 編碼器 Transformer 解碼器訓練配置 conf/tuning/train_asr_e_branchformer.yaml與 conf/train_asr.yaml 內(nèi)容一致定義了完整的模型與訓練方案編碼器E-Branchformer——約 1.41 億參數(shù)中的主體encoder: e_branchformer encoder_conf: output_size: 512 attention_heads: 8 attention_layer_type: rel_selfattn pos_enc_layer_type: rel_pos rel_pos_type: latest cgmlp_linear_units: 3072 cgmlp_conv_kernel: 31 use_linear_after_conv: false gate_activation: identity num_blocks: 17 dropout_rate: 0.1 positional_dropout_rate: 0.1 attention_dropout_rate: 0.1 input_layer: conv2d layer_drop_rate: 0.1 linear_units: 1024 positionwise_layer_type: linear macaron_ffn: true use_ffn: true merge_conv_kernel: 31關(guān)鍵參數(shù)解讀num_blocks: 17、output_size: 512、attention_heads: 817 層、512 維、8 頭注意力attention_layer_type: rel_selfattnpos_enc_layer_type: rel_posrel_pos_type: latest使用相對位置編碼的 self-attentioncgmlp_linear_units: 3072、cgmlp_conv_kernel: 31、merge_conv_kernel: 31E-Branchformer 特有的卷積門控 MLPConvolution-augmented gMLP分支配置macaron_ffn: true、use_ffn: true啟用 Macaron 結(jié)構(gòu)與 FFN 分支input_layer: conv2d輸入為 Conv2D 下采樣配合下方frontend_conf的 512 點 FFTlayer_drop_rate: 0.1層級丟棄正則化。解碼器Transformerdecoder: transformer decoder_conf: attention_heads: 8 linear_units: 2048 num_blocks: 6 dropout_rate: 0.1 positional_dropout_rate: 0.1 self_attention_dropout_rate: 0.1 src_attention_dropout_rate: 0.1 layer_drop_rate: 0.2訓練損失與優(yōu)化model_conf: ctc_weight: 0.6 lsm_weight: 0.1 length_normalized_loss: false frontend_conf: n_fft: 512 hop_length: 160ctc_weight: 0.6CTC 與 attention 的混合訓練權(quán)重CTC 占 0.6lsm_weight: 0.1標簽平滑系數(shù) 0.1frontend_conf在線提取 512 點 FFT、hop 160 的濾波器組特征對應 16 kHz 采樣率下 10 ms 幀移。訓練調(diào)度batch_type: numel batch_bins: 10000000 accum_grad: 8 max_epoch: 70 patience: none init: none best_model_criterion: - - valid - acc - max keep_nbest_models: 10 use_amp: true unused_parameters: true optim: adam optim_conf: lr: 0.005 weight_decay: 0.000001 scheduler: warmuplr scheduler_conf: warmup_steps: 40000 specaug: specaug specaug_conf: apply_time_warp: true time_warp_window: 5 time_warp_mode: bicubic apply_freq_mask: true freq_mask_width_range: [0, 27] num_freq_mask: 2 apply_time_mask: true time_mask_width_ratio_range: [0.0, 0.05] num_time_mask: 10batch_type: numelbatch_bins: 10000000按元素數(shù)numel動態(tài)批大小單 batch 不超過 1000 萬元素accum_grad: 8梯度累積 8 步等效放大批大小max_epoch: 70最多訓練 70 個 epoch原注釋顯示在 A6000 × 2 上每 epoch 約 90 分鐘best_model_criterion按驗證集 accuracy 最大化選擇最優(yōu)模型保留 10 個 n-bestuse_amp: true啟用自動混合精度優(yōu)化器 Adamlr 0.005 WarmupLR40000 步預熱SpecAugment 時間/頻率掩蔽增強頻率掩蔽寬度 0-27、共 2 個時間掩蔽寬度比例為 0-0.05、共 10 個。4.3 模型規(guī)模該配方訓練出的模型參數(shù)量為141.39M約 1.41 億實驗目錄名為exp/asr_train_asr_raw_en_bpe100_sp其中rawraw 特征在線前端en_bpe100英語、BPE 詞表 100spspeed perturbation三倍速擾動。五、解碼配置解碼配置見 conf/decode_asr.yamlbeam_size: 15 ctc_weight: 0.2 lm_weight: 0.0 maxlenratio: 0.0 minlenratio: 0.0 penalty: 0.0beam_size: 15beam 搜索寬度 15ctc_weight: 0.2解碼時 CTC 與 attention 得分的加權(quán)比例與訓練權(quán)重 0.6 不同解碼階段更依賴 attentionlm_weight: 0.0不集成語言模型與--use_lm false對應maxlenratio/minlenratio: 0.0不限制輸出長度比例penalty: 0.0無長度懲罰。最終用于評測的模型為decode_asr_asr_model_valid.acc.ave即驗證集 accuracy 最優(yōu)模型的平均權(quán)重average checkpoints。六、評測結(jié)果WER / CER / TER音素序列的評測標準覆蓋三種錯誤率WER詞錯率按空格分隔的音素詞計、CER字符錯誤率按音素符號計、TERtoken 錯誤率按詞表 token 計。以下數(shù)據(jù)均來自原文檔 egs2/libritts/asr1/README.md評測模型為decode_asr_asr_model_valid.acc.ave。6.1 WER詞錯誤率datasetSntWrdCorrSubDelInsErrS.Errdev-clean57369587291.78.00.40.89.167.0dev-other46136957788.510.90.61.212.774.2test-clean48378707891.48.20.40.89.470.4test-other51207254187.012.20.81.114.177.16.2 CER字符錯誤率datasetSntWrdCorrSubDelInsErrS.Errdev-clean573657071098.40.80.90.62.267.1dev-other461341478197.21.61.21.03.874.2test-clean483753064798.50.70.80.62.270.5test-other512042946396.71.71.61.04.377.16.3 TERToken 錯誤率datasetSntWrdCorrSubDelInsErrS.Errdev-clean573643354897.61.41.00.63.067.1dev-other461331655096.12.51.41.05.074.2test-clean483740403197.71.40.90.72.970.5test-other512032724895.42.81.81.15.777.1結(jié)果解讀CER2.2%~4.3%遠低于 WER9.1%~14.1%說明錯誤主要集中于個別音素符號的替換整體音素序列質(zhì)量很高*-clean與*-other的差距clean vs 噪聲/重口音符合 LibriTTS 的難度梯度設(shè)定S.Err句子錯誤率約 67%~77%意味著約三分之一的句子中存在至少一個音素錯誤——對音素級 TTS 前端而言剩余的錯誤可通過 TTS 的容錯性音素序列已包含重音和標點信息部分消化。該模型對應預訓練權(quán)重發(fā)布在 Hugging Face 的espnet/akreal_libritts_asr_phn模型倉庫中可直接加載用于推理或微調(diào)可通過 ESPnet 標準模型下載機制espnet_model_zoo/pretrained拉取。七、從源碼看該配方的可復用性7.1 g2p 方案可替換espnet2/text/phoneme_tokenizer.py 的g2p_choices列出全部可用 g2p 類型。若想遷移到其他語言只需把 local/phonemize_dir.py 中的PhonemeTokenizer(espeak_ng_english_us_vits)替換為espeak_ng_german、espeak_ng_french、espeak_ng_spanish等多語言 eSpeak NG 后端或替換為g2pk韓語、pyopenjtalk日語、pypinyin_g2p中文等專用方案即可構(gòu)造任意語言 → 音素級 ASR的配方。7.2 與 TTS 配方的銜接該配方的輸出格式空格分隔的 IPA 音素串、含標點與重音與 ESPnet 的 TTS 音素輸入約定一致。TTS 側(cè)可通過PhonemeTokenizer完成同樣的文本→音素轉(zhuǎn)換見 espnet2/text/build_tokenizer.py L76-L77 對PhonemeTokenizer的構(gòu)建邏輯實現(xiàn)ASR 輸出的音素串 → TTS 輸入的無縫對接。這正是 egs2/libritts 同時提供 asr1音素 ASR與 tts1 等配方的深層關(guān)聯(lián)所在。八、復現(xiàn)步驟速覽準備數(shù)據(jù)在 db.sh 中填寫LIBRITTS數(shù)據(jù)根目錄運行./run.sh --stage -1 --stop_stage 1完成下載、Kaldi 數(shù)據(jù)目錄生成與音素化訓練./run.sh --stage 2 --stop_stage 4按asr.sh默認階段劃分依次為特征/BPE 準備、訓練或直接./run.sh走完全流程訓練默認使用 conf/train_asr.yaml如需復現(xiàn)文檔中的 E-Branchformer 配置可追加--asr_config conf/tuning/train_asr_e_branchformer.yaml解碼與評分解碼階段生成decode_asr_*目錄使用 ESPnet 標準show_asr_result.sh匯總 WER/CER/TER 結(jié)果腳本見 egs2/libritts/asr1/scripts/utils/show_asr_result.sh加載預訓練模型通過模型名espnet/akreal_libritts_asr_phn從模型庫拉取權(quán)重直接對任意英文音頻做 IPA標點轉(zhuǎn)寫。小結(jié)本配方是音素級語音處理思路的完整落地數(shù)據(jù)側(cè)用 eSpeak NGespeak_ng_english_us_vits保留重音與標點、VITS 兼容格式把 LibriTTS 文本音素化模型側(cè)用 17 層 E-Branchformer 6 層 TransformerCTC 0.6 標簽平滑 0.1 SpecAugment在 960 小時音素監(jiān)督下訓練 1.41 億參數(shù)模型評測側(cè)以 WER/CER/TER 三重視角確認了音素序列的高保真度CER 最低 2.2%。該輸出可作為音素級 TTS 的直接前端輸入也可推廣到任意語言的音素轉(zhuǎn)寫任務。贊分享人工智能語音音頻深度學習NLP【免費下載鏈接】espnetEnd-to-End Speech Processing Toolkit項目地址https://gitcode.com/gh_mirrors/es/espnet點擊查看免費下載相關(guān)推薦ESPnet ASR2 實戰(zhàn)基于自監(jiān)督離散 token 與 E-Branchformer 的高效端到端 ASRLibriSpeech960ESPnet ASR2 實戰(zhàn)基于自監(jiān)督離散 token 與 E Branchformer 的高效端到端 ASRLibriSpeech960 本技術(shù)指南以人工智能語音音頻深度學習NLPESPnet 離散 Token ASR2 實戰(zhàn)Libriheavy small 上基于 WavLM K-Means E-Branchformer 的帶大小寫與標點識別ESPnet 離散 Token ASR2 實戰(zhàn)Libriheavy small 上基于 WavLM K Means E Branchformer 的帶人工智能語音音頻深度學習NLPESPnet CHiME4 ASR2 Recipe 實戰(zhàn)基于 WavLM 離散 Token 與 E-Branchformer 的端到端語音識別ESPnet CHiME4 ASR2 Recipe 實戰(zhàn)基于 WavLM 離散 Token 與 E Branchformer 的端到端語音識別 本篇技術(shù)指南聚人工智能語音音頻深度學習NLP創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考