kn007的个人博客
♥ You are here: Home > 点滴记录 > 解码转换QQ微信的SILK v3编码音频为MP3或其他格式

解码转换QQ微信的SILK v3编码音频为MP3或其他格式

by | 468 Comments

提醒:本文最后更新于 1811 天前,文中所描述的信息可能已发生改变,请仔细核实。

skype-silk-v3

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或其他格式

donate
有所帮助?
Tags: , ,
Comments
468 Comments立即评论
  1. MOD回复

    win版本,可用: https://kn007.net/topics/batch-convert-audio-files-to-silk-v3-encode-under-windows/

  2. 回复

    大神求教,为什么我每会出现这个,我linux很菜求知道 :cry:
    [root@192 silk-v3-decoder]# sh converter.sh test.silk mp3
    : command not found12:
    : command not found19:
    : command not found22:
    converter.sh: line 77: syntax error: unexpected end of file
    [root@192 silk-v3-decoder]#

    1. MOD回复

      @一碗豆腐: 文件损坏,或者被混淆

    2. 回复

      @kn007: 是什么文件损坏了?我今天从git上down的最新的,先开始出现这个了,我以为是我gcc和ffmpeg有问题,我就都重装了,还是这样 :cry: :cry: :cry:

    3. 回复

      @kn007: 是因为我的silk文件有问题吗?老板让我做小程序的语音识别,用ffmpeg转换的wav根本就不能用,百度了半天发现你的这个可以实现,试了一下午了,老是报这个错,我很绝望,求指导 :cry: :cry: :cry:

    4. MOD回复

      @一碗豆腐: 对,指的就是音频源文件有问题。
      小程序语音并不一定是silk v3编码。即便是,也有可能混淆。

    5. 回复

      @kn007: 跪谢回复,听你这么一说,感觉小程序语音识别是个不能完成的任务了啊 :???:

    6. MOD回复

      @一碗豆腐: 以前是可以的。现在也不是不行,只是会有一些不行。
      据说腾讯不透露这块,所以暂时也没有什么办法。

    7. 回复

      @kn007: 我刚才用同一个silk文件试了一下windows版的转换可以成功,但是linux的就不行,会不会不是silk文件损坏的问题

    8. MOD回复

      @一碗豆腐: 如果你确定文件编码是silk v3,那就要考虑ffmpeg和gcc的问题了。
      如果不是的话,silk2mp3本身部分兼容小程序语音,可解不稀奇。

    9. 回复

      @kn007: 谢谢大神 :mrgreen:

    10. 回复

      @一碗豆腐: 你好,win里面怎么转换为pcm,cmd命令怎么写,这里全部都是linux的

    11. @一碗豆腐: 坑我帮你填了些,看我的这个博客吧:http://blog.csdn.net/happycxz/article/details/78016299

      你碰到什么具体问题,我帮kn007大神给你看下吧,正好这两天在做这个,说不定你碰到的问题我碰到过。 :grin:

    12. 回复

      @happycxz: 谢谢,我看下你的这个博客,有问题的话还请多多指教

    13. @一碗豆腐: 其实你把你的完整过程发到这里,有看明白的自然会回复你。就我看来,你发的那部分错误,应该是你的converter.sh这个脚本传到linux中可能变成了DOS换行符的文件了,所以脚本不对了,具体你可以vim打开它看看每行末尾是不是有多余的字符就知道了。至于怎么破,你自己搜下,每个linux发行版一般都有DOS转UNIX格式的工具。

    14. 回复

      @happycxz: nice,真的是这个问题,在你回复我的前两分钟,我尝试了下在linux直接down代码的方式,之前我是在windows down下来然后传上去的,现在没有那个错误了,我还奇怪是什么原因,你就发过来了 ;-)

  3. 首先感谢kn007大神的开源代码和脚本,我在您的基础上做了一个https的API接口,供微信小程序端调用以实现语音识别,不过目前仅对接了olami的语音识别,并且暂时仅支持silk v3,感兴趣的可以参照我的博客(http://blog.csdn.net/happycxz/article/details/78016299)里描述的API调用方式。另外还想继续把webm和其它微信小程序可能的格式都支持上。

    请问 data:audio/webm;base64, 开头的这种,怎么转成pcm或wav? 是要先对这种文件进行base64 decoder然后再调用ffmpeg吗? 恳请指点,对音频格式不熟,头一次见webm这种格式。 :cry:

    1. MOD回复

      @happycxz: 对的,是这样的,先base64 decode后,ffmpeg直接转。
      但小程序语音不是所以都支持转换,有一部分被混淆了。原理腾讯没有公开

    2. @kn007: 好的,谢谢大神,看来只能解决已知固定格式,被混淆的那种就无能为力了。 :grin:

    3. MOD回复

      @happycxz: 他是随机混淆,混淆的对象有webm也有silkv3。
      很迷。。不知为什么要混淆,混淆又不全混。

    4. @kn007: 特意来感谢一下大牛,今天顺便把webm/base64的给支持上了,微信小程序开发工具上录音好像都是这种,如果不支持这个,我这API基本没法在开发工具上DEBUG,今天总算搞定了,奖励自己晚上早点睡 …… :cry:

    5. MOD回复

      @happycxz: 客气了,有机会赞助一下,或者博客留下我的链接就好了。谢谢。

    6. @kn007: 没问题,我这个没有在商用,也是自己捣鼓着玩玩,我引用您的项目部分全都特意链上您的链接,现在网上一搜与此相关的议题,全都是您的silk_v3_decoder项目链接,哈哈 :idea:

  4. 回复

    大佬
    问一下,shell出现这玩意会是什么原因
    : command not foundverter.sh: line 12:
    : command not foundverter.sh: line 19:
    : command not foundverter.sh: line 22:
    silk-v3-decoder/converter.sh: line 77: syntax error: unexpected end of file

    1. MOD回复

      @gzp: https://kn007.net/topics/decoding-qq-wechat-silk-v3-encoded-audio-to-mp3-or-other-formats/comment-page-7/#comment-23371

      自己看一下,谢谢。
      win和unix编码和换行不同

  5. 回复

    @kn007 我们使用您的silk_V3模块做小程序语音转化,结果报内存错误,Gcc和ffmpeg版本:
    ffmpeg version 3.3.4 Copyright (c) 2000-2017 the FFmpeg developers built with gcc 6.1.0 (GCC)
    操作系统:Ubuntu 16.04.2 LTS 运行在阿里云服务器(2核4G)
    IOS通过小程序上传的语音ok,Android上传的语音在服务器端转化报下面的错误:
    root@iZbp10r9s4hc8skcvzqwooZ:/usr/local/application/apache-tomcat-8.0.36/bin# sh /usr/local/silk-v3/converter.sh /usr/local/application/apache-tomcat-8.0.36/webapps/jeesite-master/static/frontmedia/silk/2017/9/20/tmp_07ffb7241ed5923ad3c21ffb6dc77e735f103ab996b6913a.silk mp3
    *** buffer overflow detected ***: /usr/local/silk-v3/silk/decoder terminated
    ======= Backtrace: =========
    /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f3b6564e7e5]
    /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x7f3b656f011c]
    /lib/x86_64-linux-gnu/libc.so.6(+0x117120)[0x7f3b656ee120]
    /lib/x86_64-linux-gnu/libc.so.6(+0x116472)[0x7f3b656ed472]
    /usr/local/silk-v3/silk/decoder[0x400bb9]
    /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f3b655f7830]
    /usr/local/silk-v3/silk/decoder[0x401899]
    ======= Memory map: ========
    00400000-00418000 r-xp 00000000 fd:01 2633230 /usr/local/silk-v3/silk/decoder
    00617000-00618000 r--p 00017000 fd:01 2633230 /usr/local/silk-v3/silk/decoder
    00618000-00619000 rw-p 00018000 fd:01 2633230 /usr/local/silk-v3/silk/decoder
    016b2000-016d3000 rw-p 00000000 00:00 0 [heap]
    7f3b653c1000-7f3b653d7000 r-xp 00000000 fd:01 1835529 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f3b653d7000-7f3b655d6000 ---p 00016000 fd:01 1835529 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f3b655d6000-7f3b655d7000 rw-p 00015000 fd:01 1835529 /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f3b655d7000-7f3b65797000 r-xp 00000000 fd:01 1840930 /lib/x86_64-linux-gnu/libc-2.23.so
    7f3b65797000-7f3b65997000 ---p 001c0000 fd:01 1840930 /lib/x86_64-linux-gnu/libc-2.23.so
    7f3b65997000-7f3b6599b000 r--p 001c0000 fd:01 1840930 /lib/x86_64-linux-gnu/libc-2.23.so
    7f3b6599b000-7f3b6599d000 rw-p 001c4000 fd:01 1840930 /lib/x86_64-linux-gnu/libc-2.23.so
    7f3b6599d000-7f3b659a1000 rw-p 00000000 00:00 0
    7f3b659a1000-7f3b659c7000 r-xp 00000000 fd:01 1840908 /lib/x86_64-linux-gnu/ld-2.23.so
    7f3b65bb8000-7f3b65bbb000 rw-p 00000000 00:00 0
    7f3b65bc3000-7f3b65bc6000 rw-p 00000000 00:00 0
    7f3b65bc6000-7f3b65bc7000 r--p 00025000 fd:01 1840908 /lib/x86_64-linux-gnu/ld-2.23.so
    7f3b65bc7000-7f3b65bc8000 rw-p 00026000 fd:01 1840908 /lib/x86_64-linux-gnu/ld-2.23.so
    7f3b65bc8000-7f3b65bc9000 rw-p 00000000 00:00 0
    7fff3432d000-7fff3444e000 rw-p 00000000 00:00 0 [stack]
    7fff3457a000-7fff3457c000 r--p 00000000 00:00 0 [vvar]
    7fff3457c000-7fff3457e000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    -e [Warning] Convert /usr/local/application/apache-tomcat-8.0.36/webapps/jeesite-master/static/frontmedia/silk/2017/9/20/tmp_07ffb7241ed5923ad3c21ffb6dc77e735f103ab996b6913a.silk false, maybe not a silk v3 encoded file.
    还请大神指点一下,已发赞助

  6. 回复

    @kn007 Android上传的语音silk文件在windows下可以正常转化

    1. MOD回复

      @chyyf: 赞助收到,谢谢。
      据我所知,小程序语音有5种格式:
      silk v3、webm、amr、混淆过的silk v3,混淆过的webm。
      混淆的没法解现在,因为没摸清特性,腾讯也没公开。而silk v3 decoder这个项目只能接silk v3。silk2mp3属于衍生项目,所以都可解。
      想问下你这个源文件是什么格式的呢?(看文件头,后缀名无意义)
      按正常应该不会segfault啊,不能解码,会提示。你需要提供断点,我才能确定代码问题。
      webm的话,只要对源文件去html头,base64 decode,然后直接进ffmpeg解码即可。

    2. 回复

      @kn007: kn007,您好, 小程序android手机上传的silk语音文件用UE打开后,开头的内容:#!SILK_V3,将这个silk文件用您提供的windows工具转换MP3是可以播放的,另外,WEBM及base64这些判断都已经有相关代码处理。您方便的话,发个邮件给我,我把silk文件发给您,您帮忙定位一下,谢谢。
      我们在开发一款免费提供给养老院的管理及互动系统,老人端用的是微信公众号,院内工作人员用的是小程序,这个问题已经困扰我们两周,您的blog及相关回复的坑,我们基本已都踩过,怀疑是GCC版本、FFMPEG问题,都已升级到最新版,怀疑是内存问题,已将云服务扩容(原1核2G昨天才升级为2核4G,IOS的语音转换就是在1核2G状态下实现的),所以才发留言给您,帮忙定位一下问题,happycxz的共享包我们也测试了一下,还是不行

    3. MOD回复

      @chyyf: kn007@126.com

    4. MOD回复

      @chyyf: 另外程序本身跟系统性能没什么相关性。占用很小,除了ffmpeg占用大一点,基本还好。1核2g完全是够的。
      GCC最新版按道理也不应该有问题。ffmpeg不关事。

    5. @kn007: @chyyf @kn007 登chyyf服务器查了下,大概定位到chyyf碰到的decoder异常退出的原因, :grin: 特别过来记录一下,以免其他XDJM碰到相同问题,原因:
      silk decoder这个binary接受传入的第一个参数字符串不能太长。

      运行这个会报错:
      sh /usr/local/silk-v3/converter.sh /usr/local/application/apache-tomcat-8.0.36/webapps/jeesite-master/static/frontmedia/silk/2017/9/20/tmp_07ffb7241ed5923ad3c21ffb6dc77e735f103ab996b6913a.silk mp3

      重命名一下上述文件为123.silk后,运行这个就不报错:
      sh /usr/local/silk-v3/converter.sh /usr/local/application/apache-tomcat-8.0.36/webapps/jeesite-master/static/frontmedia/silk/2017/9/20/123.silk mp3

    6. MOD回复

      @happycxz: 哦,限制了长度150的。倒是没想到这个是因为过长。当时限制好像是因为有个长度限制

    7. MOD回复

      @happycxz: 想起来了,因为ffmpeg就限制150字符。。所以我再长意义也不大,所以我就限制在150了。如果想silk长点,改下源码就行了。。。但ffmpeg估计不会理你。。。

    8. @kn007: chyyf 用的目录层级太深了,而且他是客户端随机生成文件名(这是为何ios的正常,ios随机生成的文件名不是特别长,安卓的不正常是因为安卓的随机生成的文件名太长了,加上层级深,正好凑够150+字符),我用的时候是服务端统一重命名上传的SILK文件,而且目录层级也不深,所以没碰到他这个问题。 :smile:

    9. MOD回复

      @happycxz: 嗯,我的可以改。。。但ffmpeg估计不一定会改。因为这个涉及一些东西。

    10. @kn007: 其实可以改成打印一句LOG提示用户目录及文件名字符串不允许超过150字符。
      不需要放宽更长字符串,因为改成多少都是个限制,而且还影响ffmpeg调用。:)

    11. MOD回复

      @happycxz: 不错的建议,等下次有空再说了,最近身体不适。没时间没环境。

    12. @kn007: 好好休息,身体的BUG是优先级最高的!:)

    13. @chyyf: 兄弟,跟服务器配置关系应该不大的,你的是1核2G,升到2核4G,我的还是1核1G的呢,如果做业务缓存,内存会不够,我就把我的业务缓存给去掉了,连续运行三天了,虽然没有什么访问量,也没有你报的这种android录音不能解的问题。

      kn007大牛帮你看的同时,如果需要我跟你核对服务器编译运行环境,加我Q:404499164 ,我也是阿里云ubuntu16.04系统。

    14. MOD回复

      @chyyf: 使用gcc (GCC) 6.3.1 20170216 (Red Hat 6.3.1-3)未能复现问题,因为其他运行库也可能导致问题可能。
      鉴于我最近身体原因,可能无法及时帮到你。
      建议在linux类本地或线上其他环境,使用-static参数编译后,将文件拷贝到现有服务器使用。static参数编译出来的程序将不再考虑系统环境。
      你也可以下载,我编译好的: https://dl.kn007.net/directlink/silkv3-decoder_static.zip

    15. MOD回复

      @chyyf: 据happycxz 说是因为命令长度的问题。
      我确实设置单个传入参数长度不能超过150,因为ffmpeg也是这样设置,我的这个问题,很好解决,提高点长度就行了,但ffmpeg可能并不会为此而改变,请考虑减少目录层数和命名长度。

    16. MOD回复

      @chyyf: 一个建议就是程序上传文件,把文件名改成时间截,然后进行转换。可以解决你这个问题。
      我刚看了下,维持现有目录结构,最简便的方式,就是传入文件命名改为时间截。

    17. MOD回复

      @chyyf: 刚想到一个更简单的方式,不知可不可行,就是用软链接。 :???: 你可以自己回头试试

    18. 回复

      @kn007: 感谢kn007、happycxz两位大神,我犯了一个比较低级的错误,没想到缩短路径试试,我已测试,确实是silk文件路径过长,缩短之后,就ok了。

    19. MOD回复

      @chyyf: 解决就好。我也没想到,毕竟很少触发到这个规则。

  7. 哎呦我去?大神哎,赞一个,v2exer路过~github已star & fork 。 :smile:

    1. MOD回复

      @huixia0010: 欢迎V2EXer

  8. 回复

    ;-) 经过测试 步骤(PHP:分享了)1. 和007大神一样 先把 ffmpeg 安装好 2.安装https://github.com/kn007/silk-v3-decoder。3.微信的语音上传之后。把它存到本地 silk的一个文件。 重要步骤 重要步骤 重要步骤 说三遍(把他进行base64解码 解码 解码
    $content = file_get_contents('./Public/voice/' . $info['savename']);
    $data = explode(';', $content);
    $base64 = explode(',', $data[1]);
    file_put_contents('./Public/voice/qqqqqqqq.silk', base64_decode($base64[1]));

    解码之后再用
    sh convert.sh 33921FF3774A773BB193B6FD4AD7C33E.slk mp3

  9. 回复

    打赏!穷人!虽然识别不准 但是可以用户录音!!!!!! :razz:

    1. MOD回复

      @PHP-Li: 谢谢赞助,祝财源滚滚。

  10. LV1回复

    你好,遇到个问题,请教一下,我自己的服务器,已经成功使用了在线转换,现在在另一台服务费上使用时,却报错了,
    sh /usr/local/silkv3/converter.sh /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk wav

    Convert /home/web/hongbao/public_html/attachment/audios/2/2017/09/g8at6vgggVf6I8ng68z6VN5gGj8FN1.silk false, maybe not a silk v3 encoded file. 能否帮忙分析一下原因所在 这一台只安装了ffmpeg 3.3.3 和lame 其它的未安装 另外能否有偿指导一下

    1. MOD回复

      @小菜一枚: 是转换相同文件吗?

      检查不行的那台服务器,有没有GCC。

      博客有赞助页面,https://kn007.net/donate/

;-):|:x:twisted::smile::shock::sad::roll::razz::oops::o:mrgreen::lol::idea::grin::evil::cry::cool::arrow::???::?::!: