python silk voice library
Project description
pilk-nogil
fork from foyoux/pilk,在编解码过程中释放了GIL,适合多线程处理
python silk codec binding 支持微信语音编解码
pilk: python + silk
关联项目: weixin-wxposed-silk-voice
安装
pip install pilk-nogil
介绍与说明
SILK 是一种语音编码格式,由 Skype 公司研发,网上可找到的最新版本是 2012 发布的。
SILK 原始代码已上传到 Release , 包含规范文档
Tencent 系语音支持来自 silk-v3-decoder
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 替换,推荐 PyAV 大家自行研究,这里不再啰嗦。
讲完了 音频文件 ⇔ PCM,接下来就是用 pilk 进行 PCM ⇔ 语音文件 互转
silk 编码
import pilk_nogil
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
duration = pilk_nogil.encode("test.pcm", "test.silk", pcm_rate=44100, tencent=True)
print("语音时间为:", duration)
silk 解码
import pilk_nogil
# pcm_rate 参数必须和 使用 ffmpeg 转 音频 到 PCM 文件时,使用的 `-ar` 参数一致
duration = pilk_nogil.decode("test.silk", "test.pcm")
print("语音时间为:", duration)
使用 Python 转任意媒体文件到 SILK
import os, pilk_nogil
from pydub import AudioSegment
def convert_to_silk(media_path: str) -> str:
"""将输入的媒体文件转出为 silk, 并返回silk路径"""
media = AudioSegment.from_file(media_path)
pcm_path = os.path.basename(media_path)
pcm_path = os.path.splitext(pcm_path)[0]
silk_path = pcm_path + '.silk'
pcm_path += '.pcm'
media.export(pcm_path, 's16le', parameters=['-ar', str(media.frame_rate), '-ac', '1']).close()
pilk_nogil.encode(pcm_path, silk_path, pcm_rate=media.frame_rate, tencent=True)
return silk_path
使用 pyav 推荐
import os
import av
import pilk_nogil
def to_pcm(in_path: str) -> tuple[str, int]:
"""任意媒体文件转 pcm"""
out_path = os.path.splitext(in_path)[0] + '.pcm'
with av.open(in_path) as in_container:
in_stream = in_container.streams.audio[0]
sample_rate = in_stream.codec_context.sample_rate
with av.open(out_path, 'w', 's16le') as out_container:
out_stream = out_container.add_stream(
'pcm_s16le',
rate=sample_rate,
layout='mono'
)
try:
for frame in in_container.decode(in_stream):
frame.pts = None
for packet in out_stream.encode(frame):
out_container.mux(packet)
except:
pass
return out_path, sample_rate
def convert_to_silk(media_path: str) -> str:
"""任意媒体文件转 silk, 返回silk路径"""
pcm_path, sample_rate = to_pcm(media_path)
silk_path = os.path.splitext(pcm_path)[0] + '.silk'
pilk_nogil.encode(pcm_path, silk_path, pcm_rate=sample_rate, tencent=True)
os.remove(pcm_path)
return silk_path
Project details
Release history Release notifications | RSS feed
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_nogil-0.3.2-cp312-cp312-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 95e6c8994249bee29a73e1a9cfc9ee83668c3bc5d34bf59355a7b2569d088cfe |
|
MD5 | 596e6643f7712f8c1d243486e63e133a |
|
BLAKE2b-256 | ced6d782dfabacde99f55f3954979d2ce4bdbb15323edc5030c02e8129fe58c1 |
Hashes for pilk_nogil-0.3.2-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5257c7b2fb9b91ab4f1dd717acce1a3c48d29080b78fad94f2245c37cf209519 |
|
MD5 | 320f7758701fb7883350196f2f419781 |
|
BLAKE2b-256 | 3d566a22ea3a2016488dbfa4393c216cac21c9e3c4309bb155c1a15353138d07 |
Hashes for pilk_nogil-0.3.2-cp312-cp312-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2fd49c018b6f7e3fa4af1df3775d2186eb515171033ffcced58979838aaaf60 |
|
MD5 | 8f5154fcdd4edfce453cd87582e8aa29 |
|
BLAKE2b-256 | 186ab252827d1bc7b97aa68ec18b9d189ec6a1bc0ea4ebff6af197cbf9aad62b |
Hashes for pilk_nogil-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 82f1ebe4425192fb087f8344ba93c26b3f4e028c41757b21073d4ef8a97f4a88 |
|
MD5 | 7197035ccdd705c4365da4281dcf6f60 |
|
BLAKE2b-256 | 4082c81248f9ccb531f15f74b3fa04e2b94c848e6bcbfd6636c272d05b82c64d |
Hashes for pilk_nogil-0.3.2-cp311-cp311-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0ce6f49f549e8212ccbf51b59d0385f10bbb5d2ee577ec968dc9680d7d4f0d9e |
|
MD5 | 5c6149fbe2db961b77206f3f12c6bda8 |
|
BLAKE2b-256 | 99103452e39ad870a03ca1fddfea442f53a78ee137d41fedca9cf1de48a3abda |
Hashes for pilk_nogil-0.3.2-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 01ca0c3184f25165c8020f33b77d21619b0c1fe0243f25b34319509039f966f8 |
|
MD5 | 830b4746850b1218499f6c97e5bb1d3a |
|
BLAKE2b-256 | 1c9588ac97be4f02bca009479526188b8def440b3771dc7cc2d502e706c1ecbb |
Hashes for pilk_nogil-0.3.2-cp311-cp311-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d5a8ccdb1af3b48778d9cecccaf199958f6da9bc7b52fb4810474ea410b6f7f4 |
|
MD5 | ac14019bec35ac0dfbdc44dacf190dc9 |
|
BLAKE2b-256 | ada7b518fb311f99e3082b7cf408bbfa76df066165cc14ef179f53f5489ff3ff |
Hashes for pilk_nogil-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3b4f2b0a7d2a59f284b2d4ea6f025ca3608d9704ca7df9ebc26b8f15adce8911 |
|
MD5 | e90efaf716ac752f3222fe74a44c3265 |
|
BLAKE2b-256 | 985f11cd95b072fe7a696c96c998dddd96206aa9a28f760c5e9eab7327adeaa6 |
Hashes for pilk_nogil-0.3.2-cp310-cp310-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7ae61fd18b8493296ab2efa4c15b1abfedcd3c982c9c8288d254afb5d0a560e1 |
|
MD5 | 2ca08a31f23f5b5acd074474b6a39044 |
|
BLAKE2b-256 | cf479097fff143d494c42c8e15f6990c986e8fded1a62a7b477497943310272a |
Hashes for pilk_nogil-0.3.2-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6bcbeccfd30e7fa6071c6bb0c98c1f1a92687d1b996d5d7139e68390e6e8951b |
|
MD5 | 6c3e5a493c5be1317fe27f43c18d5af6 |
|
BLAKE2b-256 | 014f9b8bf6d5767b856ff483a8d8d4b199139334264c4d2050a528ef3e5d7ce4 |
Hashes for pilk_nogil-0.3.2-cp310-cp310-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 03eb29d72ed5738b16ddbb45a1f0942791f65df2341e8a8d4ecbea919d1b59c2 |
|
MD5 | 65572a653275d388b3d36b174330c386 |
|
BLAKE2b-256 | fb3a42f0ad11b80f1f3c8d1ab95181a18e64b0182db7c106db168f1e4b6cfc0c |
Hashes for pilk_nogil-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 76e487b3ebb9b06da8ed7605339289caebd44b2732d4e978dd9fe2802d60612f |
|
MD5 | 6528a95bd83e2d15b6d67fd7af101bb3 |
|
BLAKE2b-256 | 828b7f9e0828cb43cf9047a5960aa13d80d4239edb1f76e17ae63fdd26c108e5 |
Hashes for pilk_nogil-0.3.2-cp39-cp39-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 63d2c429ccece253818e47f876b1d17fdffbe96119821bf3f1268bf5442f366e |
|
MD5 | bf5319dd44437759879f810b419ca55f |
|
BLAKE2b-256 | 45e65f47123cf24b62d075a749ab4f8ee372a5cfd498b5f05b8a68ce0a1e64d9 |
Hashes for pilk_nogil-0.3.2-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e2aab67cdebb9bdcb7c222feb814014303fa98d9def88462482a102960529335 |
|
MD5 | 24fa66090b62a2d3b35cf15db0da1e25 |
|
BLAKE2b-256 | 02a7139487a41712f3b075537f3a2ad368acb29929ddf22b7ff8b9b19a607b8a |
Hashes for pilk_nogil-0.3.2-cp39-cp39-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a69dda1d8e97c955cfc552e9a379013cbd0a4384c8309ec97755e993f799bfde |
|
MD5 | 2613fe6120896e13ff33aabc1e0d88ce |
|
BLAKE2b-256 | 6e6f6f23ff8d90b7e713f9c628cbee5dd0d759d6e94378a27eea3e2fbf4ee238 |
Hashes for pilk_nogil-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 85dfb28017dccc3ec88704ef870af8a7038911cfc12ac4296cbc4ac1cbfdbaba |
|
MD5 | 5162c7945283b2ea3800a2205e3375d6 |
|
BLAKE2b-256 | d15bd4d03443c87923b6191fca59940d268ba4af5506eb95a93cb41fb9194245 |
Hashes for pilk_nogil-0.3.2-cp38-cp38-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d3d7f2a77357f58e749f9e1056546eadf766f08732808fb698e9f8984393b452 |
|
MD5 | ee7a6565a1e15d9ee5ea3b689130667a |
|
BLAKE2b-256 | 4c8dfd7f2bd9f854bc8c9c95aaa3614acfc6ee81a214dd0fb6cfe0b7633f6195 |
Hashes for pilk_nogil-0.3.2-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b9be09c0312781865e71f28e83cfe9b8a32cb4601027cb53e8637ef1beee27bc |
|
MD5 | aa2967cc7b2712492ceb25d6b3fe462c |
|
BLAKE2b-256 | 2afe20c88ee0a57f019271969d7e995e90f8835e786be0aef2e3a4eab875c0b3 |
Hashes for pilk_nogil-0.3.2-cp38-cp38-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 62f73731803528f52d063469cbc687dcb44fc80e624203e9b1fb33b2ba875bde |
|
MD5 | 02e63a24e1f8e9f608a19a556a3c5573 |
|
BLAKE2b-256 | c2db787655ed3265522c93e04482058be55873c3e33474a132020a7560e2b322 |
Hashes for pilk_nogil-0.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 27ad72af111c7f2d45c0db3364219a2d8e49fd429d0652e54ea5c92c13b93ab9 |
|
MD5 | fb2024f8eab6381b86dd00b66fd7b268 |
|
BLAKE2b-256 | 440f9bfb051876c66b15db8c72ddc684f10a775b187c4cdef54e3e25139004ea |
Hashes for pilk_nogil-0.3.2-cp37-cp37m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d96aa26a305d47c7eddd00bce3d73a3df1023d4942473c1e70e0ff500f0af622 |
|
MD5 | daeb5727377c3ddc4fcbd5cb6e73a2f3 |
|
BLAKE2b-256 | 9e75ea98841e6a7bd2ef7a56e3926a22bbc2524200f5a7de63c827df808694a7 |
Hashes for pilk_nogil-0.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 41446a1c8eae9e527c31694675c02ac7f35defdc4bda1903995ccd5db27b3e0d |
|
MD5 | b47ed60965444c91cd7abe92e5cfa2ed |
|
BLAKE2b-256 | a6923aa0330e2bc1ded22b63943a495629d4fb88845376e1522a02ce2f7882d8 |
Hashes for pilk_nogil-0.3.2-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9e7dccb43a95195c044fc4b0ac49abb58477348ac7767b29f3c6257f84e675aa |
|
MD5 | 9114168f16afba9c3f11b66e4677e0f1 |
|
BLAKE2b-256 | e9d9c12a5a0f530364baf28ed249bd11ab92bda840ceaf1e2fec7e358b2ed547 |
Hashes for pilk_nogil-0.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c82b727580902d8745344a09d2bfffc9801846f31842bbaca8cfdbbc67844b5b |
|
MD5 | fe2eeedf4c40edff2b5b08af0ad40cc9 |
|
BLAKE2b-256 | 039e044be2ac96e0ff7a479244097eb84430b3b7b97a1470cf25a203870ec336 |
Hashes for pilk_nogil-0.3.2-cp36-cp36m-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f618c98dcdff0529ed280c81d1eed9fa15ac87fbc7180e327ba95ae209bedb30 |
|
MD5 | d828fd159f10ce434861357769c4ff87 |
|
BLAKE2b-256 | f0d541ef90ca114d6f0d9b4f37924c0f20fd3939cc5ef554a14ae7ae0991db7c |
Hashes for pilk_nogil-0.3.2-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fb09feb528d9c290440c6bae17cf54ead3436e635a94ddff4903ab01844c65db |
|
MD5 | 23348f5371a6bd95de4555796f2db720 |
|
BLAKE2b-256 | 1c46c63ebed0589b847be4a8c11ba9f171c5251cae95e1d396112c28eb16f7dd |
Hashes for pilk_nogil-0.3.2-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | efde535370b4f48a366bc09b4864eea7b4097afb1432e75bcbd33363453c055d |
|
MD5 | cc77849db51915c99b226740e996f23b |
|
BLAKE2b-256 | 2bbba4844344b00e72e80ed0d1ee6d7ae1098435b785fc265def025959858771 |
Hashes for pilk_nogil-0.3.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ad159f37ce8a8f885255313f1b77d5ac6202d33ca02cc2eb84b70cfea63423de |
|
MD5 | 5ceb1e26c19da9226504107f5e97b73c |
|
BLAKE2b-256 | 57d723fa3db31c8d6ea1324c118a2b867c0d4e95544fa926f1a2a4296b055709 |