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以上,静音检测就没有多大意义了。