音訊識別與大多數識別問題一樣,分為幾個步驟:1. 特徵提取2. 索引庫3. 搜尋與模糊匹配4. 識別結果的拼接特徵提取方面有很多演算法,基於FFT的頻域資訊是相對簡單的,值得深入研究。頻域訊號提取出來後,因為頻段太多,一般都會要做個歸併,合併成幾個大的頻段。比如Philips的演算法就是合併成32個頻段,我之前做的系統是合併成6個頻段,Shazam的是4個頻段。特徵的好壞直接影響了識別的效果,需要反覆最佳化。特徵提取出來後,就需要建立索引庫,存放所有的特徵,每個特徵都是要對應實際內容一部分的。實際情況往往索引庫會很大,所以通常不會用普通的關係式資料庫。我用過redis,以及python dict。因為查詢太過頻繁,儘量不要走網路。我之前做的一個系統,一個24小時的音訊,對資料庫的特徵查詢次數在幾十億到幾百億次。走網路是不可想象的。搜尋的過程則因為是多媒體資料而變得麻煩了許多。具體就是要設計模糊匹配方法。很多因素會導致提取的特徵與原特徵存在誤差,需要自己想辦法來降低誤差對結果的影響。比如說FFT切段的過程會引入高頻噪聲,50Hz的工頻也會引入噪聲,所以我一般取FFT頻段時是選擇64~3300Hz範圍內的。模糊匹配方面,就可以把特徵中每個值都做一下+/-1,然後生成一大堆的子特徵去索引庫裡查詢。如上的識別結果只是一些點,說明這個點匹配出了一些結果,往往結果還很多。此時還需要將點連成段才算是有意義的結果。比如你識別出來了3個字,中間的聽不清 "我?你" ,且索引庫裡已經包含句子 "我愛你" 。那麼就應該根據這些推斷出來有一定的機率結果就是跟索引庫裡的一樣。實際建立機率模型也是個巨麻煩的事情。中間跳過的未識別點數量也是經驗資料。比如我試過1/8秒一個點,跳過6個點就會產生大量誤識別了,但是跳過2個點就比不跳的識別率高很多。我在過去的2年多設計了一套音訊識別系統,包含如上的所有元件,用以識別電視節目中的廣告。執行高峰時期,索引庫裡有大約1000小時的音訊。識別正確率在95~98%之間晃動,誤識別在2~3%之間晃動。輸入24小時音訊的識別時間大約5~10分鐘。
音訊識別與大多數識別問題一樣,分為幾個步驟:1. 特徵提取2. 索引庫3. 搜尋與模糊匹配4. 識別結果的拼接特徵提取方面有很多演算法,基於FFT的頻域資訊是相對簡單的,值得深入研究。頻域訊號提取出來後,因為頻段太多,一般都會要做個歸併,合併成幾個大的頻段。比如Philips的演算法就是合併成32個頻段,我之前做的系統是合併成6個頻段,Shazam的是4個頻段。特徵的好壞直接影響了識別的效果,需要反覆最佳化。特徵提取出來後,就需要建立索引庫,存放所有的特徵,每個特徵都是要對應實際內容一部分的。實際情況往往索引庫會很大,所以通常不會用普通的關係式資料庫。我用過redis,以及python dict。因為查詢太過頻繁,儘量不要走網路。我之前做的一個系統,一個24小時的音訊,對資料庫的特徵查詢次數在幾十億到幾百億次。走網路是不可想象的。搜尋的過程則因為是多媒體資料而變得麻煩了許多。具體就是要設計模糊匹配方法。很多因素會導致提取的特徵與原特徵存在誤差,需要自己想辦法來降低誤差對結果的影響。比如說FFT切段的過程會引入高頻噪聲,50Hz的工頻也會引入噪聲,所以我一般取FFT頻段時是選擇64~3300Hz範圍內的。模糊匹配方面,就可以把特徵中每個值都做一下+/-1,然後生成一大堆的子特徵去索引庫裡查詢。如上的識別結果只是一些點,說明這個點匹配出了一些結果,往往結果還很多。此時還需要將點連成段才算是有意義的結果。比如你識別出來了3個字,中間的聽不清 "我?你" ,且索引庫裡已經包含句子 "我愛你" 。那麼就應該根據這些推斷出來有一定的機率結果就是跟索引庫裡的一樣。實際建立機率模型也是個巨麻煩的事情。中間跳過的未識別點數量也是經驗資料。比如我試過1/8秒一個點,跳過6個點就會產生大量誤識別了,但是跳過2個點就比不跳的識別率高很多。我在過去的2年多設計了一套音訊識別系統,包含如上的所有元件,用以識別電視節目中的廣告。執行高峰時期,索引庫裡有大約1000小時的音訊。識別正確率在95~98%之間晃動,誤識別在2~3%之間晃動。輸入24小時音訊的識別時間大約5~10分鐘。