(深入篇)漫遊語音識別技術—帶你走進語音識別技術的世界

語言: CN / TW / HK

前有古人,後有小王,大家好,我是你們愛思考的小王學長,今天咱們繼續漫遊語音識別技術哈,今天內容稍微專業一些,大家可以結合 上一篇 漫遊語音識別技術一起學習。

上篇我們簡單瞭解了語音識別技術的概念、前世今生以及基本識別原理,一會學長帶著大家漫遊到語音識別技術更深(更專業)的世界裡。

文章目錄:(大家先預覽下)

一、語音識別基礎
二、訊號處理過程
    1、降噪處理 
        ①小波變換降噪法
        ②譜減法
        ③自適應噪聲抵消法
        ④聲音濾波器
    2、預加重
    3、分幀加窗
    4、端點檢測
三、特徵提取
四、語音識別方法
    1、聲學模型
    2、語言模型
    3、解碼器
    4、基於端到端的學習方法
五、深度學習-CNN實戰舉例
六、聲網 Agora 一站式智慧語音識別方案
七、語音識別開發平臺
    深度學習平臺
    語音識別開發平臺
八、語音識別相關開源學習資料
    開源資料集
    開源語音識別專案
作者介紹

一、語音識別基礎

​說到語音識別,我們應該先思考一下聲音是什麼呢?

​通常我們可以認為聲音是在空氣中傳播的波,但是它不像水波那樣傳播波的高低變化,它傳播的是空氣的密度變化。比如,我們拍手時手掌的振動將空氣擠出,對比周圍的大氣壓,空氣被擠入的地方壓力增高,而空氣被擠出的地方則相對壓力降低;壓力高的部分向手掌四周移動,而壓力低的部分則緊隨其後。這種由手掌振動所引發空氣密度發生週期性變化的波稱為壓縮波,空氣中的壓縮波一旦碰到鼓膜那樣的薄膜,就會使其產生振動。麥克風的作用就是將這種振動以電訊號的形式提取出來。下面的圖大家可以參考一下

幾種波形或疊加形式(點選圖片可見來源)

以振動的幅度為縱軸,以時間為橫軸,就能夠將聲音視覺化。

換句話說,聲音以波的形式傳播,即聲波。當我們以波的視角來理解聲音時,幅度(Magnitude)、頻率(Frequency)、相位(Phase)便構成了聲波及其所有的疊加聲波,聲音的不同音高(Pitch)、音量(Loudness)、音色(Timbre) 也由這些基本單位組合而來。

世界上各種各樣的聲波都可以“降解”到基本波身上,傅立葉變換(Fourier Transform)的基本思想也是這樣的。不同的聲波有不同的頻率和幅度(決定音量),人耳也有自己的接受範圍。人耳對頻率的接受範圍大致為 20 Hz 至 20 kHz,於是以人為本地將更高頻率的聲波定義為超聲波(Ultrasound Wave)、更低頻率的聲波定義為次聲波(Infrasound Wave), 雖然其它動物可以聽到不同範圍的聲音。

上一篇 大家應該對 ASR 有了個初步的瞭解,語音識別說白了最終是統計優化問題,給定輸入序列 O={O1,…,On},尋找最可能的詞序列 W={W1,…,Wm},其實就是尋找使得概率 P(W|O)最大的詞序列。用貝葉斯公式表示為:

其中 P(O|W)叫做聲學模型,描述的是給定詞 W 時聲學觀察為 O 的概率;P(W)叫做語言模型,負責計算某個詞序列的概率;P(O)是觀察序列的概率,是固定的,所以只看分母部分即可。

語音選擇的基本單位是幀(Frame),一幀資料是由一小段語音經過 ASR 前端的聲學特徵提取模組產生的,整段語音就可以整理為以幀為單位的向量組。每幀的維度固定不變,但跨度可調,以適應不同的文字單位,比如音素、字、詞、句子。

大多數語音識別的研究都是分別求取聲學和語言模型,並把很多精力放在聲學模型的改進上。但後來,基於深度學習和大資料的端到端(End-to-End)方法發展起來,能將聲學和語言模型融為一體,直接計算 P(W|O)。

二、訊號處理過程

1、降噪處理

在降噪之前,我先跟大家講講為什麼要進行降噪處理?

我們在錄製音訊資料的同時,大量噪聲都會摻雜進來,不同環境和情境下產生的噪聲也不盡相同,噪聲訊號中的無規則波紋資訊影響了聲學訊號所固有的聲學特性,使得待分析的聲音訊號質量下降,並且噪聲對聲音識別系統的識別結果會產生重要影響。所以說,我們在對聲音訊號分析和處理之前,是一定要進行降噪處理的。(語音的具體噪聲分類:看學長 這篇文章

下面我們來看幾個降噪的常用方法:

①小波變換降噪法

小波變換降噪法簡稱小波降噪,一般在聲音降噪中使用最多的是小波閾值降噪法,它主要是說在帶噪聲音訊號中,有效聲音訊號與噪聲在不同頻率上有著不同的小波係數,其中有效訊號能量譜表現會比較集中,在能量譜集中的區域小波係數的絕對值會比較大;而噪聲的能量譜比較分散,所以其係數的絕對值比較小。接下來,根據此特點,利用小波變換法將帶噪聲音訊號分解到不同頻率上,然後設定閾值進行差分調整,保留有效聲音訊號的小波係數,最後根據小波重構演算法還原帶噪訊號中的有效訊號,從而可以達到降噪的效果。

這是其基本原理,其中閾值的設定也可以分為硬閾值和軟閾值法。具體涉及的相關公式和計算方法大家感興趣的可以百度或者跟我留言。以下是利用小波降噪法得到的前後對比圖(在 MATLAB 環境下得到):

含噪聲訊號的波形

小波降噪後的波形

②譜減法

譜減法又稱頻譜減法降噪,是根據噪聲的可加性、區域性平穩性以及噪聲和有效聲音訊號不相關性的一種聲音訊號降噪方法。這種降噪方法不會涉及到參考訊號,其 主要思想 就是帶噪聲音訊號是有效訊號與噪聲的疊加,那麼帶噪訊號的功率也是相當於有效聲音訊號的功率和噪聲功率的疊加,利用計算得到“靜音”片段(訊號中不含有有效訊號,只含有系統噪聲或者環境噪聲)中噪聲的頻譜估計值來等值替換有效聲音訊號存在期間所含噪聲的頻譜,最後帶噪聲音訊號的頻譜與噪聲的頻譜估計值相減,就可以得到有效聲音訊號頻譜的估計值。

③自適應噪聲抵消法

自適應噪聲抵消法的核心組成部分是自適應演算法和自適應濾波器。自適應演算法可以自動調節輸入濾波器的加權係數使濾波器達到最優濾波效果,所以自適應噪聲抵消法的關鍵是在於找到某種演算法,可以實現自動調節加權係數。

自適應噪聲抵消法的主要思想是:除了帶噪聲音訊號 x(t)=s(t)+n(t),假設還可以得到另外一個參考訊號 r(t),而這個參考訊號與噪聲 n(t) 相關,但是與有效聲音訊號 s(t)不相關,那麼就可以根據 Widrow 演算法(一種近似最速下降的神經網路演算法)抵消帶噪聲訊號中的噪聲,從而達到降噪的效果。

④聲音濾波器

數字濾波器作為數字訊號處理中的重要組成部分,可以通過數值之間的運算來實現濾波的效果,去除噪聲成分。數字濾波器有很多種類,根據衝激響應函式的時域特性數字濾波器可分為兩種,即無限衝激響應(Infinite Impulse Response,IIR)濾波器和有限衝激響應(Finite Impulse Response,FIR)濾波器。這兩種濾波器可分別實現低通、高通、帶通和帶阻 4 種功能。

2、預加重

​預加重是一種在傳送端對輸入訊號高頻分量進行補償的訊號處理方式。隨著訊號速率的增加,訊號在傳輸過程中受損很大,為了在接收終端能得到比較好的訊號波形,就需要對受損的訊號進行補償,預加重技術的思想就是在傳輸線的始端增強訊號的高頻成分,以補償高頻分量在傳輸過程中的過大衰減。而預加重對噪聲並沒有影響,因此有效地提高了輸出信噪比。(百科官方解釋)

預加重原理 :語音訊號高頻段能量大,低頻段能量小。而鑑頻器輸出噪聲的功率譜密度隨頻率的平方而增加(低頻噪聲大,高頻噪聲小),造成訊號的低頻信噪比很大,而高頻信噪比明顯不足,從而導致高頻傳輸衰弱,使高頻傳輸困難。因此,在傳輸之前把訊號的高頻部分進行加重,然後接收端再去重,提高訊號傳輸質量。

3、分幀加窗

“分幀”是把一段聲音訊號分成一些時間長度相等的音訊訊號。它可以在預加重後的聲音訊號上平滑地移動規定長度的窗函式得到,窗函式的視窗大小由聲音訊號的取樣頻率來確定。採用可以隨著時間移動的窗函式對豬聲音訊號進行“交疊分幀”,可以防止在分幀時出現遺漏有效的聲音訊號,也可以保證每段聲音訊號在滑動時保持平穩性和連續性。

常用的幾種窗函式:冪窗、矩形窗、三角窗、漢寧窗、漢明窗、高斯窗(不懂的自行百度下或評論問我哈)

漢明窗舉例

4、端點檢測

端點檢測是指確定一段聲音訊號中有效訊號的起始點和終止點。採集到的聲音訊號中含有無效的聲音片段,進行端點檢測確定出豬聲音訊號的起始點與終止點,可以排除大量的干擾訊號,剪除靜音片段,為後續的特徵引數提取減小了運算量,縮短了提取時間。

matlab端點檢測對比

常用方法:

短時過零率是指每幀聲音訊號通過零點的次數,其演算法就是計算每幀聲音訊號幅值符號改變的總次數,如果相鄰取樣點的幅值符號是相同的,則沒有發生過零點的情況,相反,如果相鄰取樣點幅值的符號發生了改變,那麼表示聲音訊號發生了過零的情況。

短時能量一定程度上反應了聲音訊號的幅度變化,應用在區分聲音訊號中的清音和濁音,因為聲音訊號中清音的能量比濁音的能量小很多;區分無聲片段和有聲片段,因為無聲片段的短時能量基本等於零,而有聲片段是有能量存在的。

雙門限端點檢測法是常用的端點檢測方法之一,其通過聲音訊號的短時能量和短時平均過零率確定聲音訊號的端點位置,短時過零率檢測到聲音訊號的起始點和終止點可能過於寬泛,這樣就降低了聲音訊號處理系統的速度;而短時能量檢測到聲音訊號的起始點和終止點可能包含噪聲訊號,這樣會導致提取的聲音訊號不太準確。所以將二者***結合***起來來檢測豬聲音訊號的起始點和終止點,即雙門限檢測法提取聲音訊號的端點。

三、特徵提取

接下來帶大家詳細學習下 MFCC 特徵提取知識:

先說下 MFCC,人的耳朵在接收訊號的時候,不同的頻率會引起耳蝸不同部位的震動。耳蝸就像一個頻譜儀,自動在做特徵提取並進行語音訊號的處理。在語音識別領域中 MFCC(Mel Frequency Cepstral Coefficents)特徵提取是最常用的方法,具體來說,MFCC 特徵提取的步驟如下:

  • 對語音訊號進行分幀處理
  • 用週期圖(periodogram)法來進行功率譜(power spectrum)估計
  • 對功率譜用 Mel 濾波器組進行濾波,計算每個濾波器裡的能量
  • 對每個濾波器的能量取 log
  • 進行離散餘弦變換(DCT)變換
  • 保留 DCT 的第 2-13 個係數,去掉其它

其中,前面兩步是短時傅立葉變換,後面幾步主要涉及到梅爾頻譜。

基本流程圖

大家需要重要掌握的特徵提取知識點:

過零率(zero crossing rate)是一個訊號符號變化的比率,即在每幀中語音訊號從正變為負或從負變為正的次數。 這個特徵已在語音識別和音樂資訊檢索領域得到廣泛使用,通常對類似金屬、搖滾等高衝擊性的聲音的具有更高的價值。一般情況下,過零率越大,頻率近似越高。

頻譜質心(Spectral Centroid)是描述音色屬性的重要物理引數之一,是頻率成分的重心,是在一定頻率範圍內通過能量加權平均的頻率,其單位是 Hz。它是聲音訊號的頻率分佈和能量分佈的重要資訊。在主觀感知領域,譜質心描述了聲音的明亮度,具有陰暗、低沉品質的聲音傾向有較多低頻內容,譜質心相對較低,具有明亮、歡快品質的多數集中在高頻,譜質心相對較高。該引數常用於對樂器聲色的分析研究。

聲譜衰減(Spectral Roll-off)是對聲音訊號形狀(波形圖)的一種衡量,表示低於總頻譜能量的指定百分比的頻率。

梅爾頻率倒譜系數(Mel-frequency cepstral coefficients,MFCC)是在 Mel 標度頻率域提取出來的倒譜引數,Mel 標度描述了人耳頻率的非線性特性。其中梅爾尺度(Mel Scale)是建立從人類的聽覺感知的頻率;比如若把音調頻率從 1000Hz 提高到 2000Hz,我們的耳朵只能覺察到頻率似乎提高了一些而不是一倍。但是通過把頻率轉換成梅爾尺度,我們的特徵就能夠更好的匹配人類的聽覺感知效果。

色度頻率(Chroma Frequencies)色度頻率是音樂音訊有趣且強大的表示,其中整個頻譜被投影到 12 個區間,代表音樂八度音的 12 個不同的半音。

四、語音識別方法

在今天的主流語音識別系統中,聲學模型是一個混合(hybrid)模型,它包括用於序列跳轉的隱馬爾可夫模型(HMM)和根據當前幀來預測狀態的深度神經網路。

1、聲學模型

隱馬爾可夫模型(Hidden Markov Model,HMM)是用於建模離散時間序列的常見模型,它在語音識別中已經使用了幾十年了,算是很典型的聲學模型。

HMM 涉及的主要內容有:兩組序列(隱含狀態和觀測值),三種概率(初始狀態概率,狀態轉移概率,發射概率),和三個基本問題(產生觀測序列的概率計算,最佳隱含狀態序列的解碼,模型本身的訓練),以及這三個問題的常用演算法(前向或後向演算法,Viterbi 演算法,EM 演算法)。語音識別的最終應用對應的是解碼問題,而對語音識別系統的評估、使用也叫做解碼(Decoding)。

在研究 HMM 之前,先帶大家簡單的回顧一下馬爾科夫鏈。馬爾科夫鏈是建模隨機過程的一種方法,用天氣來舉個簡單點的例子就是,今天是否下雨和前一天是否下雨有關,有一種關聯的特點。放在語音識別裡就是,我們能知道語音的頻譜,但不知道之前的頻譜代表什麼意思的,就可以通過歷史的頻譜,來 推導 新的頻譜的對應結果。

高斯混合模型(GMM,Gaussian Mixed Model),主要就是通過 GMM 來求得某一音素的概率。

在語音識別中,HMM 用於建模 subword 級別(比如音素)的聲學建模。通常我們使用 3 個狀態的 HMM 來建模一個音素,它們分別表示音素的開始、中間和結束。

現在流行的語音系統不再使用 GMM 而是使用一個神經網路模型模型,它的輸入是當前幀的特徵向量(可能還要加上前後一些幀的特徵),輸出是每個音素的概率。比如我們有 50 個音素,每個音素有 3 個狀態,那麼神經網路的輸出是 50x3=150。這種聲學模型叫做”混合”系統或者成為 HMM-DNN 系統,這有別於之前的 HMM-GMM 模型,但是 HMM 模型目前還在被使用。

2、語言模型

語言模型要解決的問題是如何計算 P(W),常用的方法基於 n 元語法(n-gram Grammar)或 RNN。目前主要有 n-gram 語言模型和 RNN 語言模型。

n-gram 語言模型是典型的的自迴歸模型,而 RNN 語言模型因為當前的結果依賴於之前的資訊,所以可以使用單向迴圈神經網路進行建模,在這裡感興趣的自己再去學習下哈,內容實在太多了,學長挑重要的跟大家講。

3、解碼器

根據前面說的 P(W|O),我們的最終目的是選擇使得 P(W|O) = P(O|W)P(W) 最大的 W ,所以解碼本質上是一個搜尋問題,並可藉助加權有限狀態轉換器(Weighted Finite State Transducer,WFST) 統一進行最優路徑搜尋(先了解下)

4、基於端到端的學習方法

CTC (連線時序分類,Connectionist temporal classification),CTC 方法早在 2006 年就已提出並應用於語音識別,但真正大放異彩卻是在 2012 年之後,隨之各種 CTC 研究鋪展開來。CTC 僅僅只是一種損失函式,簡而言之,輸入是一個序列,輸出也是一個序列,該損失函式欲使得模型輸出的序列儘可能擬合目標序列。之前需要語音對齊到幀,用這個就可以不需要對齊,它只會關心預測輸出的序列是否和真實的序列是否接近(相同)。

Attention 模型看了很多概念還是覺得引用之前的例子最容易理解了:

當我們人在看一樣東西的時候,我們當前時刻關注的一定是我們當前正在看的這樣東西的某一地方,換句話說,當我們目光移到別處時,注意力隨著目光的移動也在轉移。 Attention 機制的實現是通過保留 LSTM 編碼器對輸入序列的中間輸出結果,然後訓練一個模型來對這些輸入進行選擇性的學習並且在模型輸出時將輸出序列與之進行關聯。

五、深度學習-CNN 實戰舉例

前面說了這麼多理論知識,現在用 Python 程式碼把 CNN 網路模型進行簡單講解(讓大家以例項來更加了解語音分類過程),同時推薦大家看下此 PPT (點選可檢視下載)實屬學習乾貨!!!

#搭建CNN模型
model = Sequential()

# 輸入的大小
input_dim = (16, 8, 1)

model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷積層
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷積層
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化層
model.add(Dropout(0.1))
model.add(Flatten()) # 展開
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 輸出層:20個units輸出20個類的概率

# 編譯模型,設定損失函式,優化方法以及評價標準
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

model.summary()

# 訓練模型
model.fit(X_train, Y_train, epochs = 20, batch_size = 15, validation_data = (X_test, Y_test))


# 預測測試集
def extract_features(test_dir, file_ext="*.wav"):
    feature = []
    for fn in tqdm(glob.glob(os.path.join(test_dir, file_ext))[:]): # 遍歷資料集的所有檔案
        X, sample_rate = librosa.load(fn,res_type='kaiser_fast')
        mels = np.mean(librosa.feature.melspectrogram(y=X,sr=sample_rate).T,axis=0) # 計算梅爾頻譜(mel spectrogram),並把它作為特徵
        feature.extend([mels])
    return feature
  X_test = extract_features('./test_a/')
  X_test = np.vstack(X_test)
predictions = model.predict(X_test.reshape(-1, 16, 8, 1))
preds = np.argmax(predictions, axis = 1)
preds = [label_dict_inv[x] for x in preds]

path = glob.glob('./test_a/*.wav')
result = pd.DataFrame({'name':path, 'label': preds})

result['name'] = result['name'].apply(lambda x: x.split('/')[-1])
result.to_csv('submit.csv',index=None)
!ls ./test_a/*.wav | wc -l
!wc -l submit.csv

六、聲網 Agora 一站式智慧語音識別方案

講完前面的語音識別必備知識,接下來咱們思考一下語音識別在語音聊天、音樂社交、影片直播,這些與“聲音”有關的社交場景中應用越來越廣的背景下,還會出現哪些問題呢,其中最突出的問題就是現有的語音內容稽核+實時音影片服務,部署、除錯、運維的成本高,而且很多方案對有背景音樂、噪聲的音訊識別效果差。

小王學長也是查看了許多應用解決方案,覺得聲網 Agora 一站式智慧語音識別方案是比較不錯的,推薦給大家。肯定會有人問為什麼你覺得好,好在哪裡?

先說說現有 傳統方案 ,簡單分為三步:

  1. 內容經過轉碼或直接推流至 CDN;

  2. 內容稽核廠商從 CDN 拉流,然後進行 AI 、人工內容稽核;

  3. 完成稽核後,傳回給伺服器端。

傳統的實時音影片內容稽核流程 (點選圖片可見來源)

存在問題:首先,開發者需要對接三個廠商,要進行很多次的部署與除錯,其中有很多除錯會產生成本與風險,並且,當 CDN 出現故障的時候,會耗費較長時間來排查問題,也需要支付額外的拉流成本。

另一方面,目前的方案還需解決噪聲的問題,例如語音社交、語音 FM 這些場景常常伴有背景音樂和環境噪聲,會影響現有內容稽核方案的識別率。

聲網現已提供業界 獨有 的一站式智慧語音識別方案:

開發者只需要在應用中整合聲網 Agora SDK,即可讓音訊在 Agora SD-RTN™ 網路中實時傳輸的過程中完成語音內容識別與稽核。並整合了業界 Top 3 語音識別服務,通過聲網獨家研發的 AI 音訊降噪引擎消除背景音,優化音訊質量,讓語音更加清晰。

聲網語音識別方案的 優勢

1、呼叫 RESTful API,一站式接入: 在應用中整合 Agora SDK 後,開發者可以通過呼叫 RESTful API,即可為自己的應用增加語音內容稽核服務。相比傳統內容稽核方案,聲網方案可以節省開發時間、伺服器等接入成本。

2、AI 降噪,識別率更高 : 利用聲網 AI 音訊降噪引擎對音訊進行優化,以提升語音的識別率。

3、語音互動低延時: 聲網 SDK 實現了全球端到端 76ms 的實時音影片低延時傳輸。聲網 Agora SD-RTN™ 實時通訊網路採用私有 UDP 協議進行傳輸,基於軟體定義優化路由選擇最優傳輸路徑,自動規避網路擁塞和骨幹網路故障帶來的影響。

所以說,看完聲網與傳統解決方案的優缺點對比是不是覺得聲網的一站式解決方案很香!!!

除此之外,再跟大家推薦一個好用的工具- 聲網 Agora 的工具水晶球

簡單說,水晶球是聲網 Agora 推出的 RTC 行業首個質量監控與資料分析工具,主要解決終端使用者的問題反饋鏈太長等問題。想深入瞭解的可以點選 這裡

特點:1.自建監控

​ 2.整合多種 RTC 監控工具

​ 3.使用同一 RTC 服務商所提供的質量調查工具

七、語音識別開發工具

深度學習平臺

小王學長用心總結(抓緊收藏)

語音識別開發工具

小王學長用心總結(抓緊收藏哈)

八、語音識別相關開源學習資料

開源資料集

開源語音識別專案

(小夥伴們看完記得點贊收藏下哈,小王學長希望能幫助到大家~)