webRTC:在 python 中获取 WAV 音频的 VAD 数据

webRTC: getting VAD data on WAV audio in python

我正在尝试 运行 webRTC VAD 的示例代码找到 here

但是当我给它一个 单声道 16 位波形文件 时,只有我说话时停顿很长时间,它只是检测到整个文件是 发声,而 voiced 输出 chunk-00.wav 是整个音频文件。

非常感谢任何帮助。下面我给出了我收到的控制台输出。

(base) gulag_dweller@Tumuls-MacBook-Pro python_transformers % python3 VAD-python.py /Users/gulag_dweller/Downloads/try_voice.wav 
sample rate is: 48000 Hz
00001111111111+(0.12)11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111100011111111111111111111111111111111111111110111111111111111111111111111111111111111110001111111111111111111111111111111111111111111111111-(16.22999999999986)
 Writing chunk-00.wav

我想我找到了另一种获取 VAD 数据的方法。我没有尝试从上面 link 中显示的 pre-defined 方法获取 VAD,而是创建了自己的函数。

该函数主要测量波的振幅,在基本噪声水平 (1.6x the base value) 之上观察到的任何尖峰都被认为是浊音 activity。此函数假设只有 1 个人在说话,并且噪音水平保持相对恒定。

y_list=list(audio_data1) # create an immutable list of amplitude values
y_vad=[] # initialise an array
max_noise = -1.0 # put the lowest value that one can

for i in range(len(time_s)):
    t = time_s[i]

    # Variable to store the current absolute amplitude value for the given index i
    current_audio_amplitude = np.abs(audio_data1[i])
    # since at the start, some issues arise, first few seconds are padded out 
    # and for any sudden change in |amplitude| i.e. > 60% results in stopping the program 
    if t>0.2 and max_noise > 0 and current_audio_amplitude > 1.6*max_noise:
        print(t, current_audio_amplitude, max_noise)
        break
    # take the highest value of amplitude to be the max_noise
    if current_audio_amplitude > max_noise:
        max_noise = current_audio_amplitude
print('max-noise is: '+str(max_noise))

for i in range(len(time_s)):
    # for any value amplitude that exceeds the max_noise value is taken to be a voice activity
    if np.abs(audio_data1[i]) > max_noise:
        y_vad.append(1)
    # otherwise just take VAD value to be 0
    else:
        y_vad.append(0)