音频识别算法思考与阶段性小结

2018-09-20 20:59:32 浏览数 (1)

这篇文章酝酿了很久,一直没抽时间写。

在中秋,国庆来临之时,落笔。

写之前,先交代几件事情,

主要是 回复 给我发邮件以及QQ上询问的朋友们的一些疑问和需求,这里稍作回复一下。

1.关于 票据ocr预处理算法 

相关算法细节已经开源。

项目地址:

https://github.com/cpuimage/OcrPreprocessing

各位可以根据CPUImageLocalColorFilter算法思路,对应项目需求进行算法改写定制算法实现。

主要是基于颜色过滤的思路,只要确认具体需求,

提供的算法,可以解决绝大多数关于颜色叠加,干扰移除的问题。

由于思路比较简单,这里就不展开,

需要的阅读相关代码,理解一下。

2.关于音频指纹算法实现,已经开源。

项目地址:

基础:

https://github.com/cpuimage/shazam

进阶:

https://github.com/cpuimage/AudioFingerprinter

音频指纹最重要的是时序信息,改进的思路和方向有很多,

例如提取更加鲁棒性的特征或者增加特征维度等。

对音频指纹,哼唱搜歌感兴趣的,可以参阅实现。

3.关于音频采样算法

相关项目:

简易实现,便携可采用:

目前有两种简单插值实现,平时基本够用。

https://github.com/cpuimage/resampler

如有更高要求的,可以采用:

https://github.com/cpuimage/speex_resampler

https://github.com/cpuimage/WebRTC_Resampler

如果不考虑性能问题,有特殊嗜好的,可以采用傅里叶变换的实现:

https://github.com/cpuimage/fftResample

https://github.com/cpuimage/stb_fft

4.关于音频降噪算法

降噪算法可参阅项目:

https://github.com/cpuimage/AudioDenoise

https://github.com/cpuimage/WebRTC_NS

https://github.com/cpuimage/rnnoise

由于有很多人询问rnnoise的训练方法和数据集。

算法实现细节见:

https://people.xiph.org/~jm/demo/rnnoise/

关于数据集问题,原作者已经开放下载了。

下载地址:

https://people.xiph.org/~jm/demo/rnnoise/rnnoise_contributions.tar.gz

关于rnnoise采样率适配和训练问题:

参阅项目:

https://github.com/GregorR/rnnoise-nu

https://github.com/GregorR/rnnoise-models

GregorR已经做了很多工作了,所以大多数问题,大家可以考虑联系他。

5.便携fft实现stb_fft开源,单头文件实现。

这个开源项目只是方便一些思路的验证和平时的测试使用。

不是性能最优实现,最优实现版本暂不开源。

项目地址:

https://github.com/cpuimage/stb_fft

差不多就这么多,

以上,若是有不理解的地方,可以给我发邮件或QQ联系。

回到主题上,本人最近一直在研究音频识别的一个小分支——性别判断。

简而言之就是通过声音分析,判断 说话者的性别。

听起来好像很简单,但是做起来,才知道,路上好多坑。

总的来说,想要精准识别声音的性别,如果没有干扰是很简单的事情,

但是,有了干扰之后的问题就复杂多了。

我们先考虑一下,声音信息可能受到什么因素的干扰。

1.外界干扰,主要是噪声

例如:多人交谈(等非主体的声音),软硬设备(网络,电压等抖动),背景环境(室内室外)

2.说话者生物干扰音素

例如: 语速,音量,音高,当然还有生物问题 既发声器官的状态(年龄,感冒发炎等)

3.文化因素,发音风格,饮食环境下的声喉状态

4. 以上1 2 3 等多重情况叠加下的混合干扰

从以上提及的各个音素来看,理想很丰满,现实很骨感。

不管是asr识别还是声纹识别,还是其他音频方向的算法处理,毫无疑问,困难重重。

花了近6个月,踩了无数个小坑之后,在不处理噪声的干扰情况下,

对中国人的普通话,音频性别识别终于达到85%的准确率。

由于是先验算法,纯c不采用任何第三方库的干净算法实现,

可以随时调参优化算法,适配不同的情况。

没有采用深度学习的方案去做特征工程。

这里要说一下,为什么不用深度学习的方法,

以及使用深度学习方法的一些思考。

首先,深度学习的数据集处理,就是一项体力活,

然后数据清洗,神经网络选型设计等等。

像我这样的懒人,真的不爱做体力活,我更喜欢思考。

在我看来,深度学习基于数据的特征工程,

最终会落到一个共同的话题,文化大一统。

也就是说,最后训练产出的有效特征,

也许更多的是基于数据的文化规律。

为什么这么说呢?

其实只要思考一个问题就可以了。

人的性别跟人说的话的内容多少长短,有没有直接关联。

我个人认为,并没有。

而深度学习大多数根据人说的话的内容(数据集),进行数据特征工程,

假设它有效,那它最终提取的有效特征是什么?

有可能是在一定数据长度下的文化特征。

通俗地讲,就是一个地区的一些人的文化风格或生活方式。

例如:

卧槽  -> 屌丝

靓女 -> 广东人

老司机 -> 你懂的

只是举个例子。

也就是说,如果采用深度学习去做声纹识别,

其实更像是定义 男士说话的内容风格 或 女士说话的内容风格。

当然这里只是通过性别识别这个维度去思考这个问题。

若把这个问题扩展到 asr 或者 声纹识别,也会有一定的关联。

在我看来,asr 通过语音转为文字,是的的确确在做信号转译。

但是 声纹识别就不应该是这个理。

当然音频指纹,哼唱搜索是另一个问题。

如果说 asr可以根据说话的内容来进行预测评估,自然是没问题的,

但是性别或者说声纹,就不能了。

你不能根据某个人说的某句话很像某个人的风格就说,他是某人吧。

这种问题,放到图像领域一样存在,

例如人脸识别,没有严格的生物信息,

怎么区分双胞胎或者其实目标的是活体非录像。

或者说根据某个人的声音来判断真伪,也可能是录音呢?

从逻辑上来说,这是不科学的,也是不合理的。

在我看来,深度学习用来做一些带有长度大小信息的数据的特征工程是可以的,

但是如果做一些文化规律的工程或者工作,就差强人意了。

说到这里,只能说,在一定的角度上作为辅助参考是可以的,

但是完全替代人类去做一些事情,为时过早。

除非,生物信息大跃进,更多生物信息数据维度参与进来。

一句话总结就是,能回答像不像,但不能确认是不是。

根据这个思考,

很多项目或者说工程化逻辑,

并不需要确认是不是,而只需要关注什么条件下触发异常反馈,

而后人工跟进,例如质检,自(fu)动(zhu)驾驶等。

由于音频性别识别目前还不能达到我自己预设的理想状态,暂时也没有开源计划。

个人目前的下一个研究方向,有可能是音频降噪这种叫人头大,扰人清梦的东西。

但有挑战,才有进步。

图像领域,两年前做完一键修图之后,就没有花心思继续研究了。

这个一键修图算法,也一直没抽时间去整理,

等哪天有时间再整理出来,释放demo给大家玩玩。

近期也看到不少人在研究诸如去雾,水下增强,去模糊之类的。

颇有感慨,不过图像方面,除非有灵感上脑,否则,暂时不去深入了。

当然,我会慢慢把之前做的一些图像算法,整理开源。

独乐乐不如众乐乐。

好基友 imageshop 已经做了很多工作了,

图像方面的算法,移步他的博客,你会有收获的。

回头得找个时间聚聚。

也许,在未来的一小段时间里,

俺还会在音频,视频,图像以及其他算法延伸方向做一些研究或者具有挑战性的工作。

国内的技术创新,确实比较落后,

特别是音频 自然语言 方向,需要一些有志之士一起努力。

最后为新人做点科普工作。

之于图像,必须要啃下:

模糊,卷积,颜色空间

之于音频,必须要啃下:

傅里叶变换,插值采样

算法性能优化可参阅:

计算机体系机构

http://www.ituring.com.cn/book/888

数值计算指南 

https://docs.oracle.com/cd/E57201_01/html/E57330/index.html

https://github.com/ARM-software/CMSIS_5

cpu指令集优化

https://www.agner.org/optimize/

后面若有精力再做一些与算法编码优化相关的分享。

最后简单做个本人简介:

前金山员工,前金山毒霸研发。

前百度员工,前百度杀毒研发。

89年生人,大专商务英语专业。

很多事情,在于你想不想做,其他的都是借口。

想到就去做,与之共勉。

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是:  gaozhihan@vip.qq.com

0 人点赞