本文档基于 kn007 的 silk-v3-decoder 项目,介绍如何在 Linux 下编译和使用 SILK v3 解码器和编码器。
SILK v3 编码是 Skype 向第三方开发人员和硬件制造商提供的免版税认证(RF)的 Silk 宽带音频编码器。QQ 和微信的语音消息通常使用此编码格式:
- QQ 语音文件:常见扩展名为
.slk - 微信语音文件:常见扩展名为
.amr(实际上是 SILK v3 编码,而非真正的 AMR)
GitHub 项目地址:https://github.com/kn007/silk-v3-decoder
在 Linux 下使用该项目需要安装以下依赖:
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y gcc make ffmpeg
# CentOS/RHEL 7+
sudo yum install -y epel-release
sudo yum install -y gcc make ffmpeg
# CentOS/RHEL 8+ 或 Fedora
sudo dnf install -y gcc make ffmpeg注意事项:
gcc用于编译 SILK v3 decoder/encoder 源码ffmpeg用于将 PCM 格式转换为 MP3、WAV 等常见格式- 确保 ffmpeg 安装了
libmp3lame支持(用于 MP3 编码)
ffmpeg -encoders | grep mp3如果没有输出,需要重新编译或安装带有 --enable-libmp3lame 选项的 ffmpeg。
git clone https://github.com/kn007/silk-v3-decoder.git
cd silk-v3-decodercd silk
make decoder编译成功后会在 silk/ 目录下生成 decoder 可执行文件。
cd silk
make encoder编译成功后会在 silk/ 目录下生成 encoder 可执行文件。
cd silk
make项目提供了便捷的 Shell 脚本 converter.sh,可以一键完成 SILK 到目标格式的转换。
基本用法:
sh converter.sh <输入文件> <输出格式>示例:
# 将 SILK 文件转换为 MP3
sh converter.sh voice.silk mp3
# 将 SILK 文件转换为 WAV
sh converter.sh voice.silk wav
# 转换 QQ 的 .slk 文件
sh converter.sh 33921FF3774A773BB193B6FD4AD7C33E.slk mp3
# 转换微信的 .amr 文件(实际是 SILK v3 编码)
sh converter.sh voice.amr mp3说明:
- 首次运行会自动编译 decoder,之后无需重复编译
- 输出文件会保存在输入文件相同目录下,文件名为
原文件名.输出格式
./silk/decoder <输入文件.silk> <输出文件.pcm> [参数]| 参数 | 说明 | 默认值 |
|---|---|---|
-Fs_API <采样率> |
输出信号的采样率 (Hz) | 24000 |
-loss <百分比> |
模拟丢包率 (0-100) | 0 |
-quiet |
仅输出基本信息 | - |
步骤 1:SILK 转 PCM
./silk/decoder input.silk output.pcm步骤 2:PCM 转 MP3/WAV
# PCM 转 MP3
ffmpeg -y -f s16le -ar 24000 -ac 1 -i output.pcm output.mp3
# PCM 转 WAV
ffmpeg -y -f s16le -ar 24000 -ac 1 -i output.pcm output.wav| 参数 | 说明 |
|---|---|
-y |
覆盖已存在的输出文件 |
-f s16le |
指定输入格式为 16-bit 有符号小端 PCM |
-ar 24000 |
采样率 24000 Hz |
-ac 1 |
单声道 |
-i |
输入文件 |
./silk/encoder <输入文件.pcm> <输出文件.silk> [参数]| 参数 | 说明 | 默认值 |
|---|---|---|
-Fs_API <采样率> |
API 采样率 (Hz) | 24000 |
-Fs_maxInternal <采样率> |
最大内部采样率 (Hz) | 24000 |
-packetlength <毫秒> |
数据包长度 (ms) | 20 |
-rate <比特率> |
目标比特率 (bps) | 25000 |
-loss <百分比> |
预期丢包率 (0-100) | 0 |
-complexity <级别> |
编码复杂度 (0-2) | 2 |
-inbandFEC <0/1> |
启用带内 FEC | 0 |
-DTX <0/1> |
启用 DTX | 0 |
-quiet |
仅输出基本信息 | - |
-tencent |
添加腾讯系 SILK 文件头 | - |
步骤 1:MP3/WAV 转 PCM
# MP3 转 PCM
ffmpeg -y -i input.mp3 -f s16le -ar 24000 -ac 1 output.pcm
# WAV 转 PCM
ffmpeg -y -i input.wav -f s16le -ar 24000 -ac 1 output.pcm步骤 2:PCM 转 SILK
# 标准 SILK 编码
./silk/encoder input.pcm output.silk
# 生成兼容腾讯系(QQ/微信)的 SILK 文件
./silk/encoder input.pcm output.silk -tencent
# 指定比特率
./silk/encoder input.pcm output.silk -rate 25000 -tencent# 方法一:使用脚本
sh converter.sh wechat_voice.amr mp3
# 方法二:手动转换
./silk/decoder wechat_voice.amr wechat_voice.pcm
ffmpeg -y -f s16le -ar 24000 -ac 1 -i wechat_voice.pcm wechat_voice.mp3# 方法一:使用脚本
sh converter.sh qq_voice.slk wav
# 方法二:手动转换
./silk/decoder qq_voice.slk qq_voice.pcm
ffmpeg -y -f s16le -ar 24000 -ac 1 -i qq_voice.pcm qq_voice.wav# 先将 MP3 转为 PCM
ffmpeg -y -i music.mp3 -f s16le -ar 24000 -ac 1 music.pcm
# 再将 PCM 转为 SILK(添加腾讯文件头)
./silk/encoder music.pcm music.silk -tencent# 先将 WAV 转为 PCM
ffmpeg -y -i audio.wav -f s16le -ar 24000 -ac 1 audio.pcm
# 再将 PCM 转为 SILK
./silk/encoder audio.pcm audio.silk -tencent原因: 输入文件不是 SILK v3 编码格式。
解决方案:
- 检查文件是否为真正的 SILK v3 格式
- 微信小程序的录音可能是 WebM 或其他格式,需要 base64 解码后直接使用 ffmpeg 转换
原因: ffmpeg 未安装 MP3 编码支持。
解决方案:
# 检查 ffmpeg 是否支持 MP3
ffmpeg -encoders | grep mp3
# 如果不支持,安装完整版 ffmpeg
# Ubuntu/Debian
sudo apt-get install -y ffmpeg
# CentOS 7+ (使用 EPEL)
sudo yum install -y epel-release
sudo yum install -y ffmpeg原因: 采样率设置不正确。
解决方案: 确保 ffmpeg 命令中的采样率 -ar 参数设置为 24000。
解决方案:
# 检查 ffmpeg 路径
which ffmpeg
# 如果安装在非标准路径,添加到 PATH
export PATH="/usr/local/ffmpeg/bin:$PATH"
# 或创建软链接
sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg解决方案:
# 给 decoder 和 encoder 添加执行权限
chmod +x silk/decoder
chmod +x silk/encoder
# 确保脚本有执行权限
chmod +x converter.sh说明: 微信小程序的录音格式可能不是 SILK v3,而是 base64 编码的 WebM 格式。
解决方案:
# 1. 先进行 base64 解码(使用你熟悉的编程语言)
# 2. 然后直接使用 ffmpeg 转换
ffmpeg -i decoded_audio.webm output.mp3如果需要批量转换多个文件,可以使用以下脚本:
#!/bin/bash
# batch_convert.sh
INPUT_DIR="./input"
OUTPUT_FORMAT="mp3"
for file in "$INPUT_DIR"/*.silk "$INPUT_DIR"/*.slk "$INPUT_DIR"/*.amr; do
if [ -f "$file" ]; then
echo "Converting: $file"
sh converter.sh "$file" "$OUTPUT_FORMAT"
fi
done
echo "Batch conversion completed!"使用方法:
chmod +x batch_convert.sh
./batch_convert.sh- 项目 GitHub:https://github.com/kn007/silk-v3-decoder
- 原文博客:https://kn007.net/topics/decoding-qq-wechat-silk-v3-encoded-audio-to-mp3-or-other-formats/
- SILK 编码维基百科:https://en.wikipedia.org/wiki/SILK
silk-v3-decoder 项目由 kn007 维护,SILK 编码由 Skype 开源。如将代码用于商业目的,请考虑赞助原作者。