前言
如果想要容易理解核心的特征計算的話建議先去看看我之前的聽歌識曲的文章,傳送門://www.jb51.net/article/97305.htm
本文主要是實現了一個簡單的命令詞識別程序,算法核心一是提取音頻特征,二是用DTW算法進行匹配。當然,這樣的代碼肯定不能用于商業化,大家做出來玩玩娛樂一下還是不錯的。
設計思路
就算是個小東西,我們也要先明確思路再做。音頻識別,困難不小,其中提取特征的難度在我聽歌識曲那篇文章里能看得出來。而語音識別難度更大,因為音樂總是固定的,而人類說話常常是變化的。比如說一個“芝麻開門”,有的人就會說成“芝麻開門”,有的人會說成“芝麻開門”。而且在錄音時說話的時間也不一樣,可能很緊迫的一開始錄音就說話了,也可能不緊不慢的快要錄音結束了才把這四個字說出來。這樣難度就大了。
算法流程:
特征提取
和之前的聽歌識曲一樣,同樣是將一秒鐘分成40塊,對每一塊進行傅里葉變換,然后取模長。只是這不像之前聽歌識曲中進一步進行提取峰值,而是直接當做特征值。
看不懂我在說什么的朋友可以看看下面的源代碼,或者看聽歌識曲那篇文章。
DTW算法
DTW,Dynamic Time Warping,動態時間歸整。算法解決的問題是將不同發音長短和位置進行最適合的匹配。
算法輸入兩組音頻的特征向量: A:[fp1,fp2,fp3,......,fpM1] B:[fp1,fp2,fp3,fp4,.....fpM2]
A組共有M1個特征,B組共有M2個音頻。每個特征向量中的元素就是之前我們將每秒切成40塊之后FFT求模長的向量。計算每對fp之間的代價采用的是歐氏距離。
設D(fpa,fpb)為兩個特征的距離代價。
那么我們可以畫出下面這樣的圖
我們需要從(1,1)點走到(M1,M2)點,這會有很多種走法,而每種走法就是一種兩個音頻位置匹配的方式。但我們的目標是走的總過程中代價最小,這樣可以保證這種對齊方式是使我們得到最接近的對齊方式。
我們這樣走:首先兩個坐標軸上的各個點都是可以直接計算累加代價和求出的。然后對于中間的點來說D(i,j) = Min{D(i-1,j)+D(fpi,fpj) , D(i,j-1)+D(fpi,fpj) , D(i-1,j-1) + 2 * D(fpi,fpj)}
為什么由(i-1,j-1)直接走到(i,j)這個點需要加上兩倍的代價呢?因為別人走正方形的兩個直角邊,它走的是正方形的對角線啊
按照這個原理選擇,一直算到D(M1,M2),這就是兩個音頻的距離。
新聞熱點
疑難解答