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