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


楼主好:我在linux上执行 sh converter.sh /data/www/shopping/public/upload/GoodsImage/149023591566776.silk mp3 命令 提示[Warning] Convert /data/www/shopping/public/upload/GoodsImage/149023591566776.silk false, maybe ffmpeg no format handler for mp3.
我在安装 ffmpeg时 安装了依赖包 并且反复安装了ffmpeg 编译安装和yum 安装都试过 不知道什么问题 请楼主大神帮忙指点下方向
@小黑: 你是编译安装?
编译安装,请指定好ffmpeg位置。
如果是linux的话,小程序传回来的文件虽然后缀是slik,但实际上是base64加密的文件。需要在后端先用base64解密,然后直接调用ffmpeg转成wav就可以了。
这是ffmpeg的command
ffmpeg -i 【解码后文件路径】 -ab 12.2k -ar 8000 -ac 1 【输出文件路径】
@zhxy0091: 嗯,有些又其他加密了,不知现在固定下来没
@zhxy0091: 请问base64解密的时候如何解密 直接对tmp的缓存文件进行解密吗?
@cc: 直接解密你获取到的语音文件,ffmpeg无需多余参数,直接输入输出就行了
@cc: 我是把tmp文件上传到后台服务器,然后在服务器上用php解密的。
function decode_base64_file( $inputfile, $outputfile ) {
/* read data (binary) */
$ifp = fopen( $inputfile, "rb" );
$rawData = fread( $ifp, filesize( $inputfile ) );
fclose( $ifp );
$data = explode(',', $rawData);
/* encode & write data (binary) */
$ifp = fopen( $outputfile, "wb" );
fwrite( $ifp, base64_decode($data[1]) );
fclose( $ifp );
/* return output filename */
return( $outputfile );
}
为什么在linux上使用脚本转化后的文件为0字节,在window上用exe转换的就可以用
@aerael: win转换后能播放吗?
linux用beta版试试
@kn007: beta版也是0字节,windows转换后是能播放的
@aerael: 检查下linux的ffmpeg。还有linux提示什么?
@kn007: 是不是因为我没下载其他库的原因,比方说faad2,liba52等等,我看网上ffmpeg安装好后还要安装很多对应的库,linux提示的是转换成功
@aerael: 那就是ffmpeg的问题
哥,silk转mp3成功后,音质很杂乱,这是为啥了
能在c#项目里面直接转换吗?
请问,在mac的系统下怎么把silk转换成mp3呢?
@gigi: 用终端啊。我不是分享了源码和脚本吗?可以用啊。
我用silk2mp3.exe可以对.silk文件进行转换,而且也可以转换成功,
请教一下如果用silk_v3_decoder.exe,在命令行下转换,转换可以成功,但是用播放器播放的时候,提示文件损坏,请教一下 在转换的时候需要加什么参数么?我的用法是 “silk_v3_decoder inputfile outputfile”
@anne: 转换后是pcm,最好再用ffmpeg转换为wav或mp3这种。
参数没问题
@kn007: 谢谢,按照您说的我测试了一下,没问题。
还有如果想从mp3转成silk文件格式,又该是什么样的过程呢?
是使用ffmpeg 将mp3转成pcm,再用encoder转成silk么?
@anne: 是的
@kn007: 麻烦能否告知
mmfpeg将mp3转换成的pcm的命令么?
@anne: 不在电脑旁。
跟pcm转mp3一样。
@kn007: 谢谢指导,
我使用如下命令
按照 ffmpeg –y –f s16le –ar 24000 –ac 1 –I test.mp3 test.pcm
运行结果提示 Unable to find a suitable output format for ‘test.pcm’ 这是怎么回事?是参数不对么?
谢谢
@anne: 已解决,谢谢,我的参数写的有问题
应该是 ffmpeg –y –i test.mp3 –f s16le –ar 24000 –ac 1 test.pcm
@anne: 嗯,解决就好
linux使用后silk转换mp3时出现报错请问是怎么回事, [33m[Warning][0;10m Convert /data/www/JianGuo/wx/g/20170605_JinTingZhuBoTP/uploads/audio/20170615091824_50ddead3d3de.silk false, maybe not a silk v3 encoded file."
@cc: 英文写的很清楚了,源文件不是Silk v3编码
@kn007: 难道小程序又重新编码了silk录音? ,那请问如何用ffmpeg把silk转为pcm呀 然后我在用pcm转换成mp3
@cc: 小程序早就不是了。
你不能在我站内搜索一下,或者看下我最新的文章吗?第二篇就说了这事。
@cc: 小程序直接base64解码后,ffmpeg转就行了
@kn007: 搞了快一天了 还是没做出来 , 您说的base64不是windows下把? 我这里是linux的环境, 一直不理解到底是在哪里base64_decode,
小程序录音上传后我后台用的是php $_FILES移动到当前目录后
$abc = base64_decode('0.silk');
ffmpeg 0.silk 0.pcm
是我太菜了各种方法都实验过了还是不行
@cc: 你这次回复的php错了,你之前php写的base64解密没问题。
这次回复的ffmpeg参数错了,你需要-i进啊,
建议你详细阅读每个软件的说明。
还有你既然选择linux,应该有学习和扩展能力。而不是抄。
我尝试把silk先base64_encode编码后重新base64_decode 但是无果报一样的错误 是我操作有误吗? 麻烦您了
@cc: 干嘛要编码后解码呢??直接解码啊
@kn007: 已经可以了,原因可能是第一次插件没有编译,之前的文件是从另一个服务器copy过来的,可能文件不全,重新安装后silk无需解码直接转为mp3好,感谢您的帮助
@cc: 不客气,不建议线上php用exec,容易被漏洞。
@cc: 兄弟,你是怎么弄出来的,silk转mp3
我真的是不太理解您说的解码 我把代码放上来您帮我看一下 我这样转的思路对吗 转出来的东西还是不能听
$base64_decode = file_put_contents('test.silk', base64_decode('/data/www/JianGuo/wx/g/20170605_JinTingZhuBoTP/uploads/audio/0.silk'));
$pcm = exec("ffmpeg -y -f s16le -ar 16000 -ac 1 -i /data/www/JianGuo/wx/g/20170605_JinTingZhuBoTP/uploads/audio/test.silk -f s16le 123.pcm 2>&1",$re1,$re2);
$mp3 = exec("ffmpeg -y -f s16le -ar 24000 -ac 1 -i /data/www/JianGuo/wx/g/20170605_JinTingZhuBoTP/uploads/audio/123.pcm 123.mp3 2>&1",$re1,$re2);