 ASR 實(shí)戰(zhàn)指南:基于 LibriTTS 與 E-Branchformer 的 IPA+標(biāo)點(diǎn)轉(zhuǎn)寫系統(tǒng))
人工智能語音音頻深度學(xué)習(xí)NLP【免費(fèi)下載鏈接】espnetEnd-to-End Speech Processing Toolkit項(xiàng)目地址https://gitcode.com/gh_mirrors/es/espnet點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本文圍繞 ESPnet 倉庫中 egs2/libritts/asr1 這一音素級(jí) ASRAutomatic Speech Recognition實(shí)驗(yàn)配方展開講解如何基于 LibriTTS 語料構(gòu)建一個(gè)輸出為 IPA國際音標(biāo)音素序列并保留標(biāo)點(diǎn)的識(shí)別系統(tǒng)。該系統(tǒng)的核心設(shè)計(jì)目標(biāo)是產(chǎn)出可直接作為基于音素的 TTSPhone-based TTS輸入端的轉(zhuǎn)寫結(jié)果從而將文本grapheme到音素phoneme的轉(zhuǎn)換負(fù)擔(dān)從 TTS 前端遷移到 ASR 后端。讀完本文你將掌握音素化數(shù)據(jù)準(zhǔn)備流程、espeak_ng_english_us_vits這一 g2pgrapheme-to-phoneme方案的底層實(shí)現(xiàn)原理、E-Branchformer 訓(xùn)練配置的完整參數(shù)含義以及該系統(tǒng)的 WER/CER/TER 量化表現(xiàn)。一、系統(tǒng)目標(biāo)為什么需要音素標(biāo)點(diǎn)的 ASR 輸出該配方在 egs2/libritts/asr1/README.md 中開宗明義本系統(tǒng)的目的是產(chǎn)生適合作為基于音素 TTS 直接輸入的輸出。這與常規(guī)的字素級(jí)graphemeASR 有本質(zhì)區(qū)別常規(guī) ASR 輸出自然語言文本單詞、字詞供人閱讀或作為語音識(shí)別評(píng)測基準(zhǔn)本配方輸出音素序列IPA 符號(hào)與標(biāo)點(diǎn)語義上等價(jià)于語音 → 音素轉(zhuǎn)寫可直接喂給音素級(jí) TTS 前端避免 TTS 端再做一輪 g2p 轉(zhuǎn)換。從數(shù)據(jù)流角度看這正是把 TTS 流水線中的 g2p 環(huán)節(jié)前置到 ASR 中聯(lián)合解決ASR 學(xué)習(xí)聲學(xué)特征 → 音素串含標(biāo)點(diǎn)的映射而音素串本身就是 TTS 可直接消費(fèi)的中間表示。因此該模型可視為語音轉(zhuǎn)寫speech-to-phoneme transcription專用系統(tǒng)其評(píng)測指標(biāo)WER/CER/TER也全部基于音素序列計(jì)算。二、實(shí)驗(yàn)環(huán)境與依賴原文檔記錄了該配方的實(shí)測環(huán)境詳見 egs2/libritts/asr1/README.md項(xiàng)目版本Python3.10.8GCC 11.3.1ESPnetespnet 202308PyTorch2.0.1cu118訓(xùn)練硬件A600048 GB× 2 GPU需要特別說明由于本配方依賴 eSpeak NG 進(jìn)行音素化必須安裝相應(yīng)的 g2p 依賴。從源碼看espeak_ng_english_us_vits走的是phonemizer庫的espeak后端見下文源碼解析小節(jié)因此復(fù)現(xiàn)前需要確保環(huán)境中安裝了phonemizer及其 espeak-ng 后端。三、數(shù)據(jù)處理從 LibriTTS 到音素化訓(xùn)練集3.1 數(shù)據(jù)下載與目錄組織數(shù)據(jù)準(zhǔn)備腳本為 local/data.sh它通過 db.sh 讀取LIBRITTS環(huán)境變量指定的數(shù)據(jù)根目錄并從www.openslr.org/resources/60下載 LibriTTS 的七個(gè)子集dev-clean、dev-other、test-clean、test-othertrain-clean-100、train-clean-360、train-other-500下載完成后在$db_root/LibriTTS/.complete打上標(biāo)記以避免重復(fù)下載。隨后stage 0對(duì)每個(gè)子集調(diào)用 local/data_prep.sh 生成 Kaldi 風(fēng)格數(shù)據(jù)目錄wav.scp、text、utt2spk、spk2gender、spk2utt再用utils/fix_data_dir.sh修復(fù)最后調(diào)用local/phonemize_dir.py做音素化stage 1用utils/combine_data.sh合并數(shù)據(jù)——dev由dev-cleandev-other合并train-960由三個(gè)訓(xùn)練子集合并合計(jì)約 960 小時(shí)。local/data_prep.sh 沿用了 LibriTTS 的標(biāo)準(zhǔn)做法以reader_chapter作為說話人粒度utt2spk按章節(jié)劃分便于按章節(jié)計(jì)算 CMVN轉(zhuǎn)寫文本取自每個(gè) wav 對(duì)應(yīng)的.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)要點(diǎn)拆解使用PhonemeTokenizer(espeak_ng_english_us_vits)將每句英文文本轉(zhuǎn)為音素 token 序列token 序列用.join()拼回字符串再統(tǒng)一把space占位符替換為真實(shí)空格從而把詞邊界還原為空格分隔處理完成后原文本備份為text.orig音素文本正式覆蓋text因此訓(xùn)練集、驗(yàn)證集、測試集的text文件都是音素序列ASR 模型學(xué)到的是聲學(xué)特征 → 音素標(biāo)點(diǎn)的映射。3.3 底層 g2pespeak_ng_english_us_vits 的實(shí)現(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類是對(duì) bootphon/phonemizer 的封裝見 espnet2/text/phoneme_tokenizer.py L384-L437內(nèi)部通過phonemizer.backend.BACKENDS[backend]實(shí)例化languageen-us使用美式英語發(fā)音規(guī)則with_stressTrue保留重音符號(hào)——IPA 音素中的主/次重音如 ? 與 ?對(duì) TTS 韻律至關(guān)重要preserve_punctuationTrue保留標(biāo)點(diǎn)——這正是IPA 標(biāo)點(diǎn)系統(tǒng)中標(biāo)點(diǎn)來源標(biāo)點(diǎn)會(huì)被當(dāng)作獨(dú)立 token 輸出word_separator 、phone_separator、split_by_single_tokenTrue采用 VITS 官方實(shí)現(xiàn)類似的處理方式——詞邊界用空格分隔、音素間不加分隔符、按單 token 拆分拆分時(shí)Phonemizer.__call__會(huì)把空格替換為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正是為英文音素級(jí) TTS 量身定制的一檔。四、訓(xùn)練配置詳解4.1 入口腳本 run.sh訓(xùn)練入口為 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目標(biāo)語言為英語--ngpu 22雙 GPU 分布式訓(xùn)練--nbpe 100100BPE 詞表大小 100——由于輸出是音素序列詞表天然很小100 個(gè) BPE 單元足夠覆蓋音素標(biāo)點(diǎn)組合--max_wav_duration 3030秒過濾超過 30 秒的長音頻--speed_perturb_factors0.9 1.0 1.1三倍速擾動(dòng)0.9×/1.0×/1.1×做數(shù)據(jù)增強(qiáng)--audio_format flac.arkflac.ark音頻以 FLAC 編碼的 ark 格式存儲(chǔ)--feats_type rawraw不預(yù)提取特征直接在訓(xùn)練中計(jì)算前端特征--use_lm falsefalse不使用外部語言模型音素序列無需 LM 建模--asr_configconf/train_asr.yaml訓(xùn)練配置--inference_configconf/decode_asr.yaml解碼配置--bpe_train_textdata/train-960/text在音素化后的訓(xùn)練文本上訓(xùn)練 BPE 模型值得注意的是run.sh末尾的$允許命令行追加參數(shù)覆蓋默認(rèn)值這與 ESPnet 所有配方的習(xí)慣一致如覆蓋--asr_config指向 conf/tuning/train_asr_e_branchformer.yaml。4.2 模型結(jié)構(gòu)E-Branchformer 編碼器 Transformer 解碼器訓(xùn)練配置 conf/tuning/train_asr_e_branchformer.yaml與 conf/train_asr.yaml 內(nèi)容一致定義了完整的模型與訓(xùn)練方案編碼器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使用相對(duì)位置編碼的 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 點(diǎn) FFTlayer_drop_rate: 0.1層級(jí)丟棄正則化。解碼器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訓(xùn)練損失與優(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 的混合訓(xùn)練權(quán)重CTC 占 0.6lsm_weight: 0.1標(biāo)簽平滑系數(shù) 0.1frontend_conf在線提取 512 點(diǎn) FFT、hop 160 的濾波器組特征對(duì)應(yīng) 16 kHz 采樣率下 10 ms 幀移。訓(xùn)練調(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按元素?cái)?shù)numel動(dòng)態(tài)批大小單 batch 不超過 1000 萬元素accum_grad: 8梯度累積 8 步等效放大批大小max_epoch: 70最多訓(xùn)練 70 個(gè) epoch原注釋顯示在 A6000 × 2 上每 epoch 約 90 分鐘best_model_criterion按驗(yàn)證集 accuracy 最大化選擇最優(yōu)模型保留 10 個(gè) n-bestuse_amp: true啟用自動(dòng)混合精度優(yōu)化器 Adamlr 0.005 WarmupLR40000 步預(yù)熱SpecAugment 時(shí)間/頻率掩蔽增強(qiáng)頻率掩蔽寬度 0-27、共 2 個(gè)時(shí)間掩蔽寬度比例為 0-0.05、共 10 個(gè)。4.3 模型規(guī)模該配方訓(xùn)練出的模型參數(shù)量為141.39M約 1.41 億實(shí)驗(yàn)?zāi)夸浢麨閑xp/asr_train_asr_raw_en_bpe100_sp其中rawraw 特征在線前端en_bpe100英語、BPE 詞表 100spspeed perturbation三倍速擾動(dòng)。五、解碼配置解碼配置見 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解碼時(shí) CTC 與 attention 得分的加權(quán)比例與訓(xùn)練權(quán)重 0.6 不同解碼階段更依賴 attentionlm_weight: 0.0不集成語言模型與--use_lm false對(duì)應(yīng)maxlenratio/minlenratio: 0.0不限制輸出長度比例penalty: 0.0無長度懲罰。最終用于評(píng)測的模型為decode_asr_asr_model_valid.acc.ave即驗(yàn)證集 accuracy 最優(yōu)模型的平均權(quán)重average checkpoints。六、評(píng)測結(jié)果WER / CER / TER音素序列的評(píng)測標(biāo)準(zhǔn)覆蓋三種錯(cuò)誤率WER詞錯(cuò)率按空格分隔的音素詞計(jì)、CER字符錯(cuò)誤率按音素符號(hào)計(jì)、TERtoken 錯(cuò)誤率按詞表 token 計(jì)。以下數(shù)據(jù)均來自原文檔 egs2/libritts/asr1/README.md評(píng)測模型為decode_asr_asr_model_valid.acc.ave。6.1 WER詞錯(cuò)誤率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字符錯(cuò)誤率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 錯(cuò)誤率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%遠(yuǎn)低于 WER9.1%~14.1%說明錯(cuò)誤主要集中于個(gè)別音素符號(hào)的替換整體音素序列質(zhì)量很高*-clean與*-other的差距clean vs 噪聲/重口音符合 LibriTTS 的難度梯度設(shè)定S.Err句子錯(cuò)誤率約 67%~77%意味著約三分之一的句子中存在至少一個(gè)音素錯(cuò)誤——對(duì)音素級(jí) TTS 前端而言剩余的錯(cuò)誤可通過 TTS 的容錯(cuò)性音素序列已包含重音和標(biāo)點(diǎn)信息部分消化。該模型對(duì)應(yīng)預(yù)訓(xùn)練權(quán)重發(fā)布在 Hugging Face 的espnet/akreal_libritts_asr_phn模型倉庫中可直接加載用于推理或微調(diào)可通過 ESPnet 標(biāo)準(zhǔn)模型下載機(jī)制espnet_model_zoo/pretrained拉取。七、從源碼看該配方的可復(fù)用性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)造任意語言 → 音素級(jí) ASR的配方。7.2 與 TTS 配方的銜接該配方的輸出格式空格分隔的 IPA 音素串、含標(biāo)點(diǎn)與重音與 ESPnet 的 TTS 音素輸入約定一致。TTS 側(cè)可通過PhonemeTokenizer完成同樣的文本→音素轉(zhuǎn)換見 espnet2/text/build_tokenizer.py L76-L77 對(duì)PhonemeTokenizer的構(gòu)建邏輯實(shí)現(xiàn)ASR 輸出的音素串 → TTS 輸入的無縫對(duì)接。這正是 egs2/libritts 同時(shí)提供 asr1音素 ASR與 tts1 等配方的深層關(guān)聯(lián)所在。八、復(fù)現(xiàn)步驟速覽準(zhǔn)備數(shù)據(jù)在 db.sh 中填寫LIBRITTS數(shù)據(jù)根目錄運(yùn)行./run.sh --stage -1 --stop_stage 1完成下載、Kaldi 數(shù)據(jù)目錄生成與音素化訓(xùn)練./run.sh --stage 2 --stop_stage 4按asr.sh默認(rèn)階段劃分依次為特征/BPE 準(zhǔn)備、訓(xùn)練或直接./run.sh走完全流程訓(xùn)練默認(rèn)使用 conf/train_asr.yaml如需復(fù)現(xiàn)文檔中的 E-Branchformer 配置可追加--asr_config conf/tuning/train_asr_e_branchformer.yaml解碼與評(píng)分解碼階段生成decode_asr_*目錄使用 ESPnet 標(biāo)準(zhǔn)show_asr_result.sh匯總 WER/CER/TER 結(jié)果腳本見 egs2/libritts/asr1/scripts/utils/show_asr_result.sh加載預(yù)訓(xùn)練模型通過模型名espnet/akreal_libritts_asr_phn從模型庫拉取權(quán)重直接對(duì)任意英文音頻做 IPA標(biāo)點(diǎn)轉(zhuǎn)寫。小結(jié)本配方是音素級(jí)語音處理思路的完整落地?cái)?shù)據(jù)側(cè)用 eSpeak NGespeak_ng_english_us_vits保留重音與標(biāo)點(diǎn)、VITS 兼容格式把 LibriTTS 文本音素化模型側(cè)用 17 層 E-Branchformer 6 層 TransformerCTC 0.6 標(biāo)簽平滑 0.1 SpecAugment在 960 小時(shí)音素監(jiān)督下訓(xùn)練 1.41 億參數(shù)模型評(píng)測側(cè)以 WER/CER/TER 三重視角確認(rèn)了音素序列的高保真度CER 最低 2.2%。該輸出可作為音素級(jí) TTS 的直接前端輸入也可推廣到任意語言的音素轉(zhuǎn)寫任務(wù)。贊分享人工智能語音音頻深度學(xué)習(xí)NLP【免費(fèi)下載鏈接】espnetEnd-to-End Speech Processing Toolkit項(xiàng)目地址https://gitcode.com/gh_mirrors/es/espnet點(diǎn)擊查看免費(fèi)下載相關(guān)推薦ESPnet ASR2 實(shí)戰(zhàn)基于自監(jiān)督離散 token 與 E-Branchformer 的高效端到端 ASRLibriSpeech960ESPnet ASR2 實(shí)戰(zhàn)基于自監(jiān)督離散 token 與 E Branchformer 的高效端到端 ASRLibriSpeech960 本技術(shù)指南以人工智能語音音頻深度學(xué)習(xí)NLPESPnet 離散 Token ASR2 實(shí)戰(zhàn)Libriheavy small 上基于 WavLM K-Means E-Branchformer 的帶大小寫與標(biāo)點(diǎn)識(shí)別ESPnet 離散 Token ASR2 實(shí)戰(zhàn)Libriheavy small 上基于 WavLM K Means E Branchformer 的帶人工智能語音音頻深度學(xué)習(xí)NLPESPnet CHiME4 ASR2 Recipe 實(shí)戰(zhàn)基于 WavLM 離散 Token 與 E-Branchformer 的端到端語音識(shí)別ESPnet CHiME4 ASR2 Recipe 實(shí)戰(zhàn)基于 WavLM 離散 Token 與 E Branchformer 的端到端語音識(shí)別 本篇技術(shù)指南聚人工智能語音音頻深度學(xué)習(xí)NLP創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考