提醒:本文最后更新于 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或其他格式》


检查了,安装了GCC 是相同的文件 在第一台服务器上 测试没有问题
[OK] Convert /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk To /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.wav Finish.
@小菜一枚: 直接
/usr/local/silkv3/silk/decoder /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.pcm
输出结果怎么样?
你在第二台机,也是git clone项目吗?还是从第一台机子复制过去的呢?最好在第二台机删除/usr/local/silkv3/,然后重新git clone。
[root@iZp7xdvev66p8eZ ~]# sudo /usr/local/silkv3/silk/decoder /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.pcm
********** Silk Decoder (Fixed Point) v 1.0.9.6 ********************
********** Compiled for 64 bit cpu *******************************
Input: /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk
Output: /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.pcm
Error: Wrong Header !AMR
#!
[root@iZp7xdvev66p8eZ ~]# sh /usr/local/silkv3/converter_beta.sh /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk wav
[OK] Convert /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk to /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.wav success, but not a silk v3 encoded file.
[root@iZp7xdvev66p8eZ ~]# sh /usr/local/silkv3/converter.sh /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk wav
[OK] Convert /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk to /usr/local/silkv3/g8at6vgggVf6I8ng68z6VN5gGj8FN1.wav success, but not a silk v3 encoded file.
@小菜一枚: 你确定你两台服务器转换相同的文件,都是使用converter.sh?而且没使用过converter_beta.sh?
错误原因很明显,源文件是非Silk v3编码文件,而是AMR的文件(起码头部是这样说的)
至于为什么converter_beta.sh后,converter.sh也可以了,那是因为结果文件存在了,converter.sh只是判断文件来提示。
你如果确定g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk是源文件的话,那第一台不可能能转换成功。注意:converter_beta.sh是会修改源文件,他会为源文件添加AMR头来强制转换。如果你不确信文件是无头AMR,那么就不要用converter_beta.sh。converter_beta.sh只是提供一种方法,而不是让你去使用。
@小菜一枚: 简单来说,新的服务器,请重新git clone。
待转换的文件,也最好是新的,最少也要保证源文件完整性。而且必须是silk v3编码的(不要通过后缀来看)。
没有把握,不要用converter_beta.sh,错误的选择,只会导致源文件破坏,转换出的文件无法播放或是杂音。
@小菜一枚: 回复评论,请点回复按钮。别那么随意,一直创建新的回复。谢谢。
@kn007: 不好意思,没注意,我在努力试试,谢谢指导
@小菜一枚: 客气了。明天公司开会,我先睡了。晚安。祝你好运。
@kn007: 最后一个问题,现在可以转换了,在命令行可以,但是通过php命令执行,却报错 0 => '[33m[Warning][0;10m Convert /home/web/hongbao/public_html/attachment/audios/2/2017/09/lhC6vyYIkvZ7FfvM2iTmOvVIO7W17w.silk false, maybe ffmpeg no format handler for wav.',
[root@iZp7xdvev66p8eZ ~]# sh /usr/local/silkv3/converter.sh /home/web/hongbao/public_html/attachment/audios/2/2017/09/lhC6vyYIkvZ7FfvM2iTmOvVIO7W17w.silk wav
[OK] Convert /home/web/hongbao/public_html/attachment/audios/2/2017/09/lhC6vyYIkvZ7FfvM2iTmOvVIO7W17w.silk To /home/web/hongbao/public_html/attachment/audios/2/2017/09/lhC6vyYIkvZ7FfvM2iTmOvVIO7W17w.wav Finish.
@小菜一枚: ...ffmpeg给php权限调用。或者把ffmpeg,授权给php,并且给777权限
不建议用php实现这个功能,小心被攻击。
@kn007: ffmpeg给php权限调用 这一步怎么做呢?
@小菜一枚: linux权限授权,你可以自己搜索。
还有ffmpeg用绝对路径。
@kn007: 老师,又遇到个问题,另一台服务器,php执行命令后,返回NULL,未能成功转换,命令行root转换没有问题
@小菜一枚: 检查一下权限问题,看下是不是php权限问题,还有写入目录也要记得授权。
@kn007: 1.写入目录权限排除:php可上传文件
2.converter.sh目录给了777
返回还是NULL
@小菜一枚: 这个你只能自己trace了,你自己加断点看返回。
@小菜一枚: 你解决了吗
您好我在服务器用sh执行转换就可以生成文件。在php中用exec执行却报错0;33m[Warning][0m Convert /home/wwwroot/xcx.sswan666.top/tp5/test.silk false, maybe not a silk v3 encoded file.
@legendnan: php调用权限问题,这种问题麻烦自己搜索一下
@legendnan: 商业目的,如果方便,请赞助一下,谢谢
@legendnan: 感谢赞助
大神微信小程序出来一个 语音识别体验 腾讯的!可以识别清楚!
@PHP-Li: 那挺好的啊。
我没这方面需求,所以不关注。
是腾讯官方的还是?
不知是不是用我的源码(笑。
@kn007: 属于体验版 体验版

@PHP-Li: 哦哦。
@PHP-Li: 在哪里看到小程序自己推出的语音识别
我用你的方法,成功将silk转换成pcm和mp3格式,播放也清楚,然后我将pcm运用到百度语音识别成文字,效果就不太好, 是怎么回事呢,用其他pcm识别就好使,但是这个用代码转的pcm就不行,但是mp3还清楚,怎么回事呢
@赵宏雷: 你要看百度支持的频率是多少。参数看程序自己调。
@kn007: 8000和16000两种 ,但是我生成pcm的时候,没有传递任何参数值的地方啊,是怎么写,我的代码是Utils.GetMapPath("../silk-v3-decoder-master/windows/silk_v3_decoder.exe") + " " + silkpath + " " + decoderpth;
@赵宏雷: -Fs_API 16000,在cmd下,自己看silk_v3_decoder.exe的参数。
如果代码是你自己写的,那肯定就会加。我做的默认是输出24000。自己通过参数改下。
@kn007: ../silk-v3-decoder-master/windows/silk_v3_decoder.exe这个后面怎么写,怎么赞助?
@赵宏雷: silk_v3_decoder.exe in.silk out.pcm -Fs_API 16000
赞助见这里: https://kn007.net/donate/
@kn007: 牛B,好使了
@赵宏雷: 另外商业目的,方便的话,请赞助,谢谢
@kn007: 赞助了8.8,别闲少,都打工的
@赵宏雷: 好使就行,兄弟。
赞助我不嫌少,感谢兄弟赞助!
已添加感谢列表: https://kn007.net/thank-you-list/
@kn007: 兄弟,我这识别成功了,但是用这个16000的pcm转mp3变声了,怎么回事
@赵宏雷: 因为所有软件统一标准都是24000,你改动后,ffmpeg你也要加参数,改变输入频率,这个你需要搜一下,我也忘记是哪个参数了
@kn007: 好的,谢谢你
@赵宏雷: https://github.com/kn007/silk-v3-decoder/blob/master/converter.sh
里有
ffmpeg -y -f s16le -ar 24000 -ac 1 -i in.pcm out.mp3
你直接改ar后的数就行了
很奇怪的事情, make encoder 不行,make 就行。什么原因?
@菜鸟刘: 不行是什么原因,你不说,我也猜不出
这个在window server 2003 r2 能用吗? 我在window10里就可以转码,同样的路径在window server 2003 r2 上却不可以,也不报错,但是就是没有文件生成,大神,求指教
@zjh: 权限,server给管理权限
sh converter_beta.sh audfile/wechat.aud mp3
-e \e[31;1m[Error]\e[0m Convert audfile/wechat.aud false, maybe ffmpeg no format handler for mp3.
微信Mac 版的语音文件转换错误
@KK: 你自己看下你mac有没有ffmpeg,或者脚本是否有权限调用ffmpeg,错误都在那里了。
@kn007: 应该是没ffmpeg
正式使用了,谢谢