python---webRTC~vad静音检测-学习笔记
参考:
- https://blog.csdn.net/u012123989/article/details/72771667
webRTC~vad
1. mode
- 0 ---- quality mode
- 1 ---- low bitrate mode
- 2 ---- aggressive mode
- 3 ---- very aggressive mode
2. webRTC~vad只支持10ms, 20ms, 30ms的帧frame判断。
3. webRTC~vad只支持8k采样率
4. 在8k采样基础上
(1) 计算子带能量, feature vector
(2) 通过高斯混合模型分别计算语音和非语音的概率,使用假设检验的方法确定信号的类。
- 首先通过高斯模型计算假设检验中的H0和H1,通过门限判决vadflag。
- 然后更新概率计算所需要的语音均值(speech_means)、噪声均值(noise_means)、语音方差(speech_stds)、噪声方差(noise_stds)。
----------笔记1:反正我是没看懂,推荐看webRTC英文简介中的vad部分;
idea:如果实时更新 + collections.deque(maxlen)应用到自适应领域,去做静音检测和噪音消除,可行吗?
5. 代码-python
import pyaudio
import webrtcvad
vad = webrtcvad.Vad(1)
stream = pyaudio.open(......)
chunk = stream.read(chunk_size)
active = vad.is_speech(chunk, RATE)
--------笔记2: 我个人笔记:python--webRTC~vad对于声音的判断效果很差,pyaudio等在录音过程中会有电流脉/机器本身运行的声音干扰,vad.is_speech会将电流脉声音判断为有效语音,干扰很大。
- portaudio用于音频采集,有两种机制:阻塞和回调。阻塞,自己设定时间, 不管有没有数据都要返回;回调,有有效数据的时候才会调用这个函数返回数据。 -----吐嘈:如果python相关包能实现回调的功能,那静音检测还需要做吗?疑问?
- pyaudio可以从设备节点读取原始音频流数据,音频编码是PCM格式;
- struct.pack(fmt, v1, v2)
return a string containing the values v1,v2....packed according to the given format. the arguments must match the values required by the format exactly.
struct.pach用于将python值根据格式符,转换为字符串。(因为python中没有字节Byte类型,可以把这里的字符串理解为字节流或字节数组)
example1: struct类型表。'i'表示integer; ‘ii'表示转换两个值v1,v2为integer数据;byte 0xff表示一个十六字节,无符号整数。
example2:struct.pack('>i4sh', 7, b'spam', 8)
fmt=‘>i4sh',这种格式符是一种linux命令.
'>'是c和python中的一种数据结构
’i' int---interger---7
4s----char-----string对应spam
‘h’----unsigned short------integer---8
- array.array(type code[, initalizer])
a new array whose items are restricted by type code
'h' -----signed short-----int----2
- signal.signal(signalnum, handler)这个模块提供了python内部的信号处理机制,一旦出现signalnum信号,就执行handler函数
python signal信号类型:SIGINT终止进程,中断进程
- collections.deque(maxlen=)通过maxlen限制deque队列中的帧数
collections是python内建的一个集合模块,提供了许多有用的集合类
deque()为了高效实现插入和删除操作的双向列表,适用于栈和对列:append(), appendleft(); pop(), popleft(),而list是线性列表,在数据量大的时候插入和删除的效率很低。
- python~assert简便地设置断点debugging
- python~yield是一个类似return的关键字,只是这个函数返回多个值的生成器,并不立即执行。
question1:在pyaudio.stream录音过程中,突然拔掉麦克风,会莫名其妙的多录入1000多块chunk的电流脉声。
question2: webrtcvad并不能及时、准确的检测出静音,如果静音检测达不到及时准确的要求,延迟在2-4s以上,静音检测就没有多大意义了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步