GitHub 项目地址

python silk codec binding 支持微信语音编解码

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 系语音,仅以微信语音为例

  1. 标准 SILK 文件以 b'#!SILK_V3' 开始,以 b'\xFF\xFF' 结束,中间为语音数据
  2. 微信语音文件在标准 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 = Falseif silk.read(1) == b'\x02':tencent = Truesilk.seek(0)if tencent:silk.seek(10)else:silk.seek(9)i = 0while True:size = silk.read(2)if len(size) != 2:breaksize = size[0] + size[1] << 8if not tencent and size == 0xffff:breaki += 1silk.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 ⇔ 语音文件

  1. 音(视)频文件 ➜ PCM

    借助 ffmpeg,你当然需要先有 ffmpeg

    ffmpeg -y -i <音(视)频输入文件> -vn -ar <采样率> -ac 1 -f s16le <PCM输出文件>
    
    1. -y: 可加可不加,表示 <PCM输出文件> 已存在时不询问,直接覆盖
    2. -i: 没啥好说的,固定的,后接 <音(视)频输入文件>
    3. -vn: 表示不处理视频数据,建议添加,虽然不加也不会处理视频数据(视频数据不存在转PCM的说法),但可能会打印警告
    4. -ar: 设置采样率,可选的值是 [8000, 12000, 16000, 24000, 32000, 44100, 48000], 这里你可以直接理解为声音质量
    5. -ac: 设置声道数,在这里必须为 1,这是由 SILK 决定的
    6. -f: 表示强制转换为指定的格式,一般来说必须为 s16le, 表示 16-bit short integer Little-Endian data
    7. example1: ffmpeg -y -i mv.mp4 -vn -ar 44100 -ac 1 -f s16le mv.pcm
    8. example2: ffmpeg -y -i music.mp3 -ar 44100 -ac 1 -f s16le music.pcm
  2. PCM ➜ 音频文件

    ffmpeg -y -f s16le -i <PCM输入文件> -ar <采样率> -ac <声道数> <音频输出文件>
    
    1. -f: 这里必须为 s16le, 同样也是由 SILK 决定的
    2. -ar: 同上
    3. -ac: 含义同上,值随意
    4. <音频输出文件>: 扩展名要准确,没有指定格式时,ffmpeg 会根据给定的输出文件扩展名来判断需要输出的格式
    5. example3: ffmpeg -y -f s16le -i test.pcm test.mp3

ffmpeg 也可以使用 python ffmpeg binding 替换,推荐 PyAV 大家自行研究,这里不再啰嗦。

讲完了 音频文件 ⇔ 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)

使用 Python 转任意媒体文件到 SILK

import os,pilk
from pydub import AudioSegmentdef 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.encode(pcm_path, silk_path, pcm_rate=media.frame_rate, tencent=True)return silk_path

Python silk 库 支持微信语音相关推荐

  1. 微信公众号python_wechat: 微信 Python SDK,支持微信公众号以及企业号的上行消息及 OAuth 接口...

    微信公众号Python-SDK 本SDK支持微信公众号以及企业号的上行消息及OAuth接口.本文档及SDK假设使用者已经具备微信公众号开发的基础知识,及有能力通过微信公众号.企业号的文档来查找相关的接 ...

  2. 【Python】轻松识别文字,这款Python OCR库支持超过80种语言

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|Python大数据分析 什么是OCR? 有一款软件叫扫描全 ...

  3. 音频文件格式转化,librosa库支持的语音文件类型

    语音文本格式转化及在librosa库的语音文本输入要求 闲话少说,直接上料! python的librosa库是语音模型进行语音特征提取的常见的库:但使用时请注意,librosa库仅支持wav格式的语音 ...

  4. python ocr 识别中文pdf_轻松识别文字,这款Python OCR库支持超过80种语言

    OCR是什么? 有一款软件叫扫描全能王,想必一些小伙伴听过,这是一个OCR集成软件,可以将图像内容扫描成文字. 所以说,OCR作用是对文本资料的图像文件进行分析识别处理,获取文字及版面信息. OCR的 ...

  5. 轻松识别文字,这款Python OCR库支持超过80种语言

    击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 江汉曾为客,相逢每醉还. OCR是什 ...

  6. python ocr识别库_轻松识别文字,这款Python OCR库支持超过80种语言

    OCR是什么? 有一款软件叫扫描全能王,想必一些小伙伴听过,这是一个OCR集成软件,可以将图像内容扫描成文字. 所以说,OCR作用是对文本资料的图像文件进行分析识别处理,获取文字及版面信息. OCR的 ...

  7. 微信语音短消息amr文件转WAV

    " 微信语音短消息amr文件转WAV." 在<SILK编码语音转WAV格式>中提到过,"腾讯系产品,包括QQ.微信.小程序,在语音相关的实现中,也大量使用到S ...

  8. 导出合并小文件_关于微信语音导出,这个方法强烈建议~

    [阳阳效率工具类] 这是一篇微信语音导出工具分享文章. 背景: 1.前几天临时接到一个任务,需要把微信语音合成导出变成一个MP3格式转发,但微信却没有开放保存语音到本地及转发语音的功能. 2.上周在@ ...

  9. magicwatch2可以鸿蒙吗,荣耀手表2可以发微信吗?荣耀MagicWatch2支持微信消息回复吗...

    近期,荣耀推出了荣耀Magic Watch 2的多款进化版本,荣耀Magic Watch 2 是一款非常智能便携的手表,它选用最佳材质打造绝美质感,让这款小设备在视觉上更加通透有质感.同时它全新的功能 ...

最新文章

  1. 使用CoreOS及Docker搭建简单的SaaS云平台
  2. [BZOJ 5074] 小B的数字
  3. 撸表情开发过程中使用腾讯云存储的接入实例分享
  4. python中常用的os模块
  5. JavaEE平台学习之 01开发第一个Servlet程序
  6. 181108每日一句
  7. 开放源代码机器人控制软件
  8. 平板电脑怎么使用计算机,平板电脑怎么用
  9. json转map几种方法
  10. SpringCloud整合LCN分布式事务模式
  11. 【C语言】扫雷游戏(递归实现展开一片)8000字详细教学
  12. 一条命令实现树莓派摄像头直播推流哔哩哔哩
  13. windows 命令 系统快捷方式
  14. 2020起重机司机(限桥式起重机)作业考试题库及起重机司机(限桥式起重机)实操考试视频
  15. HihoCoder——Trie树
  16. 如果你也被pyinstaller折磨,建议阅读,pyinstaller打包教程。
  17. 转载大神神作之识狗君:Server端实现补充
  18. 最全的Matlab经典教程免费下载
  19. 二进制空间权重矩阵_空间权重矩阵(SWM)
  20. HTML和JavaScript的D3文件放置位置和文件下载

热门文章

  1. 2021年度上海公务员考试公告(11月05日开启)
  2. 077 三角函数定积分性质
  3. 嵌入式GUI LVGL『Tableview选项卡控件』介绍
  4. 第四周项目3--单链表应用之逆置
  5. 【游戏】LOL只能攻击英雄,点不了小兵解决办法
  6. jzy3D从入门到弃坑_4尝试使用jzy3D1.0画图失败
  7. android 系统 安卓8,安卓系统竟可以这么流畅!最快Android 8.0来了
  8. 能够正常加入域但无法实施域策略
  9. Kaggle下载criteo数据集
  10. 这20种PS技术让你的照片美不胜收