微信语音文件的解析

微信语音文件的解析

前几天突发奇想,想把微信里的聊天记录导出来,就进去看了一下,其它都好说,唯独语音文件是个麻烦:aud格式不是常见的音频格式(它现在隶属于Skype),拿到电脑上无法直接播放。

还是转成mp3来听比较带劲。

很快就得到了来自snakeninny的帮助:iosre.com/t/topic/3199,他已经把aud的原理弄清楚了:

1、现在的aud文件本质上是silk格式,只需要去掉第1个字节,后面紧跟着的就是"#!SILK_V3";

2、此时使用silk-arm-ios内的命令行工具,可以将silk文件转换成pcm文件;

3、再将pcm转成wav。

很感谢他提前探清了路,不过对我来说还不是十分够用,因为我想要的是能够运行的代码,而不是各种工具组合的解决方案,并且我要的是mp3,这样才能在电脑及网页里播放。

那么只能歇息片刻继续前进。

各阶段的进展如下:

1、aud->silk

这一步很简单,把原来的aud文件的第1个字节去掉就可以;

2、silk->pcm


这一步使用的是silk-arm-ios,不过这一步相当不顺利。

原本silk-arm-ios的github地址上提供的代码可以build成命令行,也能集成进代码,但是它竟然不支持arm64。本来这也可以忍,大不了就只跑armv7好了,可是我把代码和WeChat打到一起,直接闪退,提示信息是_TEXT被侵占。


在网上一阵搜,竟然找到一个哥们在ios-pjsip里顺手把silk-arm-ios的arm64的makefile给写了,把.a拿下来直接就能用。虽然armv7还是不灵,但是arm64好使,这就足够了(大不了不支持旧设备),献上url:github.com/mrojas/ios-p

至此,silk-arm-ios代码集成完成,可以实现。


3、pcm->mp3

这一块得到了音频同事的帮助,集成了lame,顺利转换了mp3,相关的url可见blog.csdn.net/vieri_ch/

写代码把这几部分串起来一点都不难,挑了WeChat里最长的一个聊天记录,跑了一遍发现问题了:不是所有的aud文件都能转成mp3。


再考察一下文件的规律,转失败的都是早期文件,而最近这几年的aud文件都顺利转换了。把文件扒出来看了,有"#!SILK_V3"的确实能转换,而早期文件则没有类似的文件头。

但我想起以前的印象中,微信的语音是amr格式,这些早期文件是不是没有amr文件头的amr呢?加代码试一下就知道了。于是就有了:

4、aud->amr->wav

测试代码里只用了一个aud,强行加上"#!AMR\n",一运行就顺利转出wav(要再次感谢我的音频同事),真是不舍得让我再大费周章了。

然后把所有早期aud全跑一遍,竟然有失败的,打开它们一看,原来这部分文件已经有了"#!AMR\n"的metadata,好吧,做一下兼容。

最后把代码整理好,全部700多个aud文件全跑一遍,100%成功率,拿到电脑上一听,感觉还挺不错:)

整个折腾的过程得到了诸多帮助,最后顺利完成aud->mp3的转换,还是挺爽的。

编辑于 2016-07-29 16:59