Skip to content

JimmyiZhang/silk-v3-decoder

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

133 Commits
 
 
 
 
 
 
 
 

Repository files navigation

SILK v3 Decoder/Encoder 使用指南 (Linux)

本文档基于 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 是否支持 MP3

ffmpeg -encoders | grep mp3

如果没有输出,需要重新编译或安装带有 --enable-libmp3lame 选项的 ffmpeg。


下载项目

git clone https://github.com/kn007/silk-v3-decoder.git
cd silk-v3-decoder

编译

编译 Decoder(解码器)

cd silk
make decoder

编译成功后会在 silk/ 目录下生成 decoder 可执行文件。

编译 Encoder(编码器)

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,之后无需重复编译
  • 输出文件会保存在输入文件相同目录下,文件名为 原文件名.输出格式

方法二:手动使用 Decoder(解码器)

Decoder 命令格式

./silk/decoder <输入文件.silk> <输出文件.pcm> [参数]

Decoder 参数说明

参数 说明 默认值
-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

ffmpeg 参数说明

参数 说明
-y 覆盖已存在的输出文件
-f s16le 指定输入格式为 16-bit 有符号小端 PCM
-ar 24000 采样率 24000 Hz
-ac 1 单声道
-i 输入文件

方法三:手动使用 Encoder(编码器)

Encoder 命令格式

./silk/encoder <输入文件.pcm> <输出文件.silk> [参数]

Encoder 参数说明

参数 说明 默认值
-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

完整转换流程示例

示例 1:微信语音转 MP3

# 方法一:使用脚本
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

示例 2:QQ 语音转 WAV

# 方法一:使用脚本
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

示例 3:MP3 转 SILK(用于微信/QQ)

# 先将 MP3 转为 PCM
ffmpeg -y -i music.mp3 -f s16le -ar 24000 -ac 1 music.pcm

# 再将 PCM 转为 SILK(添加腾讯文件头)
./silk/encoder music.pcm music.silk -tencent

示例 4:WAV 转 SILK

# 先将 WAV 转为 PCM
ffmpeg -y -i audio.wav -f s16le -ar 24000 -ac 1 audio.pcm

# 再将 PCM 转为 SILK
./silk/encoder audio.pcm audio.silk -tencent

常见问题

1. 提示 "maybe not a silk v3 encoded file"

原因: 输入文件不是 SILK v3 编码格式。

解决方案:

  • 检查文件是否为真正的 SILK v3 格式
  • 微信小程序的录音可能是 WebM 或其他格式,需要 base64 解码后直接使用 ffmpeg 转换

2. 提示 "maybe ffmpeg no format handler for mp3"

原因: 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

3. 转换后的音频速度异常(过快或过慢)

原因: 采样率设置不正确。

解决方案: 确保 ffmpeg 命令中的采样率 -ar 参数设置为 24000

4. 找不到 ffmpeg 命令

解决方案:

# 检查 ffmpeg 路径
which ffmpeg

# 如果安装在非标准路径,添加到 PATH
export PATH="/usr/local/ffmpeg/bin:$PATH"

# 或创建软链接
sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/bin/ffmpeg

5. Linux 环境下权限问题

解决方案:

# 给 decoder 和 encoder 添加执行权限
chmod +x silk/decoder
chmod +x silk/encoder

# 确保脚本有执行权限
chmod +x converter.sh

6. 微信小程序语音无法转换

说明: 微信小程序的录音格式可能不是 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

参考资料


版权声明

silk-v3-decoder 项目由 kn007 维护,SILK 编码由 Skype 开源。如将代码用于商业目的,请考虑赞助原作者。

About

silk编码与解码

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • C 88.0%
  • Assembly 11.8%
  • Makefile 0.2%