第一步:采样
人的声音频率是有范围的,所以采样也应当选取范围。采样率是最低频率的2倍,此乃常识。至于最低频率怎样定,可以根据实际情况。
1、注意你的麦克风,有些麦克风是有接受范围的,把频率定得比麦克风的能力极限还低,显然是浪费。
2、用途。如果是要求可靠性很高的系统,则要注意加大频率范围。如果要求实时性比较高,那就要考虑处理机的速度了,数据量和频宽是正比的。
3、性别。男人的低音部分比女人更重要。所以如果对性别加以区分,那么在识别不同性别时应该采用不同下限。
4、特别指出,小心干扰。频率范围大了,噪音也就多。如果扩大的范围内噪音比较多,那还是不要的好。
第二步:语音处理
采样进入计算机后,成为一段段的数据,表明各个时刻的声音能量。处理时,第一步就是消除噪音,消不了这个东西,下面怎么都不好搞。可消除的主要是电器噪音,方法是完全静音时,录下电路信号,反相回到声音上去就成了。再下面就是断字了。人类语言是分音节的,音节之间是有一个停顿的,特别是汉语就更明显了。我主要讲的是汉语,在输入的数据中舍去能量低于一定值的部分,余下次的一段段的就对应各个字了。这需要解决两个问题,第一,舍去的标准,显然人说话声音有高有低,不能硬来。我的建议是取波形,不管说话声音高低,声音总是有形状的,不妨先取几个完整的波形,算出平均能量,取它的几分之一作为标准即可。而且这个过程似乎应该是动态的。第二是舍去一部分后,余下的部分可能不太整齐,由于噪音等原因,该舍的可能没舍,这就会有问题。解决这个问题大概可以在舍去时,不仅根据值的大小,还要根据两边的情况。这关系到舍去函数了,不是很难。断开各个字之后,就可以进行匹配了。原来的样本经过处理后,变成时间的函数,以时间为顺序取得一组值,成为N维向量。待处理的数据也同样进行,采用波形插值法从采样中取出N维向量,与样本进行匹配。 这关键是一个匹配函数的问题,即由两个向量在空间的相互位置得到一个匹配度,与样本依次比较,得出各自的匹配度。
由于各个样本都要匹配,所以速度很重要。通常的改进方法是进行多次匹配,即只把某些坐标进行对比,值大于某个标准才进行二次匹配。 这个标准可以是动态的,比如已进行过的对比的第M大的值。 为什么不到最大值,主要是需要保留多个结果。同时M可调,也便于在处理特殊情况时进行智能应变。匹配时,相应的计算函数相当重要,样本要相当的标准,同时以此样本为中心,扩张出多层区域,每层内的向量得到各层的匹配度,由此只要划定相应的匹配区域,给出值就可以了。
这里要多说一点,一般来说,匹配时都采用统一的函数,我却不这么认为,特别是汉语,语音的种类很少,不如将它们分组,每个组函数都不一样。也就是在匹配时,跟据要操作的目标,可以得到相应的匹配函数,进行匹配。 我觉得这要比用同一个匹配函数有效的多。而且,在调节对具体某个字的识别时,也很容易,同时在让它自动学习的时候,也很容易搞。你可以自己设计一个软件,把样本显示在二维坐标上(X:时间,Y:能量),输入一个声音时,把相应的量也显示在坐标系上。这是两条曲线。一方面,你可以反复地读样本,让软件把各条曲线求出来,然后取个中间值更新样本。另一方面,你也可以人脑辅助,根据自己反复读样本得出的曲线,对坐标空间进行分割,得出相应的匹配函数。也就是说,样本可以通过学习自动升级,匹配函数也可以由人脑加入进行升级。我认为这样会更高效一点。分组还有一个好处就是把相近的音归到一组,如果输入的数据和其中一个相差太远,其他的就可以跳过去了。这样可以提高速度。匹配这后,就把结果送入下一模块,其结果应该是这样:X:概率Xo,Y:概率Yo……如此等等,要送入概率最大的M个字,同时附上各字的概率。
第三步:上下文对照选定文字
这似乎和词库有关,所以词库的组织要好,词汇量要大,重要的一点是自己能够学习。出现新词要能记住,常用词要靠前,等等。这是微软的做法。微软采取的另一个方法是输入的词语先不交给应用程序,而是自己有一个缓冲区,输入的词语放在缓冲内,显示在屏幕上,这样一方面可以在输入下文后,依次修改上文,(交给应用程序后可就改不了。)另一方面也可以让用户通过手工操作对文字选择进行干预,从而提高效率。
学习一下
你有没有做出来相关的东西?
这是微软的做法
不错!虽然没看懂!
解决这个问题大概可以在舍去时
学习了,谢谢 分享
匹配函数
不错,将的很好,很详细
采样进入计算机后
加以区分