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. 回复

    执行./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
    看返回信息没啥特别的。

    1. MOD回复

      @翔宇: 这么奇怪的。。
      你把3ee158237c36d64b0eae25a49fa2577b.silk上传跟decoder在一起,
      执行./decoder 3ee158237c36d64b0eae25a49fa2577b.silk 3ee158237c36d64b0eae25a49fa2577b.pcm
      看下返回什么。

    2. 回复

      @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文件。

    3. 回复

      @kn007: 感谢博主的耐心答复,converter.sh生成的mp3文件是一定在converter.sh相同目录下吗?那这个有可能是权限的问题,我加了sudo执行命令后,返回的错误不一样了:-e [Warning] Convert ./3ee158237c36d64b0eae25a49fa2577b.silk false, maybe ffmpeg no format handler for mp3.

      看提示是不支持mp3格式,我的ffmpeg是手工编译后安装的,编译时已经安装了libmp3lame

    4. MOD回复

      @翔宇: 或许脚本在调用的ffmpeg也没权限。。

      sudo ffmpeg -y -f s16le -ar 24000 -ac 1 -i 3ee158237c36d64b0eae25a49fa2577b.pcm 3ee158237c36d64b0eae25a49fa2577b.mp3
      你试试

    5. 回复

      @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中?

    6. MOD回复

      @翔宇: 先
      export PATH="/usr/local/ffmpeg/bin/:$PATH"
      再执行我那个coverter脚本就行了。
      你这属于环境问题,与我这边关系不大。
      这属于你使用上的问题,你重新定义下全局变量声明就行了。

      一劳永逸就是
      ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg

      以后执行就不怕了。

    7. 回复

      @kn007: 感谢博主,确实是环境问题。我将silk目录和converter.sh脚本都放到自己目录下测试,可以正常转化silk为mp3。之前放在了/usr/local目录下,权限问题导致文件生成失败。有个小建议,在converter.sh脚本中,增加几行对执行环境的预判断,如果环境有问题(比如找不到ffmpeg,或者当前目录无写权限),可以看到环境的出错信息。

    8. 回复

      @翔宇: 你好 我这项目 在命令行那里执行命令是可以转码成功的 但在php内调用时不成功,可能是权限问题,不知你是否是用php开发的?

  2. 回复

    您好,通过您的工具提示成功转换了mp3,文件也生成,但是大小为0,且无法播放,请问一下可能出现的问题在哪里吗?感谢您。

    1. MOD回复

      @superatc: https://github.com/kn007/silk-v3-decoder/issues/25

  3. LV1回复

    maybe ffmpeg no format handler for amr.
    看了大神的资料,已经能把小程序语音转为wav了
    怎么可以让ffmpeg支持amr mp3这些格式的转换呢

    1. MOD回复

      @test6688: 编译对应编码库,这种问题自己搜索一下好吧。

  4. LV1回复

    已经装了lame amrwb 这些,ffmpeg也已经重装编译安装了,为什么还提示
    sh converter.sh DRm4Mm4JYN31D2v42L2lI2l44WmLq4.webm mp3
    [Warning] Convert DRm4Mm4JYN31D2v42L2lI2l44WmLq4.webm false, maybe ffmpeg no format handler for mp3.

    1. MOD回复

      @test6688: PATH指定下ffmpeg位置

    2. MOD回复

      @test6688: 话说,你问的时候,不能查看下其他评论,做完排查再评论吗?你楼上那个人跟你这个相同问题。

  5. LV1回复

    看了,我的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

    1. MOD回复

      @test6688: 从你发出来的cmd,没看出他成功转换了。

  6. LV1回复

    还请再指点一二

    1. MOD回复

      @test6688: 我不是老师。

  7. 回复

    命令行转码成功了~现在php运行时不成功,看来是权限问题,研究中,若有朋友一样是php项目的,可一起讨论下

  8. 回复

    楼主您好,我使用了您最新的代码去转换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小白,所以楼主能否帮忙看看这个是什么原因

    1. MOD回复

      @理解万岁: 小白建议用: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的支持和是否存在。

    2. 回复

      @kn007: 您好,是说我现在在Linux上要装个ffmpeg对应的,转换成mp3的转换插件吗

    3. 回复

      @理解万岁: 感谢楼主,我把音频转换成acc格式,然后外部能识别

  9. 回复

    您好,博主.
    请问我为什么第一次可以转换成功
    ========= 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.

    请博主看下这个问题如何解决,谢谢您 :cry:

    1. MOD回复

      @被微信坑惨的一头猿兽: 没明白意思,一般是因为非Silk v3格式才会报这个错。
      另外一种可能就是没权限。

    2. 回复

      @kn007: 博主,您好,感谢您的回复!
      刚重新编译了下解码器,我是直接用的root登录的系统.并且给您项目的整个目录我给的755的权限.
      之后在执行您的shell脚本进行测试时发现有些是可以转换成功,有些则是类似Convert sample1.silk false, maybe not a silk v3 encoded file.这个错.
      提一下:这些silk文件都是微信小程序在同一天录音之后产生的文件,请问小程序录音的文件编码还会不同吗?

    3. MOD回复

      @被微信坑惨的一头猿兽: 肯定啊。小程序有silk,也有amr,还有webm

    4. 回复

      @kn007: 感谢您的答复,读出来的文件头几个字节,确实是既有!SILK_V3,又有data:audio/webm;base64开头的.只能暂时先读取头几个字节进行判断了....

      最后祝您工作顺利,生活愉快!

    5. MOD回复

      @被微信坑惨的一头猿兽: 感谢你的祝福

  10. 回复

    kn007 博主好,这里有适用于伺服后台的 Node.JS 包装版本:
    Github: https://github.com/Ang-YC/wx-voice
    NPM: https://www.npmjs.com/package/wx-voice
    可以给开发者使用,谢谢!

    1. MOD回复

      @AngYC: 你可以推荐给其他人。

    2. 回复

      @kn007: 明白,之前是看到有不少人要求,而且也基本考虑了 WebM 等等问题,可直接转换去 mp3 或 m4a 格式,也接受双向转换。

      也许可以放个链接看是否能帮助有需要的开发者,同时也减少不支援的问题 =)

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