声音识别系统是根据什么原理制成的?
音频识别与大多数识别问题一样,分为几个步骤:
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分钟。