python silk voice library
Project description
pilk
python silk codec binding 支持微信语音编解码
pilk: python + silk
安装
pip install pilk
介绍与说明
SILK 是一种语音编码格式,由 Skype 公司研发,网上可找到的最新版本是 2012 发布的。
SILK 原始代码已上传到 v0.0.1 release , 包含规范文档
Tencent 系语音支持来自 silk-v3-decoder
v0.0.1 release 中也包含 silk-v3-decoder 重编译的 x64-win 版本
SILK 编码格式 和 Tencent 系语音的关系:
此处 Tencent 系语音,仅以微信语音为例
- 标准 SILK 文件以
b'#!SILK_V3'
开始,以b'\xFF\xFF'
结束,中间为语音数据 - 微信语音文件在标准 SILK 文件的开头插入了
b'\x02'
,去除了结尾的b'\xFF\xFF'
,中间不变
已下统称为语音文件
语音数据
语音数据分为很多个独立 frame,每个 frame 开头两字节存储剩余 frame 数据的大小,每个 frame 默认存储 20ms 的音频数据
据此可写出获取 语音文件 持续时间(duration) 的函数(此函数 pilk 中已包含)
def get_duration(silk_path: str, frame_ms: int = 20) -> int:
"""获取 silk 文件持续时间,单位:ms"""
with open(silk_path, 'rb') as silk:
tencent = False
if silk.read(1) == b'\x02':
tencent = True
silk.seek(0)
if tencent:
silk.seek(10)
else:
silk.seek(9)
i = 0
while True:
size = silk.read(2)
if len(size) != 2:
break
size = size[0] + size[1] << 8
if not tencent and size == 0xffff:
break
i += 1
silk.seek(silk.tell() + size)
return i * frame_ms
根据 SILK 格式规范,frame_ms 可为 20, 40, 60, 80, 100
快速入门
详情请在 IDE 中查看 API 文档注释
在使用 pilk 之前,你还需清楚 音频文件 mp3, aac, m4a, flac, wav, ...
与 语音文件 之间的转换是借助 PCM raw
data 完成的
具体转换关系:音频文件 ⇔ PCM ⇔ 语音文件
-
音(视)频文件 ➜ PCM
借助 ffmpeg,你当然需要先有 ffmpeg
ffmpeg -y -i <音(视)频输入文件> -vn -ar <采样率> -ac 1 -f s16le <PCM输出文件>
-y
: 可加可不加,表示 <PCM输出文件> 已存在时不询问,直接覆盖-i
: 没啥好说的,固定的,后接 <音(视)频输入文件>-vn
: 表示不处理视频数据,建议添加,虽然不加也不会处理视频数据(视频数据不存在转PCM的说法),但可能会打印警告-ar
: 设置采样率,可选的值是 [8000, 12000, 16000, 24000, 32000, 44100, 48000], 这里你可以直接理解为声音质量-ac
: 设置声道数,在这里必须为 1,这是由 SILK 决定的-f
: 表示强制转换为指定的格式,一般来说必须为 s16le, 表示16-bit short integer Little-Endian data
- example1:
ffmpeg -y -i mv.mp4 -vn -ar 44100 -ac 1 -f s16le mv.pcm
- example2:
ffmpeg -y -i music.mp3 -ar 44100 -ac 1 -f s16le music.pcm
-
PCM ➜ 音频文件
ffmpeg -y -f s16le -i <PCM输入文件> -ar <采样率> -ac <声道数> <音频输出文件>
-f
: 这里必须为s16le
, 同样也是由 SILK 决定的-ar
: 同上-ac
: 含义同上,值随意<音频输出文件>
: 扩展名要准确,没有指定格式时,ffmpeg 会根据给定的输出文件扩展名来判断需要输出的格式- example3:
ffmpeg -y -f s16le -i test.pcm test.mp3
ffmpeg 也可以使用 python ffmpeg binding 替换,ffmpeg-python 大家自行研究,这里不再啰嗦。
讲完了 音频文件 ⇔ PCM,接下来就是用 pilk 进行 PCM ⇔ 语音文件 互转
silk 编码
import pilk
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
duration = pilk.encode("test.pcm", "test.silk", pcm_rate=44100, tencent=True)
print("语音时间为:", duration)
silk 解码
import pilk
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
duration = pilk.decode("test.silk", "test.pcm")
print("语音时间为:", duration)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for pilk-0.0.2-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 151ea9cca4041773514caeb3272d1d7877b7e042c9e9539edfd6453b931fcfa0 |
|
MD5 | 74fa38501773436543c8368fc76e7459 |
|
BLAKE2b-256 | 2c84394d1d66e19e24a13dabaf522c6b75848819aa439525babd2874d28b781b |
Hashes for pilk-0.0.2-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 029008a4bc6a9143733feea778ecbee15ba26a6e5a629d92890f73f4d55e6faf |
|
MD5 | b63fd0590ceae771672dbbb8dcf4f86e |
|
BLAKE2b-256 | 5285fbe4dd64f7a1283b50d23fb13dfb258259c0b69d4d677eba91e0d1054804 |
Hashes for pilk-0.0.2-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 50bb1c9c020f8e2e91faf417f9c9f5967d731f1c977cdd98aa6915fd283ce7bb |
|
MD5 | 0b54dd89c8a99ec500e295ec9d20bf3a |
|
BLAKE2b-256 | 8ed1067970892bfd46dd98751014cdf2aff1ebf5447e42d837d7ff5bb08abaa3 |
Hashes for pilk-0.0.2-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8288d120f7f38efc6d6034aa151cdc25ef70c519fa208967301f7c0dcceb03b4 |
|
MD5 | 091806be30de26a09fa77ecc9306ef7d |
|
BLAKE2b-256 | 6a7652bc7c0e35670880f27425966c63df4179950be2815c59996c0c56ef4385 |
Hashes for pilk-0.0.2-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6999bb3b60478eb700656e6547831a601b9470879051914f19b77f4cff3fec4d |
|
MD5 | 1c1e9e1f40f551e84837f44b7fa9dafc |
|
BLAKE2b-256 | ca9611a9b48fdd31bdbbc7542d8b9f7ec7d0c202036048d3c722018211aed96b |