一
引言
語音識別(Automatic Speech Recognition)是AI領(lǐng)域的一項重要應(yīng)用,是一種將人的語音轉(zhuǎn)換為文本的技術(shù)。
其主要的應(yīng)用場景有:單獨使用該技術(shù)的字幕生成,會議轉(zhuǎn)寫以及聯(lián)合語音合成技術(shù)使用的智能助手、智能音箱、智能汽車等。
其中字幕生成包括視頻的離線字幕生成以及直播場景下的在線字幕生成。隨著短視頻和直播場景的興起,我們對自動字幕的需求也越來越大,這對推理GPU的速度、延時和成本也是很大的挑戰(zhàn)。
本文將介紹ASR模型工作原理,離線字幕生成場景優(yōu)化,以及ASR在沐曦曦思N100人工智能推理GPU上如何做靜態(tài)部署,后者可作為其他序列生成模型的靜態(tài)化部署參考方案。
二
ASR模型介紹
一般聲音聲波輸入聲學(xué)模型前,會將語音預(yù)處理轉(zhuǎn)換為梅爾圖譜,即將聲音以一定的幀長切成短幀,然后使用傅里葉變換得到頻譜,依照人類對不同頻率音頻的敏感程度不同,頻譜又經(jīng)過梅爾三角濾波器組,最后得到信息密度更高的梅爾頻譜作為ASR模型的輸入。
為了解決從梅爾頻譜到文字的對齊問題,學(xué)界有兩種對齊方案:
對齊方案 1
不學(xué)習(xí)對齊,允許空格和重復(fù)輸出,直接在計算損失時使用CTC 損失得到規(guī)整后為正確結(jié)果的所有路徑概率和,讓概率和最大。本方案為非自回歸方案,速度快、易訓(xùn)練,但由于不考慮上下文,其結(jié)果容易造成結(jié)巴或漏字。
對齊方案 2
用序列到序列編碼器-解碼器的方式學(xué)習(xí)基于注意力的語音文字軟對齊。本方案為自回歸方案,考慮了上下文,精度更高,但對齊靈活性容易被干擾且解碼速度更慢。
目前效果較好且比較流行的語音識別端到端模型的一般結(jié)構(gòu)是結(jié)合前面兩種方案,即把兩種模型放在同一個模型結(jié)構(gòu)中,共享編碼器部分,以wenet模型[1]為例,其訓(xùn)練時的數(shù)據(jù)流向為:
1
用語音預(yù)處理從語音波形中提取梅爾圖譜特征。
2
以conformer模型作為編碼器(綠色),進一步提取和融合輸入特征。
3
注意力解碼器部分(紅色)在訓(xùn)練時為編碼器后接入一個基于注意力的解碼器,在只能看到歷史信息的掩碼限制下生成目標句子,再對每個字得到平滑交叉熵損失。在前向推理時,利用編碼器輸出和歷史解碼器結(jié)果自回歸生成下一個文字。(紅色部分)。
4
CTC 解碼器部分(黃色)在訓(xùn)練時為編碼器后接一個全連接層再接CTC損失,利用CTC規(guī)避訓(xùn)練時的語音文本對齊問題,在前向推理時每幀得到空格或文字,對生成結(jié)果規(guī)整后即得到目標語句。CTC 解碼器在前向推理時可以結(jié)合語言模型如n-gram語言模型一起使用,提升正確率。
圖2 ASR模型結(jié)構(gòu)介紹
由于CTC head加ngram語言模型和注意力head均能生成結(jié)果文字,在落地使用時有多種解碼方式:
解碼方案 1
直接以CTC head結(jié)果為準,這種方案解碼速度很快,但正確率較低。
解碼方案 2
CTC head生成概率最高的topk句,由注意力 head分別為多句進行評分,即整句每個字概率加和,選出top1的句子,這種方案正確率高于方案1,速度慢于方案1。
解碼方案 3
注意力head每個字生成后,結(jié)合該字在CTC head的分數(shù)共同評估,得到當(dāng)前時刻的top1的字,這種方案正確率高于方案2,速度慢于方案2。
從方案1到方案3,正確率越來越高,解碼速度越來越慢。使用時可根據(jù)實際場景選擇。為確保正確率,一般采取后兩種方案。
三
字幕生成鏈路改進
經(jīng)過調(diào)研和實驗,我們嘗試了一些讓生成字幕準確率更高的方法,以下為完備有效的鏈路:
圖3 字幕生成鏈路
從視頻提取到音頻后,先使用傳統(tǒng)方法對背景音樂和噪聲進行去除;然后啟用長音頻切分,即利用深度學(xué)習(xí)方法檢測人聲,在合適的沒有檢測到人聲的地方把長語音斷成許多短語音;接著將短語音送入ASR聲學(xué)模型,在熱詞的輔助下輸出識別結(jié)果;最后將結(jié)果送入糾錯語言模型進行一些簡單的詞錯誤糾正,得到最終的字幕文件。以上各模塊均能發(fā)揮一定的作用。
以下是鏈路中模塊加入前后的示例:
音頻原識別結(jié)果改進后識別結(jié)果改進原理
那這樣吧今天下午我來拿情臉那這樣吧今天下午我來拿行李前置去背景音樂模塊后ASR模型就能正確識別最后兩個字
不過你也知道我大姐的脾氣,他向來不主張明家的子弟去搞政治不過你也知道我大姐的脾氣,她向來不主張明家的子弟去搞政治原音頻為兩段,通過VAD后聚類后兩段合成一段,使得模型有更多前后信息,“她”字識別正確
喂清云我錯了喂清俞我錯了加入的熱詞中有角色名,解碼時優(yōu)先熱詞,“俞”字識別正確
下將具體介紹我們在長音頻切分模塊和ASR模型解碼模塊做的一些改進。
3.1
長音頻切分優(yōu)化
長音頻切分模塊中,我們通過使用深度學(xué)習(xí)模型marblenet做語音活動性檢測,即判斷每一幀是人聲還是環(huán)境音,并通過模型蒸餾、構(gòu)造數(shù)據(jù)、加入更豐富影視數(shù)據(jù)等提升分類精度。
在得到幀分類后可通過設(shè)定pad_onset, pad_offset, min_duration.max_duration等參數(shù)找到切分點,把長句切分成多個短句,可根據(jù)實際需要調(diào)整以上參數(shù)數(shù)值。
同時由實驗得到,多個相關(guān)短句合并成小長句后識別效果常好于單個短句,原因是在解碼時能利用上文語義信息得到更好的結(jié)果,但太長又會導(dǎo)致耗時和顯存增加。故在切分準確的基礎(chǔ)上,我們通過一維時間聚類的方式,將距離較近的短句通過多輪融合,形成限定長度內(nèi)的小長句進行識別。
具體的合并邏輯是所有短句按照由短到長的優(yōu)先順序,每個短句左右擴張pad_len,若觸達另一短句則合二為一。以上邏輯重復(fù)多次,pad_len也慢慢增大。同時在合并過程中如果長度達到max_len則也不再擴張。
圖4 短句聚合邏輯
以上邏輯能在合理范圍內(nèi),把時間上靠近的短句集合合成一句長句,有利于在解碼時語言模型的信息獲取,使識別結(jié)果更加準確。
3.2
ASR模型及解碼參數(shù)優(yōu)化
在電視劇場景中使用ASR模型首先會碰到背景噪聲問題,我們在模型方面也做了微調(diào)使得ASR模型對噪聲更加魯棒。具體的做法是取部分訓(xùn)練數(shù)據(jù),在訓(xùn)練時原語音隨機添加上腳步聲、人群嘈雜聲、環(huán)境聲等噪聲數(shù)據(jù),利用這些數(shù)據(jù)對原始模型進行微調(diào),微調(diào)后字幕CER減少0.07%左右。
同時,我們在CTC解碼時使用上了4_gram語言模型,以下是一些字幕生成場景下ASR模型解碼參數(shù)調(diào)整經(jīng)驗:
1
電視劇涉獵較廣,如古裝電視劇常出現(xiàn)成語,商業(yè)電視劇常出現(xiàn)經(jīng)濟用語等,可根據(jù)實際需要針對性地增加4_gram語言模型的訓(xùn)練語料。
2
也可把上述4_gram語言模型換成bert或者加入bert,能提升一些識別正確率但是嚴重影響解碼速度,故工程上還是建議4_gram語言模型。
3
電視劇語氣詞較多,若要保留這些語氣詞,防止使用語言模型后語氣詞消失,需調(diào)高識別成空格的閾值,blank_skip_thresh可設(shè)為0.99。
4
與上同理,為保留更多語氣詞適當(dāng)增加WFST解碼時聲學(xué)模型的概率,acoustic_scale可設(shè)為2。
5
為讓熱詞發(fā)揮更好的效果,可適當(dāng)調(diào)大熱詞權(quán)重,context_score可設(shè)為10。
總的來說,在影視劇字幕生成領(lǐng)域中,我們發(fā)現(xiàn)長音頻切分的好壞對字幕結(jié)果起到了決定性作用。同時將wenet模型用于部署時可根據(jù)使用場景對模型或者解碼參數(shù)進行一些微調(diào),能在目標領(lǐng)域變得更加準確。通過以上改進再加上鏈路上的前后處理,我們測試集上平均字錯率由16.57%下降到12.11%。僅從識別準確度看,比當(dāng)前最好的商用軟件效果略好。
四
ASR部署
出于對推理速度的要求,一般需要將訓(xùn)練好的模型部署在GPU上使用, ASR模型輸入shape是動態(tài)變化的,為達到靜態(tài)化部署的目的,這里采用padding-分桶思路來支持動態(tài)輸入,本方案對其他編碼器_解碼器類生成式任務(wù)的靜態(tài)化部署都有借鑒意義。
在ASR中,輸入的語音長度是變化的,即編碼器的輸入輸出,CTC 解碼器的輸入輸出以及注意力解碼器的輸入輸出都是變化的,中間特征的長度會隨著輸入語音長度的變化而變化。
為固定輸入長度,我們將輸入語音pad到最長語音長度max_speech_len,之后用mask控制計算的范圍,同時使用注意力解碼器時也把歷史文字輸出pad到最長文字長度max_word_len,之后用valid_len來表示本次前向要生成的文字編號。具體來說,需要對編碼器編碼模塊和注意力解碼模塊做一定的調(diào)整。
實踐使用中,可以設(shè)置多個梯度max_speech_len,實際使用中按照輸入語音長度分桶,用對應(yīng)最大長度模型解碼。
4.1
encoder模塊部署
其中,encoder的具體模型結(jié)構(gòu)如下:
圖5 encoder部分細節(jié)結(jié)構(gòu)圖
其中token_num取決于輸入語音的長度,是可變的,為剔除動態(tài)性我們將該維度pad到最大,但是直接padding會影響softmax計算和conformer結(jié)構(gòu)里相對位置編碼以及depthwise卷積部分,為了消除對計算結(jié)果的影響,需要對模型結(jié)構(gòu)進行微調(diào)。
4.1.1
消除Padding對softmax計算的影響
圖6 encoder部分RelPositionAttention模塊前向圖
模型的輸入改為:
input_pad:pad后的input
mask:記錄了input_pad中有效的長度,其中mask的前valid_len個為1,后面為0
mask中包含有效長度信息后能去除掉計算中pad部分的影響。
4.1.2
消除Padding對rel_shift的影響
如上圖中所示,espnet工程中matrix_bd會先經(jīng)過rel_shift來達到把matrix_bd中絕對位置編碼改成相對位置編碼的目的,原代碼的實現(xiàn)方式為:
圖7 rel_shift 實現(xiàn)方式
來源:https://zhuanlan.zhihu.com/p/74485142
通過對矩陣的pad+reshape達到相對位置編碼的作用。
輸入作pad填充后token_emb后面為無效特征,再用pad+reshape方式rel_shift,會導(dǎo)致無效特征前移錯位。
我們這里先分別用gather操作得到左下角和右上角矩陣,再利用一個半角mask將兩個矩陣進行合并。最后對多余部分進行置0操作,得到和原rel_shift操作結(jié)果一致(只是做了pad)的結(jié)果。
圖8 輸入pad后復(fù)現(xiàn)rel_shift 方案
4.1.3
消除Padding對depthwise_conv的影響
圖9 輸入pad后復(fù)現(xiàn)rel_shift方案
conformer模塊中使用了分組卷積,前后分別進行pointwise conv和1D depthwise conv。由于token_num/4維度我們會pad到最大,此時由于depthwise conv kernel》1,會讓無效特征也參與計算干擾結(jié)果。
解決方案是在depthwise前加一步根據(jù)mask的歸0操作,把pad進去部分的特征都歸0。
4.2
Attention decoder模塊部署
圖10 encoder部分細節(jié)結(jié)構(gòu)圖
Attention decoder每次調(diào)用只生成一個字。其輸入是encoder output特征,我們記作memory,以及歷史生成的字x,輸出是語音的下一個字。生成一句N個字的句子需要調(diào)用Attention decoder N+1次,在遇到標簽或者達到最高字數(shù)時停止。
這里模型調(diào)用了6層decode layer,每層由一個self attention以及一個cross attention組成,為減少重復(fù)計算,會保存每次每層decoder layer的輸出(我們記作cache),在下一次計算時只計算每層最新的一個token結(jié)果然后和保存的concat,再輸往下一層,同時為下一次decoder保存當(dāng)前new_cache。
原始輸入為x,memory和cache。
要把Attention decoder改為固定長度輸入,需要做的修改如下:
1
self attention部分:x改為x_pad和x_q,這里x表示歷史的n無法根據(jù)index動態(tài)抽取,我們提前將最后一個token單獨提取出來作為外部傳入的輸入x_q,x_q為x_pad里有效的最后一個token,注意需手動加上對應(yīng)位置的position embedding。
2
cross attention部分:保持前面self attention的結(jié)果作為把原始的不定長的memory改為encoder output輸入的pad后memory,同時加上memory mask以指示有效長度,防止關(guān)注到pad的部分,用于cross attention部分。
3
self attention和cross attention組成一層完整的decoder層,在生成一層decoder輸出x_q后,在動態(tài)輸入操作中,需要把之前保存的該層輸出前面token結(jié)果concat到x_q上去,這也屬于動態(tài)維度的操作,部署中無法使用,而在我們靜態(tài)輸入中,則選擇where操作把x_q拷貝到pad后的state的第valid_len-1位置上去,故這里需要valid_len作為輸入來進行拷貝引導(dǎo),這里的valid_len是用于指示當(dāng)前共有幾個字,即我們關(guān)注的是第幾個token的輸出,在使用時每次調(diào)用valid_len加一。
4
取最后一層decoder的輸出的x_q,經(jīng)過一層softmax層得到最終的token概率分布。
修改后的輸入為x_pad,x_q,memory,memory_mask,cache和valid_len,
修改后的代碼流程如下:
圖11 attention decoder部分修改后示意圖
五
小結(jié)
以上介紹了語音識別技術(shù)的應(yīng)用場景,語音識別算法的原理、難點和解決方案,也介紹了我們在字幕生成場景中所做的實踐。微調(diào)開源模型加上細致的前后處理,在我們的測試集上能夠達到較好的可使用效果。未來ASR瓶頸更多的在于如何提升識別速度,以及在復(fù)雜場景下怎樣結(jié)合其他技術(shù)優(yōu)化ASR結(jié)果。
最后我們?yōu)锳SR在沐曦曦思N100人工智能推理GPU上做了較好的靜態(tài)部署,通過pad加mask的方案使動態(tài)輸入達成固定長度,為保持計算邏輯不變,我們也對模型編碼器和注意力解碼器部分做了許多調(diào)整,該解決方案可作為其他序列生成模型的靜態(tài)化部署參考。
-
算法
+關(guān)注
關(guān)注
23文章
4702瀏覽量
94941 -
ASR
+關(guān)注
關(guān)注
2文章
44瀏覽量
19054 -
模型
+關(guān)注
關(guān)注
1文章
3500瀏覽量
50114 -
傅里葉變換
+關(guān)注
關(guān)注
6文章
442瀏覽量
43052
原文標題:【智算芯聞】ASR算法實踐及部署方案
文章出處:【微信號:沐曦MetaX,微信公眾號:沐曦MetaX】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
最新一款LoRa 集成了單芯片SoC ASR6501/ASR6502
國內(nèi)全新LoRa系統(tǒng)芯片ASR6505 內(nèi)置SOC
ASR6501與SX1262優(yōu)勢區(qū)別
簡化針對云服務(wù)的語音檢測算法的部署
怎樣去驗證可部署目標硬件與軟件算法模型之間的算法性能一致性?
asr翱捷LORA系列芯片選型參考推薦ASR6601/asr6505/asr6501/asr6500
ASR控制系統(tǒng),ASR控制系統(tǒng)是什么意思
基于粒子群優(yōu)化PSO算法的部署策略
解決自動語音識別部署難題

評論