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


执行./silk/docoder后,返回:
/usr/local/ffmpeg/silk/silk$ ./decoder
Version:20160922 Build By kn007 (kn007.net)
Github: https://github.com/kn007/silk-v3-decoder
usage: ./decoder in.bit out.pcm [settings]
in.bit : Bitstream input to decoder
out.pcm : Speech output from decoder
settings:
-Fs_API : Sampling rate of output signal in Hz; default: 24000
-loss : Simulated packet loss percentage (0-100); default: 0
-quiet : Print out just some basic values
看返回信息没啥特别的。
@翔宇: 这么奇怪的。。
你把3ee158237c36d64b0eae25a49fa2577b.silk上传跟decoder在一起,
执行./decoder 3ee158237c36d64b0eae25a49fa2577b.silk 3ee158237c36d64b0eae25a49fa2577b.pcm
看下返回什么。
@kn007: 执行上面的命令行,返回结果:
********** Silk Decoder (Fixed Point) v 1.0.9.6 ********************
********** Compiled for 64 bit cpu *******************************
Input: 3ee158237c36d64b0eae25a49fa2577b.silk
Output: 3ee158237c36d64b0eae25a49fa2577b.pcm
Packets decoded: 272
Decoding Finished
File length: 5.440 s
Time for decoding: 0.009 s (0.165% of realtime)
生成了对应的pcm文件。
@kn007: 感谢博主的耐心答复,converter.sh生成的mp3文件是一定在converter.sh相同目录下吗?那这个有可能是权限的问题,我加了sudo执行命令后,返回的错误不一样了:-e [Warning] Convert ./3ee158237c36d64b0eae25a49fa2577b.silk false, maybe ffmpeg no format handler for mp3.
看提示是不支持mp3格式,我的ffmpeg是手工编译后安装的,编译时已经安装了libmp3lame
@翔宇: 或许脚本在调用的ffmpeg也没权限。。
sudo ffmpeg -y -f s16le -ar 24000 -ac 1 -i 3ee158237c36d64b0eae25a49fa2577b.pcm 3ee158237c36d64b0eae25a49fa2577b.mp3
你试试
@kn007: 直接用上面的命令会报找不到ffmpeg,如果明确ffmpeg的文件路径的话,sudo /usr/local/ffmpeg/bin/ffmpeg -y -f s16le -ar 24000 -ac 1 -i 3ee158237c36d64b0eae25a49fa2577b.pcm 3ee158237c36d64b0eae25a49fa2577b.mp3
可以生成mp3文件:
ffmpeg version 3.3.3 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.7 (Debian 4.7.2-5)
configuration: --prefix=/usr/local/ffmpeg --enable-libmp3lame --enable-nonfree
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
[s16le @ 0x2392420] Estimating duration from bitrate, this may be inaccurate
Guessed Channel Layout for Input Stream #0.0 : mono
Input #0, s16le, from '3ee158237c36d64b0eae25a49fa2577b.pcm':
Duration: 00:00:05.40, bitrate: 384 kb/s
Stream #0:0: Audio: pcm_s16le, 24000 Hz, mono, s16, 384 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (pcm_s16le (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, mp3, to '3ee158237c36d64b0eae25a49fa2577b.mp3':
Metadata:
TSSE : Lavf57.71.100
Stream #0:0: Audio: mp3 (libmp3lame), 24000 Hz, mono, s16p
Metadata:
encoder : Lavc57.89.100 libmp3lame
size= 22kB time=00:00:05.40 bitrate= 32.6kbits/s speed= 103x
video:0kB audio:21kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.087555%
是不是在使用脚本前,需要将ffmpeg先添加到path中?
@翔宇: 先
export PATH="/usr/local/ffmpeg/bin/:$PATH"
再执行我那个coverter脚本就行了。
你这属于环境问题,与我这边关系不大。
这属于你使用上的问题,你重新定义下全局变量声明就行了。
一劳永逸就是
ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg
以后执行就不怕了。
@kn007: 感谢博主,确实是环境问题。我将silk目录和converter.sh脚本都放到自己目录下测试,可以正常转化silk为mp3。之前放在了/usr/local目录下,权限问题导致文件生成失败。有个小建议,在converter.sh脚本中,增加几行对执行环境的预判断,如果环境有问题(比如找不到ffmpeg,或者当前目录无写权限),可以看到环境的出错信息。
@翔宇: 你好 我这项目 在命令行那里执行命令是可以转码成功的 但在php内调用时不成功,可能是权限问题,不知你是否是用php开发的?
您好,通过您的工具提示成功转换了mp3,文件也生成,但是大小为0,且无法播放,请问一下可能出现的问题在哪里吗?感谢您。
@superatc: https://github.com/kn007/silk-v3-decoder/issues/25
maybe ffmpeg no format handler for amr.
看了大神的资料,已经能把小程序语音转为wav了
怎么可以让ffmpeg支持amr mp3这些格式的转换呢
@test6688: 编译对应编码库,这种问题自己搜索一下好吧。
已经装了lame amrwb 这些,ffmpeg也已经重装编译安装了,为什么还提示
sh converter.sh DRm4Mm4JYN31D2v42L2lI2l44WmLq4.webm mp3
[Warning] Convert DRm4Mm4JYN31D2v42L2lI2l44WmLq4.webm false, maybe ffmpeg no format handler for mp3.
@test6688: PATH指定下ffmpeg位置
@test6688: 话说,你问的时候,不能查看下其他评论,做完排查再评论吗?你楼上那个人跟你这个相同问题。
看了,我的ffmpeg就是usr/local/bin下面
转换为wav是正常的,
]# sudo /usr/local/bin/ffmpeg -i /home/wwwroot/wyx/domain/we7/web/attachment/audios/52/2017/09/l2y2qxalyvY3YAXYECEE5a3qYY3UYY.webm 3ee158237c36d64b0eae25a49fa2577b.wav
ffmpeg version 3.3.3 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-18)
configuration:
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
[mp3 @ 0x2d23360] Format mp3 detected only with low score of 1, misdetection possible!
[mp3 @ 0x2d23360] Failed to read frame size: Could not seek to 11281.
/home/wwwroot/wyx/domain/we7/web/attachment/audios/52/2017/09/l2y2qxalyvY3YAXYECEE5a3qYY3UYY.silk: Invalid argument
@test6688: 从你发出来的cmd,没看出他成功转换了。
还请再指点一二
@test6688: 我不是老师。
命令行转码成功了~现在php运行时不成功,看来是权限问题,研究中,若有朋友一样是php项目的,可一起讨论下
楼主您好,我使用了您最新的代码去转换silk的文件,已查看确保文件是silk-v3格式,然后调用命令为:
sh /fulumbia/html/lpd/silkvsmp3/converter.sh /fulumbia/html/lpd/Uploads/2017-09-08/tmp_2da836922e83298c3072cd9f68e42dca.silk /fulumbia/html/lpd/Uploads/2017-09-08/tmp.mp3
结果返回的是:
[Warning] Convert /fulumbia/html/lpd/Uploads/2017-09-08/tmp_2da836922e83298c3072cd9f68e42dca.silk false, maybe ffmpeg no format handler2 for /fulumbia/html/lpd/Uploads/2017-09-08/tmp.mp3.
我添加测试后,发现执行的是您的代码中的
converter.sh 中的倒数第三行
[ ! -f "${1%.*}.$2" ]&&echo -e "${YELLOW}[Warning]${RESET} Convert $1 false, maybe ffmpeg no format handler for $2."&&exit
本人是Linux小白,所以楼主能否帮忙看看这个是什么原因
@理解万岁: 小白建议用:https://kn007.net/topics/batch-convert-silk-v3-audio-files-to-mp3-in-windows/
命令首先就错了,说明认真看一遍,谢谢。
正确应该是
sh /fulumbia/html/lpd/silkvsmp3/converter.sh /fulumbia/html/lpd/Uploads/2017-09-08/tmp_2da836922e83298c3072cd9f68e42dca.silk mp3
还有错误提示ffmpeg不支持这种格式转换,检查下ffmpeg的支持和是否存在。
@kn007: 您好,是说我现在在Linux上要装个ffmpeg对应的,转换成mp3的转换插件吗
@理解万岁: 感谢楼主,我把音频转换成acc格式,然后外部能识别
您好,博主.
请问我为什么第一次可以转换成功
========= Silk v3 Decoder Compile Finish =========
[OK] Convert /usr/video-convert-test/sample1.silk To /usr/video-convert-test/sample1.mp3 Finish.
第二次转换其他的silk v3编码的文件就会报这个错呢?
[root@iZ23goa9k2pZ 2017-09-08]# sh /usr/silk-v3-decoder-master/converter.sh /usr/video-convert-test/sample2.silk mp3
[Warning] Convert /usr/video-convert-test/sample2.silk false, maybe not a silk v3 encoded file.
即使是同一个文件之后再重新转换也是上面那个错
[root@iZ23goa9k2pZ video-convert-test]# sh /usr/silk-v3-decoder-master/converter.sh sample1.silk mp3
[Warning] Convert sample1.silk false, maybe not a silk v3 encoded file.
请博主看下这个问题如何解决,谢谢您
@被微信坑惨的一头猿兽: 没明白意思,一般是因为非Silk v3格式才会报这个错。
另外一种可能就是没权限。
@kn007: 博主,您好,感谢您的回复!
刚重新编译了下解码器,我是直接用的root登录的系统.并且给您项目的整个目录我给的755的权限.
之后在执行您的shell脚本进行测试时发现有些是可以转换成功,有些则是类似Convert sample1.silk false, maybe not a silk v3 encoded file.这个错.
提一下:这些silk文件都是微信小程序在同一天录音之后产生的文件,请问小程序录音的文件编码还会不同吗?
@被微信坑惨的一头猿兽: 肯定啊。小程序有silk,也有amr,还有webm
@kn007: 感谢您的答复,读出来的文件头几个字节,确实是既有!SILK_V3,又有data:audio/webm;base64开头的.只能暂时先读取头几个字节进行判断了....
最后祝您工作顺利,生活愉快!
@被微信坑惨的一头猿兽: 感谢你的祝福
kn007 博主好,这里有适用于伺服后台的 Node.JS 包装版本:
Github: https://github.com/Ang-YC/wx-voice
NPM: https://www.npmjs.com/package/wx-voice
可以给开发者使用,谢谢!
@AngYC: 你可以推荐给其他人。
@kn007: 明白,之前是看到有不少人要求,而且也基本考虑了 WebM 等等问题,可直接转换去 mp3 或 m4a 格式,也接受双向转换。
也许可以放个链接看是否能帮助有需要的开发者,同时也减少不支援的问题 =)