这篇文章酝酿了很久,一直没抽时间写。
在中秋,国庆来临之时,落笔。
写之前,先交代几件事情,
主要是 回复 给我发邮件以及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不采用任何第三方库的干净算法实现,
可以随时调参优化算法,适配不同的情况。
没有采用深度学习的方案去做特征工程。
这里要说一下,为什么不用深度学习的方法,
