詞典生成:generate_lexicon 模塊原理與 MFA 強(qiáng)制對(duì)齊實(shí)戰(zhàn))
人工智能語(yǔ)音音頻NLP媒體生成【免費(fèi)下載鏈接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.項(xiàng)目地址https://gitcode.com/paddlepaddle/PaddleSpeech點(diǎn)擊查看免費(fèi)下載本篇技術(shù)指南圍繞 PaddleSpeech 文本前端text frontend中的 paddlespeech/t2s/frontend/generate_lexicon.py 模塊展開(kāi)深入講解其聲母×韻母×兒化×聲調(diào)四維組合生成中文音節(jié)詞典的算法原理、拼音正字法orthographical規(guī)則以及如何通過(guò)配套命令行腳本產(chǎn)出 Montreal-Forced-AlignerMFA可直接使用的.lexicon與.symbols文件并串聯(lián)起完整的 MFA 訓(xùn)練與強(qiáng)制對(duì)齊流程。讀完本文你將掌握中文拼音到音素pinyin-to-phoneme映射的工程實(shí)現(xiàn)細(xì)節(jié)并能在自己的語(yǔ)料上復(fù)現(xiàn)詞典生成、OOV 檢測(cè)與音素級(jí)對(duì)齊的完整鏈路。一、模塊定位為什么中文 TTS 需要音節(jié)級(jí)詞典在 PaddleSpeech 的 TTSText-to-Speech鏈路中文本需要先經(jīng)過(guò)前端frontend轉(zhuǎn)換為音素phoneme序列再輸入聲學(xué)模型。對(duì)于中文業(yè)界通行做法是以音節(jié)syllable為基本單位做 G2PGrapheme-to-Phoneme——即先通過(guò) pypinyin、g2pM 等工具把漢字轉(zhuǎn)成拼音音節(jié)再把音節(jié)映射到聲母/韻母級(jí)別的音素序列。正如 generate_lexicon.py 模塊頭注釋所述The lexicon is used for Montreal Force Aligner. Note that syllables are used as word in this lexicon. Since syllables rather than words are used in transcriptions produced byreorganize_baker.py. We make this choice to better leverage other software for chinese text to pinyin tools like pypinyin. This is the convention for G2P in Chinese.這段話說(shuō)明了三個(gè)關(guān)鍵設(shè)計(jì)決策詞典服務(wù)于 MFA該詞典是為 Montreal-Forced-Aligner 的音素級(jí)強(qiáng)制對(duì)齊準(zhǔn)備的MFA 依賴詞典把詞此處即音節(jié)映射為音素序列以音節(jié)而非詞語(yǔ)為條目因?yàn)閞eorganize_baker.pyBZNSYP 等中文語(yǔ)料的整理腳本產(chǎn)生的標(biāo)注本身就是音節(jié)級(jí)帶聲調(diào)的拼音序列所以詞典條目也按音節(jié)組織與 G2P 工具生態(tài)對(duì)齊音節(jié)作為中間表示可以無(wú)縫銜接 pypinyin 等漢字轉(zhuǎn)拼音工具這是中文 G2P 的通用約定。在 Sphinx 文檔體系中本文對(duì)應(yīng)的 API 參考頁(yè) docs/source/api/paddlespeech.t2s.frontend.generate_lexicon.rst 通過(guò)automodule指令自動(dòng)提取該模塊的文檔字符串docstring與成員簽名而模塊自身同時(shí)在 paddlespeech/t2s/frontend/init.py 中以from .generate_lexicon import *導(dǎo)出是中文前端的重要基礎(chǔ)組件。二、基礎(chǔ)音系常量聲母、韻母與特殊音素模塊頂部定義了中文拼音的全部音系要素這是后續(xù)所有音節(jié)組合的原料21 個(gè)聲母INITIALSgenerate_lexicon.py 第 25-28 行INITIALS [ b, p, m, f, d, t, n, l, g, k, h, zh, ch, sh, r, z, c, s, j, q, x ]注意zh、ch、sh是作為復(fù)合聲母整體參與組合的而不是拆成zh等。38 個(gè)韻母FINALSgenerate_lexicon.py 第 30-35 行FINALS [ a, ai, ao, an, ang, e, er, ei, en, eng, o, ou, ong, ii, iii, i, ia, iao, ian, iang, ie, io, iou, iong, in, ing, u, ua, uai, uan, uang, uei, uo, uen, ueng, v, ve, van, vn ]這里有三個(gè)值得注意的編碼約定v代表 ü拼音中的ü在音素表示中統(tǒng)一寫(xiě)作vv/ve/van/vn對(duì)應(yīng)ü/üe/üan/ün到音節(jié)層再按規(guī)則還原成uii與iii是i的兩種變體ii表示舌尖前元音只與z/c/s相拼iii表示舌尖后元音只與zh/ch/sh/r相拼。普通i則是齊齒呼元音。三者在音素層區(qū)分、在音節(jié)層統(tǒng)一回歸為ier作為韻母參與組合用于處理兒化音中的基礎(chǔ)音節(jié)er。2 個(gè)特殊音素SPECIALSgenerate_lexicon.py 第 37 行SPECIALS [sil, sp]sil靜音與sp短停頓是 MFA 對(duì)齊中的特殊事件標(biāo)記在生成音素表時(shí)會(huì)被無(wú)條件加入。三、核心算法rule()拼音正字法規(guī)則引擎rule(C, V, R, T)函數(shù)generate_lexicon.py 第 40-144 行接收聲母C、韻母V、兒化標(biāo)記R、聲調(diào)T四個(gè)輸入輸出一個(gè)合法的拼音音節(jié)字符串若該組合不存在如不可拼的音節(jié)則返回None以便上層過(guò)濾。它本質(zhì)上把漢語(yǔ)拼音正詞法編碼成了一組約束規(guī)則逐條看3.1 聲韻配合的合法性約束約束規(guī)則內(nèi)容源碼注釋為不可拼的音節(jié)舌尖前元音ii只能和z、c、s相拼舌尖后元音iii只能和zh、ch、sh、r相拼齊齒/撮口呼i/v開(kāi)頭的韻母不能和f、g、k、h、zh、ch、sh、r、z、c、s相拼撮口呼v、ve只能和j、q、x、n、l相拼van、vn等其他撮口韻母只能和j、q、x相拼舌面音j、q、x只能和齊齒呼或撮口呼韻母相拼唇音b、p、m、f不能和u除u本身、v開(kāi)頭韻母以及ong相拼合口呼ua、uai、uang不能和d、t、n、l、r、z、c、s相拼特殊組合shong不可拼o不能和d、t、n、g、k、h、zh、ch、sh、r、z、c、s相拼特例韻母ueng只作為weng的 ad-hoc 形式存在有其他聲母時(shí)一律用ong非兒化的er只能零聲母單獨(dú)存在這些約束的來(lái)源是漢語(yǔ)音系學(xué)的四呼理論開(kāi)口呼、齊齒呼、合口呼、撮口呼與聲韻配合表代碼用簡(jiǎn)潔的集合運(yùn)算把整套規(guī)則表達(dá)了出來(lái)。3.2 零聲母音節(jié)與書(shū)寫(xiě)規(guī)約當(dāng)C 零聲母時(shí)需要按拼音書(shū)寫(xiě)規(guī)則補(bǔ)出介音字母generate_lexicon.py 第 110-123 行i、in、ing→ 聲母寫(xiě)作y如yi、yin、yingu→ 聲母寫(xiě)作w如wu其他i開(kāi)頭非ii/iii→ 聲母寫(xiě)作y并去掉韻母首字母i如ia→ya其他u開(kāi)頭 → 聲母寫(xiě)作w并去掉首字母u如ua→wav開(kāi)頭 → 聲母寫(xiě)作yu并去掉首字母v如van→yuan。當(dāng)有聲母時(shí)還需處理兩類書(shū)寫(xiě)轉(zhuǎn)換generate_lexicon.py 第 124-133 行去兩點(diǎn)j、q、x后的v一律改寫(xiě)為u如jv→ju這正是ü 見(jiàn) j/q/x 去兩點(diǎn)的拼寫(xiě)規(guī)則縮寫(xiě)iou→iu、uei→ui、uen→un還原為拼音的省略寫(xiě)法。3.3 兒化與聲調(diào)的拼接過(guò)濾組合出C V之后還有兩道收尾邏輯兒化防重若結(jié)果已以r結(jié)尾如韻母er則不能再疊加兒化標(biāo)記rii/iii回歸通過(guò)re.sub(ri, i, result)把ii、iii統(tǒng)一折疊為i使音節(jié)層寫(xiě)法與日常拼音一致而音素層仍保留區(qū)分。最終返回result R T其中R為兒化標(biāo)記空或rT為聲調(diào)標(biāo)記空或1-5其中5表示輕聲。四、詞典生成generate_lexicon()與音素表generate_symbols()4.1 四維笛卡爾積生成generate_lexicon(with_toneFalse, with_erhuaFalse)generate_lexicon.py 第 147-158 行通過(guò)四重循環(huán)枚舉所有組合for C in [] INITIALS: # 零聲母 21 個(gè)聲母 for V in FINALS: # 38 個(gè)韻母 for R in [] if not with_erhua else [, r]: for T in [] if not with_tone else [1, 2, 3, 4, 5]: result rule(C, V, R, T) if result: syllables[result] f{C} {V}{R}{T}其語(yǔ)義與參數(shù)含義為with_toneFalse默認(rèn)不區(qū)分聲調(diào)音節(jié)不帶1-5聲調(diào)后綴with_toneTrue為每個(gè)音節(jié)生成帶聲調(diào)變體5對(duì)應(yīng)輕聲with_erhuaFalse默認(rèn)不生成兒化音節(jié)with_erhuaTrue為每個(gè)可兒化韻母額外生成r結(jié)尾的兒化變體。返回的是一個(gè)OrderedDict鍵為拼音音節(jié)如ba1值為對(duì)應(yīng)的音素序列如b a1。rule()返回None的組合不存在的音節(jié)會(huì)被自動(dòng)過(guò)濾因此最終詞典只包含普通話中真實(shí)存在的音節(jié)。4.2 音素表生成配套的generate_symbols(lexicon)見(jiàn) examples/other/mfa/local/generate_lexicon.py 第 166-175 行遍歷詞典中出現(xiàn)的所有音素并收集去重?zé)o條件加入特殊音素sil、sp遍歷每個(gè)音節(jié)的音素序列逐個(gè)加入集合最終返回排序后的音素列表供后續(xù)構(gòu)建音素詞表vocab使用。由此得到的.symbols文件就是 MFA 訓(xùn)練與解碼所需的音素集合也是 zh_frontend.py 等前端模塊中Vocab的候選符號(hào)來(lái)源Vocab的實(shí)現(xiàn)位于 paddlespeech/t2s/frontend/vocab.py負(fù)責(zé)符號(hào)到 id 的雙向映射。五、命令行用法輸出.lexicon與.symbols除了作為庫(kù)函數(shù)被引用模塊還提供了可直接運(yùn)行的 CLI 版本 examples/other/mfa/local/generate_lexicon.py其參數(shù)定義見(jiàn)該文件第 178-189 行python local/generate_lexicon.py output [--with-tone] [--with-r] [--rhy-with-duration]參數(shù)類型說(shuō)明output位置參數(shù)必填輸出文件前綴最終生成output.lexicon與output.symbols--with-tone開(kāi)關(guān)是否考慮聲調(diào)生成1-5聲調(diào)變體--with-r開(kāi)關(guān)是否考慮兒化生成r結(jié)尾的兒化音節(jié)--rhy-with-duration開(kāi)關(guān)是否為韻律標(biāo)簽寫(xiě)入帶時(shí)長(zhǎng)的特殊條目見(jiàn)下文韻律標(biāo)簽小節(jié)執(zhí)行后寫(xiě)入兩個(gè)文件generate_lexicon.py 第 194-202 行.lexicon詞典文件每行一個(gè)條目格式為音節(jié) 音素序列例如a a ai ai ... ba1 b a1 ba2 b a2當(dāng)啟用--rhy-with-duration時(shí)會(huì)額外在文件頭部寫(xiě)入四行韻律標(biāo)簽條目sp1 sp1、sp2 sp2、sp3 sp3、sp4 sp4對(duì)應(yīng)不同時(shí)長(zhǎng)的停頓音素.symbols音素表文件每行一個(gè)音素符號(hào)供 MFA 建立音素模型使用。輸出規(guī)模參考不啟用聲調(diào)/兒化時(shí)詞典條目即普通話全部聲母×韻母可拼組合約 400 個(gè)量級(jí)啟用--with-tone后每個(gè)基礎(chǔ)音節(jié)最多擴(kuò)展出 5 個(gè)聲調(diào)變體含輕聲實(shí)際規(guī)模以rule()過(guò)濾后的合法組合數(shù)為準(zhǔn)。一個(gè)實(shí)用建議做 MFA 對(duì)齊時(shí)通常同時(shí)開(kāi)啟--with-tone --with-r因?yàn)檎Z(yǔ)料標(biāo)注中既含聲調(diào)又含兒化音節(jié)詞典不全會(huì)導(dǎo)致大量 OOV。六、在 PaddleSpeech 中文前端中的實(shí)際應(yīng)用generate_lexicon不止服務(wù)于 MFA也直接參與 TTS 前端的拼音轉(zhuǎn)音素映射。在 zh_frontend.py 中當(dāng) G2P 模型選擇g2pM或g2pW時(shí)會(huì)構(gòu)造一個(gè)拼音→音素查找表zh_frontend.py 第 140-152 行if self.g2p_model g2pM: self.g2pM_model G2pM() self.pinyin2phone generate_lexicon(with_toneTrue, with_erhuaFalse) elif self.g2p_model g2pW: self._init_pypinyin() self.corrector Polyphonic() self.g2pM_model G2pM() self.g2pW_model G2PWOnnxConverter(stylepinyin, enable_non_tradional_chineseTrue) self.pinyin2phone generate_lexicon(with_toneTrue, with_erhuaFalse)這里使用的參數(shù)組合是with_toneTrue, with_erhuaFalse——即保留聲調(diào)信息前端后續(xù)還會(huì)做聲調(diào)變調(diào) tone sandhi 等處理兒化則交由其他模塊處理。從源碼結(jié)構(gòu)看pinyin2phone的鍵值結(jié)構(gòu)即帶聲調(diào)音節(jié) → 聲母韻母音素序列例如ba3 → b a3。pypinyin模式g2p_modelpypinyin則通過(guò)_init_pypinyin()加載pypinyin的詞典與多音字詞表實(shí)現(xiàn)同樣的映射zh_frontend.py 第 156-163 行。由此可以清晰看到本模塊在兩條業(yè)務(wù)線中的角色離線對(duì)齊場(chǎng)景為 MFA 生成完整詞典與音素表在線 TTS 前端場(chǎng)景為 g2pM/g2pW 提供音節(jié)→音素的標(biāo)準(zhǔn)映射表作為 G2P 鏈路的落點(diǎn)。七、完整實(shí)戰(zhàn)從詞典生成到 MFA 強(qiáng)制對(duì)齊examples/other/mfa/run.sh 給出了端到端的可運(yùn)行流程其鏈路為生成詞典 → 重組語(yǔ)料 → OOV 檢測(cè) → 下載 MFA → 訓(xùn)練并強(qiáng)制對(duì)齊。步驟 1生成詞典LEXICON_NAMEsimple python local/generate_lexicon.py $exp/$LEXICON_NAME --with-r --with-tone產(chǎn)出exp/simple.lexicon與exp/simple.symbols。步驟 2重組語(yǔ)料python local/reorganize_baker.py --root-dir~/datasets/BZNSYP --output-dir$exp/baker_corpus --resample-audio把 BZNSYP標(biāo)貝中文女聲音庫(kù)原始數(shù)據(jù)整理為 MFA 可接受的目錄結(jié)構(gòu)音頻統(tǒng)一重采樣到 16 kHz每個(gè)音頻文件對(duì)應(yīng)一個(gè)同名.lab文本標(biāo)注。步驟 3OOV 檢測(cè)python local/detect_oov.py $exp/baker_corpus $exp/$LEXICON_NAME.lexicondetect_oov.py 會(huì)掃描語(yǔ)料中所有.lab標(biāo)注逐個(gè)音節(jié)與詞典比對(duì)若發(fā)現(xiàn)標(biāo)注中的音節(jié)不在詞典中則打印告警detect_oov.py 第 30-34 行。run.sh 中對(duì)此的提示是出現(xiàn)意外 OOV 時(shí)應(yīng)當(dāng)考慮重新生成補(bǔ)充詞典。步驟 4下載并訓(xùn)練 MFA./$MFA_DOWNLOAD_DIR/montreal-forced-aligner/bin/mfa_train_and_align \ $exp/baker_corpus $exp/$LEXICON_NAME.lexicon $exp/baker_alignment \ -o $exp/baker_model --clean --verbose -j 10 --temp_directory $exp/.mfa_train_and_alignmfa_train_and_align會(huì)先基于詞典在語(yǔ)料上訓(xùn)練聲學(xué)模型GMM/HMM再對(duì)每條音頻做音素級(jí)強(qiáng)制對(duì)齊輸出目錄為exp/baker_alignment模型保存在exp/baker_model。-j 10指定并行度--clean清理臨時(shí)狀態(tài)。韻律標(biāo)簽Rhythm tags如果你希望在對(duì)齊結(jié)果中獲取帶時(shí)長(zhǎng)的韻律標(biāo)簽examples/other/mfa/README.md 說(shuō)明了相關(guān)約束If you want to get rhythm tags with duration through MFA tool, you may add flag--rhy-with-durationin the first two commands inrun.sh. Note that only CSMSC dataset is supported so far, and we replace#withspin rhythm tags for MFA.即在 run.sh 中前兩個(gè)命令生成詞典、重組語(yǔ)料上追加--rhy-with-duration標(biāo)志即可讓詞典中包含sp1-sp4四個(gè)不同時(shí)長(zhǎng)的停頓音素從而讓 MFA 學(xué)到不同韻律停頓的時(shí)長(zhǎng)目前該能力僅支持 CSMSC 數(shù)據(jù)集且韻律標(biāo)簽中的#統(tǒng)一替換為sp系列。此外倉(cāng)庫(kù)還提供了粵語(yǔ)Cantonese的 MFA 流程 run_canton.sh 與對(duì)應(yīng)的粵語(yǔ)詞典生成腳本 generate_canton_lexicon_wavlabs.py表明這套詞典對(duì)齊方法論可以擴(kuò)展到其他方言/語(yǔ)言。八、總結(jié)generate_lexicon是 PaddleSpeech 中文語(yǔ)音處理中一個(gè)小而精的基礎(chǔ)模塊算法上它用一套精煉的規(guī)則函數(shù)完整編碼了漢語(yǔ)拼音的聲韻配合表與書(shū)寫(xiě)規(guī)約四呼限制、ü→v編碼、i/ii/iii三分、兒化與聲調(diào)擴(kuò)展并借助四維笛卡爾積自動(dòng)枚舉出全部合法音節(jié)工程上它同時(shí)提供庫(kù)接口被 zh_frontend.py 的 g2pM/g2pW 模式復(fù)用和 CLI 入口輸出 MFA 可直接消費(fèi)的.lexicon/.symbols文件生態(tài)上它與 examples/other/mfa 下的語(yǔ)料重組、OOV 檢測(cè)、MFA 訓(xùn)練腳本共同構(gòu)成了一套可復(fù)現(xiàn)的中文音素級(jí)對(duì)齊流水線其產(chǎn)物帶音素時(shí)長(zhǎng)的對(duì)齊結(jié)果是后續(xù) TTS 聲學(xué)模型訓(xùn)練如 FastSpeech2、Speedyspeech 等的重要輸入。對(duì)于需要自行構(gòu)建中文 TTS 數(shù)據(jù)流水線的開(kāi)發(fā)者理解該模塊的生成規(guī)則與參數(shù)語(yǔ)義是避免詞典缺失、OOV 泛濫和對(duì)齊失敗的第一步。贊分享人工智能語(yǔ)音音頻NLP媒體生成【免費(fèi)下載鏈接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.項(xiàng)目地址https://gitcode.com/paddlepaddle/PaddleSpeech點(diǎn)擊查看免費(fèi)下載相關(guān)推薦PaddleSpeech CTC 強(qiáng)制對(duì)齊與 Praat TextGrid 生成text_grid 模塊原理與實(shí)踐PaddleSpeech CTC 強(qiáng)制對(duì)齊與 Praat TextGrid 生成text_grid 模塊原理與實(shí)踐 本篇技術(shù)指南以 PaddleSpeech人工智能語(yǔ)音音頻THCHS-30 中文語(yǔ)音數(shù)據(jù)集實(shí)戰(zhàn)指南數(shù)據(jù)布局、PaddleSpeech 預(yù)處理與 MFA 強(qiáng)制對(duì)齊THCHS 30 中文語(yǔ)音數(shù)據(jù)集實(shí)戰(zhàn)指南數(shù)據(jù)布局、PaddleSpeech 預(yù)處理與 MFA 強(qiáng)制對(duì)齊 THCHS 30THCHS30 2015是由清華大人工智能語(yǔ)音音頻解決VoiceCraft語(yǔ)音合成中的MFA對(duì)齊難題從原理到實(shí)戰(zhàn)解決VoiceCraft語(yǔ)音合成中的MFA對(duì)齊難題從原理到實(shí)戰(zhàn) 在語(yǔ)音合成Text to Speech, TTS應(yīng)用中文本與音頻的精準(zhǔn)對(duì)齊是保證合成語(yǔ)音人工智能大模型語(yǔ)音音頻上一篇推薦4端口高功率USB集線器下一篇Shimmy性能優(yōu)化完全指南如何提升70B大模型推理效率創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考