提醒:本文最后更新于 1811 天前,文中所描述的信息可能已发生改变,请仔细核实。
SILK v3编码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器,Skype后来将其开源。具体可见Wikipedia。
但是现在很难找齐源码,或者说懒得找。
一年前寻找的时候,很少看到。今年过年正好要转换QQ的语音信息(去年又是微信的语言信息),就找了下,顺便做成Shell脚本,具体可见Github项目地址:https://github.com/kn007/silk-v3-decoder。
需要gcc和ffmpeg。gcc是拿来编译silk v3 decoder源码,ffmpeg是拿来转换格式的。
调用很简单,只需一句命令:
sh convert.sh 33921FF3774A773BB193B6FD4AD7C33E.slk mp3
其中:“33921FF3774A773BB193B6FD4AD7C33E.slk”是你要转换的源文件(QQ常见为slk,微信常见为amr);后面的“mp3”是你要输出的格式。
首次使用会编译silk v3 decoder,第二次以后就不用了。
其他的没什么。略微改下,利用nginx+lua或直接用python都可以做成在线版本,暂时没什么时间,就先不搞了。反正本地能用就达到目的了。
注:如果你使用了该代码于商业目的,希望你能赞助我,谢谢!
彩蛋,33921FF3774A773BB193B6FD4AD7C33E.slk.mp3,调试时唱的歌(掩面,太难听。。。
那些忽悠帮你们写功能开发,然后不给钱的,已经好几起了。只想说这样搞,我是不会再更新了。
转载请注明转自: kn007的个人博客 的《解码转换QQ微信的SILK v3编码音频为MP3或其他格式》


非常感激大侠的分享,目前使用文件进行转码没有问题了!
但是我是希望在服务器端架设一个转码工具,然后调用语音API进行语音识别。最好的方式是,输入输出都是使用buffer数据,但我不知道怎么操作。我用的是nodejs,研究了半天子进程child_process.spawn,可以使用文件名进行转码,如:child_process.spawn('./silk/decoder', ['./0.silk', './newnew.pcm']);
但如何使用buffer数据,就不知道如何操作了? silk/decoder中,默认是文件名输入,是不是不支持buffer或者stream,如何进行修改呢?
@匡匡: 说实在的,我不大懂流这块,而且nodejs仅限简单的一些。。可能帮不到你。
你可以参考下源码,看下如何转成node版。
利用node直接读包,获取到的数据就是你所说buffer,然后看下识别API有无node版,进行识别。
但如果你只想达到功能性,就还是先利用node调用系统执行转换,然后node读取文件后,给API识别
你好,我linux下silk转wav可以转,转mp3提示Convert 2017061918495.silk false, maybe ffmpeg no format handler for mp3.不太懂这个,请问还需要怎么调整才能转成MP3

@ybblue: 英文不是很清楚么。。。你的ffmpeg不支持mp3转换,你更新个版本或者自己编译ffmpeg
@kn007:
解决了。少装了mp3转码的,谢谢大神
@ybblue: 你最后怎么转成功的,求教
你好,我linux下silk转wav可以转,转mp3提示Convert 2017061918495.silk false, maybe ffmpeg no format handler for mp3.。
我直接下载github的zip包,解压进服务器,然后调用相关命令
sh converter.sh 33921FF3774A773BB193B6FD4AD7C33E.slk mp3
@小程序开发: 要怎么安装ffmpeg??安装在哪
@小程序开发: 请自行搜索
@小程序开发: 。。。你这个昵称白取的吗?
@kn007: 玩攻击是吧 ??草泥马的
@小程序开发: 呵呵,你用别人的东西,这么不客气的?有种别用啊。
ffmpeg怎么装,每个系统都不一样,你啥都没说,你不会自己搜索一下吗?
难道要我全部帮你列出来?
@kn007: 你是狗吧,请教你,还嘲笑别人。
@小程序开发: 你一开发的,居然连搜索,连安装运行环境都不会,脾气还这么爆,动不动就口头攻击,恐怕连产品经理都不会这样。
我怎么嘲笑你了?
我只是觉得一开发的,居然不会自己搜一下,很无语。
倒是你这种,越是什么不会的,名头还大,脾气还差。走好不送。
@kn007: 老子就是经理以上,你BB什么,像你这种,就会嘲笑别人的狗
@小程序开发: 可以啊,经理亲自干活,还干成这逼样
@小程序开发: 你的词汇量真低,还有你这最多算保安经理,估计还排不上
@小程序开发: @小程序开发: 你是真的傻逼
@小程序开发: 还有一点请你注意,我并没有收你一分钱,也没求着你用我的东西。
回不回答是我的自由,而且你所说的嘲笑,也只是建立在你自己主观想法。
那么多人问我,你自己可以看看,我是不是都做了评论。
像你这种问题都不知道回答几次,你自己不查看以前的评论,不搜索,直接伸手要,还要怪别人不好好回答你?
程序与源码你爱用不用,反正我已经分享了。
你好,博主,我是用这个插件也一样提示 false, maybe ffmpeg no format handler for mp3.
ffmpeg是编译安装的,在任何目录都能 使用 ffmpeg -执行命令。
请帮忙解决一下,解决后回赞助的,谢谢
@涂夜: 你需要看看ffmpeg有没有mp3转换支持
@涂夜: 你的邮件收到了,我现在回去的路上,到时答复你
@kn007: 别信他
@小程序开发: 大哥,你是弱智吗?
at人都不会。。
人家会跟你一样不会明辨是非,跟个刚出来的似的?
我已经屏蔽你了,免得大家看到你,难受。
@小程序开发: 1
@涂夜: 看到了,你的ffmpeg是编译安装的,里面没有mp3模块(libmp3lame),CentOS7可以直接使用epel源通过yum install ffmpeg安装,无需编译,编译反而缺少很多组件(如果你没有配置进去的话),我给你看看我的ffmpeg:

@kn007: 谢谢
@涂夜: 不客气
@kn007: 博主,你好,使用这个插件能将小程序的silk格式转换成mp3,在网页播放没问题,但调用小程序的音频播放API,发现这个转换的mp3文件只能播放5秒,然后自动结束,播放网上的mp歌曲是没有问题的,转换后的mp3文件只能播放5秒钟
@涂夜: 这个我帮不了你,我不做小程序开发,你可以发个工单问问
大侠,您好,求救啊!一段amr格式的音频想转mp3,但妹子真心看不懂那些代码!谢谢帮忙!

@赵四喜: 你可以下载我的工具:https://kn007.net/topics/batch-convert-silk-v3-audio-files-to-mp3-in-windows/
windows下就可以转换,如果你想偷个懒并且信任我,可以将语音发送到kn007@126.com,转换后,我发回你。
你好,前几天一切都ok,今日上午突然无法转换来自小程序的语音文件,非silk,解base64.我用您的工具也试过,windows下那个,前几天都是ok的,现在可以convert但是0kb,您有空可以试试给一下反馈吗?
@rains: 我不开发小程序,所以没什么研究。
可以的话,你可以发个语音文件给我 kn007@126.com。我到时试一下。
不过说实在的,我可能不一定会再完善了,比较忙
@rains: 你可以先发过来看看,如果不复杂,好解决,我会帮忙
@kn007: 嗯,多谢,能够帮忙定位一下问题就最好了。
@rains: 好的,我回头帮你看下
@rains: 刚刚试了下,不能识别文件格式,我拿给chrome,也播放不出来,按道理webm,chrome是一定能播放的。
。
这个文件可能并非webm,但是识别不出来,我试了几种流媒体,都不行
你要不发个工单问问,
我今晚回到家再试试看其他办法能不能解。
@rains: 帮不上你,试了很多,都不行。
@kn007: 最新版的微信,小程序录音的文件silk,base64解密后的webm确实无法播放,莫非微信又做了什么手脚
源文件是这个:http://7sbmf5.com1.z0.glb.clouddn.com/tmp_54507975o6zAJs-QMdFxbFBoLOXFB5FbfzaY3fafbaa0e38bd15375044596825e71df.silk 麻烦大神有空看下
@eric: 之前也有人发过这种,但是我分析不出来,如果你愿意问下小程序官方最好了,如果能把结果告诉我就更好了。
@eric: 而且说实在的,这些文件无一例外都特别大。。。
@kn007: 早上发邮件给微信官方了,看能不能得到答复,如果能解决我把结果同步给你~
@eric: 好的,非常感谢
@kn007: 我也是遇到这个问题。
@eric: 那个小程序 silk转码 mp3的你弄出来了吗
@eric: hey,兄弟,官方有回复吗?
我看又有很多人在问,谢谢。
我用你的 converter_beta.sh 可以将微信小程序的转码成功,但是转码后全是噪音,该这么解决?
@阿亮: 小程序不是silk v3编码,是webm,肯定转不了。
你要转用silk2mp3
@kn007: 服务器是linux的,silk2MP3是 windows版本的,可以通过修改shell脚本支持小程序转码吗?看其他程序员的评论,base64解码,然后ffmpeg,好像也不行!!谢谢大神,回复!!
@阿亮: 可以啊,自己改一下就行了。
就是base64解码,然后用最新ffmpeg,或者最新webm库解码就行
@kn007: 我不怎么会写shell脚本,大神能帮忙修改下吗?
@阿亮: 没时间最近。不好意思
虽然看了很多,还是看不懂,却看到博主人很好,哈哈哈,欣赏你
@孙尐: 你整出来了吗?
我发现用这个encoder转换成mp3以后再用decoder转换此mp3得到的silk文件与源文件不同
这使得微信小程序无法播放该文件
已经在您的github留言,请问能否帮忙看下原因
@daisyli: 因为微信小程序更改过协议,而且小程序语音本身并非silk v3编码,我对小程序并无研究。
样本太少,而且它是非标文件,我分析不出。
如果知道加解密方式,我可以找时间帮忙看看。
@kn007: 我觉得特别奇怪的是,小程序的silk文件是可以转换到正常mp3的,所以我在想会不会是encode和decode过程中有某些不一致导致的。
如果有加密情况存在的话 那第一步silk->mp3就应该是不是会有问题。
您有什么推荐的方向吗?我可以自己再研究下
@daisyli: 推荐方向就是研究VP8/VP9 Codec、WebM Parser
@kn007: 此外 您的第三种encode方式是webm->base64->添加文件头的方式这个我理解,然而1、2种encoding方式的结果却和源文件不一致,能否告诉我一下您encode和decode中实际使用的命令?
@daisyli: 可以明确的说,silk v3编码的话,腾讯系与标准是有差异的。只不过他的协议很简单所以直接就可以转。你可以看下silk v3的源码,我已经公开了编解码方式。
现在小程序语音能解码,只是因为说你还比较幸运,因为现在小程序语音有两种不同编码方式,其中一种可以正常解码,另外一种不行。而编码小程序语音,现在则完全没有头绪。
可以问官方的事,麻烦你问下官方,问完你答复我一声也可以。
我本身不参与小程序开发,所以不大清楚。
博主你好,有个问题想请教下,我用你的windows版工具转换一个微信录音的silk文件,可以成功转成mp3格式,播放也没问题。但在linux下调用脚本转换同样的silk文件时,提示错误:-e [Warning] Convert ./3ee158237c36d64b0eae25a49fa2577b.silk false, maybe not a silk v3 encoded file.
这个错误让人不好理解,如果这个音频不是silk v3格式的文件,为什么在windows下可以转换成功呢?
@翔宇: 要看是什么类型的,小程序语音,微信收藏并不是silk v3编码。
win程序只是基于源码的扩展,并不是所谓silk v3 decoder的win版本,自然功能不一样。
@kn007: 感谢回复。之前看到windows版工具在转换非slik v3编码的文件时会有提示文件非silk v3编码。我在windows上转换时没看到这个提示,以为这个文件应该是silk v3编码。
这个文件是在微信上直接语音录入后,收藏到手机然后导出的文件。
打开这个文件,头部的内容是这样的:#!SILK_V3 ?t鳕領遴#pC ?t鳗湩⑥? ?t鳗? 博主有什么方法可以判断这个文件的格式么?我再试试。
@翔宇: 这个头,应该linux是可以正常转换的啊。你检查下是不是你linux环境的问题。
@翔宇: 补充信息:我的silk文件,头部是以 0x02开头,后面跟着#!SILK_V3,根据这篇帖子:http://bbs.iosre.com/t/topic/3199/9 这种格式的silk文件不是标准silk,按文章的说法,去掉这个字节后就是标准的silk格式文件。不过我用UE删掉这个字节后,在linux下继续尝试,发现还是提示文件不是silk v3编码。
@翔宇: 不用去掉,我写的C已经自动检测了。
@翔宇: 因为系统环境原因,也会报这个错。
@kn007: 好的。博主方便的话,我能否把原始silk文件发给你试试?如果在你这里能正常转换,那估计是我的环境问题,我后面重装ffmpeg试试。
@翔宇: 跟ffmpeg没关系,你看下gcc。
你执行./silk/docoder看下正不正常
@kn007: 我是这个地方出问题了,/slik/docoder没有执行权限
@翔宇: linux需要编译后才能正常使用,如果你系统环境编译不了,那就无法执行
@kn007: 在开始converter.sh脚本运行的时候,自动编译过silk解码器。编译完成没有报错。