gpt4 book ai didi

numpy - Scipy、Numpy : Audio classifier, 语音/语音事件检测

转载 作者:行者123 更新时间:2023-11-30 08:44:18 25 4
gpt4 key购买 nike

我正在编写一个程序来自动对录制的音频电话文件(wav 文件)进行分类,其中至少包含一些人声(仅 DTMF、拨号音、铃声、噪音)。

我的第一个方法是使用 ZCR(过零率)和计算能量来实现简单的 VAD(语音事件检测器),但这两个参数都会混淆 DTMF、拨号音和语音。这项技术失败了,所以我实现了一种简单的方法来计算 200Hz 和 300Hz 之间的 FFT 方差。我的numpy代码如下

wavefft = np.abs(fft(frame))
n = len(frame)
fx = np.arange(0,fs,float(fs)/float(n))
stx = np.where(fx>=200)
stx = stx[0][0]
endx = np.where(fx>=300)
endx = endx[0][0]
return np.sqrt(np.var(wavefft[stx:endx]))/1000

这导致了 60% 的准确率。

接下来,我尝试使用 SVM(支持向量机)和 MFCC(梅尔频率倒谱系数)来实现基于机器学习的方法。结果完全不正确,几乎所有 sample 都被错误标记。应该如何使用 MFCC 特征向量训练 SVM?我使用scikit-learn的粗略代码如下

[samplerate, sample] = wavfile.read ('profiles/noise.wav')
noiseProfile = MFCC(samplerate, sample)
[samplerate, sample] = wavfile.read ('profiles/ring.wav')
ringProfile = MFCC(samplerate, sample)
[samplerate, sample] = wavfile.read ('profiles/voice.wav')
voiceProfile = MFCC(samplerate, sample)

machineData = []
for noise in noiseProfile:
machineData.append(noise)

for voice in voiceProfile:
machineData.append(voice)

dataLabel = []
for i in range(0, len(noiseProfile)):
dataLabel.append (0)
for i in range(0, len(voiceProfile)):
dataLabel.append (1)

clf = svm.SVC()
clf.fit(machineData, dataLabel)

我想知道我可以实现什么替代方法?

最佳答案

如果您不必使用 scipy/numpy,您可以查看 webrtvad ,这是 Google 优秀的 Python 包装器 WebRTC语音事件检测代码。 WebRTC 使用高斯混合模型 (GMM),效果很好,而且速度非常快。

以下是如何使用它的示例:

import webrtcvad

# audio must be 16 bit PCM, at 8 KHz, 16 KHz or 32 KHz.
def audio_contains_voice(audio, sample_rate, aggressiveness=0, threshold=0.5):
# Frames must be 10, 20 or 30 ms.
frame_duration_ms = 30

# Assuming split_audio is a function that will split audio into
# frames of the correct size.
frames = split_audio(audio, sample_rate, frame_duration)

# aggressiveness tells the VAD how aggressively to filter out non-speech.
# 0 will have the most false-positives for speech, 3 the least.
vad = webrtc.Vad(aggressiveness)

num_voiced = len([f for f in frames if vad.is_voiced(f, sample_rate)])
return float(num_voiced) / len(frames) > threshold

关于numpy - Scipy、Numpy : Audio classifier, 语音/语音事件检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com