Python 如何利用音频流数据计算过零率

Python 如何利用音频流数据计算过零率,python,numpy,signal-processing,Python,Numpy,Signal Processing,我想做一些语音检测代码。我试图用零交叉率来做这件事。我做了一些研究,发现当有人说话时,过零率应该是一个中等的值,不太高也不太低,但是当我对着麦克风说话时,过零率会变得比只有背景噪声时更高(几乎没有背景噪声)。这就是我现在正在做的计算 ((audioData[:-1] * audioData[1:]) < 0).sum() ((audioData[:-1]*audioData[1:])0) 是否存在成对差异(np.diff)使零交叉点的位置变为1(上升)和-1(下降) 选择那些非零值所在数

我想做一些语音检测代码。我试图用零交叉率来做这件事。我做了一些研究,发现当有人说话时,过零率应该是一个中等的值,不太高也不太低,但是当我对着麦克风说话时,过零率会变得比只有背景噪声时更高(几乎没有背景噪声)。这就是我现在正在做的计算

((audioData[:-1] * audioData[1:]) < 0).sum()
((audioData[:-1]*audioData[1:])<0.sum()

audioData是一个numpy表,它的内容是pyAudioStream.read()的结果。有人能告诉我计算这个的正确方法吗?谢谢

这是很多不必要的乘法运算。使用布尔比较并在
np.diff
中运行可能会更快:

zero_crosses = np.nonzero(np.diff(audioData > 0)))[0]
这是在做什么:

  • 创建一个布尔数组,其中信号高于0(
    audioData>0
  • 是否存在成对差异(
    np.diff
    )使零交叉点的位置变为1(上升)和-1(下降)
  • 选择那些非零值所在数组的索引(
    np.nonzero
    然后,如果你想知道交叉口的数量,你可以只取
    zero\u crosss.size


    作为奖励,你有所有十字架的计时,这样你就可以做一些事情,比如柱状图,显示更多十字架在你的时间历史中发生的位置。

    这是很多不必要的乘法。使用布尔比较并在
    np.diff
    中运行可能会更快:

    zero_crosses = np.nonzero(np.diff(audioData > 0)))[0]
    
    这是在做什么:

  • 创建一个布尔数组,其中信号高于0(
    audioData>0
  • 是否存在成对差异(
    np.diff
    )使零交叉点的位置变为1(上升)和-1(下降)
  • 选择那些非零值所在数组的索引(
    np.nonzero
    然后,如果你想知道交叉口的数量,你可以只取
    zero\u crosss.size

    作为奖励,你有所有十字架的计时,所以你可以做一些事情,比如柱状图,显示更多十字架在你的时间历史中发生的地方