空语音识别-无意义语音识别[纯代码实现]android、java

时间:2024-04-02 09:03:17

 

背景:博主在实际项目中遇到的一个问题,期望用户发出的语音是有内容的,这样就需要对语音是否为空(是否有意义)进行辨别。

常用方案:通过调用三方sdk进行语音内容识别,例如科大讯飞、百度AI等大厂产品。但这些产品都有一个通病,大体积的SDK,使用时需要联网、付费。针对这一轻量级的需求,这样的成本就略显得得不偿失了。

该文介绍的方案:通过对音频文件分析,使用java代码实现空语音辨别,准确率在97%以上,无需引用三方sdk,无需联网、无使用费用。

接下来博主就来描述下这个java代码怎么实现空语音识别(也不一定是java 代码什么语言都可以实现,不贴代码了主要说思路)。

移动端音频传输的常见格式mp3、amr、aac、pcm(对格式不了解的可自行百度)

社交类App发送语音通常选用amr格式进行传输(amr的优点自行百度,微信的语音采用的也是amr格式,同时也百度下pcm格式)

pcm是啥:https://blog.csdn.net/pds574834424/article/details/78174097

贴出一张pcm格式音频导出的波形图

空语音识别-无意义语音识别[纯代码实现]android、java

绿色的部分是说话展现的波形,蓝色部分是环境噪音,且称绿色部分为有内容片断,蓝色部分为无意义片断

观察这个波形图不难发现无意义片断的波动都在一个固定的范围内,我们称之为区间范围

试想,可不可以认为在一个语音中包含有内容片断的为有内容语音,不包含有内容片断的语音为空语音?博主认为可以这么判定,同样这也是前提。

现在的问题变成怎么样识别一个语音中包含有内容片断

波形图可以理解为散点图的连线,无意义片断的点都在区间范围内,有内容片断的点散布在区间范围内和外。

将问题再次简化,如果有区间范围外的点就可以认为是有内容语音,当然这只是概括,看上图第一块蓝色区域也有区间范围外的点,就不能单纯的用有或没有区间范围外的点来判定。

假设在一个音频中区间范围外的点的占有率为V, 可以抽象出公式为:

             V有内容片断/(无意义片断有内容片断)*100%

            等同于:   V区间范围外的点/(区间范围外的点+区间范围的点)*100%

从而推导出结果:当V大于某一特定值:有内容语音,当V小于某一特定值:无内容语音既空语音。

 

===分割线==至此空语音识别思路叙述完毕===

 

传输中的语音都是amr格式,这里选用pcm文件格式的数据进行分析,那么amr怎么转pcm?

这里给出两种转码方案:

   1.FFmpeg,https://blog.csdn.net/weixin_38372482/article/details/79703703

   2.MediaCodec, https://developer.android.com/reference/android/media/MediaCodec