我如何在Python中进行实时语音活动检测?

问题描述 投票:3回答:4

我正在对记录的音频文件执行语音活动检测,以检测波形中的语音与非语音部分。

分类器的输出看起来像(突出显示的绿色区域表示语音):

enter image description here

我在这里面对的唯一问题是使其能够用于音频输入流(例如:来自麦克风),并在规定的时间范围内进行实时分析。

我知道PyAudio可用于动态记录来自麦克风的语音,并且有几个实时可视化示例,包括波形,频谱,频谱图等,但找不到与在麦克风中进行特征提取有关的任何内容。接近实时的方式。

python speech-recognition speech-to-text speech pyaudio
4个回答
2
投票

您应该尝试使用Python绑定到webRTC VAD from Google。基于GMM建模,它轻巧,快速并且提供了非常合理的结果。由于按帧提供决策,因此延迟最小。

# Run the VAD on 10 ms of silence. The result should be False.
import webrtcvad
vad = webrtcvad.Vad(2)

sample_rate = 16000
frame_duration = 10  # ms
frame = b'\x00\x00' * int(sample_rate * frame_duration / 1000)
print('Contains speech: %s' % (vad.is_speech(frame, sample_rate))

此外,this文章可能对您有用。


2
投票

音频通常具有较低的比特率,因此我看不到完全用numpynumpy编写代码的任何问题。如果您需要低级数组访问,请考虑python。同时分析您的代码,例如用numba。还请注意,有numba用于更高级的信号处理。

通常,音频处理在样本中起作用。因此,您可以为流程定义样本量,然后运行一种方法来确定该样本是否包含语音。

line_profiler

那应该让您走得很远。


1
投票

我认为这里有两种方法,

  1. 阈值法
  2. 小型,可部署的神经网络。方法

第一个是快速的,可行,并且可以实施和非常快速地测试。而第二个则难以实施。我认为您已经对第二个选项有些熟悉。

在第二种方法的情况下,您将需要一个以二进制分类序列标记的语音数据集,例如line_profiler。神经网络应该很小,并且应该针对在移动设备等边缘设备上运行进行优化。

您可以从TensorFlow中检出scipy.signal

scipy.signal是语音活动检测器。我认为这是出于您的目的。

也请检查这些。

import numpy as np def main_loop(): stream = <create stream with your audio library> while True: sample = stream.readframes(<define number of samples / time to read>) print(is_speech(sample)) def is_speech(sample): audio = np.array(sample) < do you processing > # e.g. simple loudness test return np.any(audio > 0.8):

00000000111111110000000011110000

当然,您应该比较性能所提到的工具包和模型以及可行性移动设备的实现


1
投票

我发现this可能是您解决问题的方法之一。 This上有一个简单的教程,介绍如何使用麦克风流传输来实现实时预测。

让我们使用短时傅立叶变换(STFT)作为特征提取器,作者解释:

为了计算STFT,使用了快速傅立叶变换窗口大小(n_fft)如512。根据方程n_stft = n_fft / 2 + 1,257频率bins(n_stft)是在512的窗口大小上计算的。跃迁长度为256可以更好地重叠计算STFT的窗口。

https://github.com/eesungkim/Voice_Activity_Detector

https://github.com/pyannote/pyannote-audio

代码归功于:Chathuranga Siriwardhana

可以找到完整的代码LibROSA

© www.soinside.com 2019 - 2024. All rights reserved.