我正在尝试编写一个Python-3.6脚本,它将空的.aif音频记录(即仅包含环境噪声)与包含语音的记录分开。我的目的不是承认语音内容 - 首先,它不是英语,其次,它不是我的目的所需要的。
尽管如此,我还没有发明一些比使用pocketsphinx的SpeechRecognition来解决这个问题更好的东西。我的想法很原始:
import speech_recognition as sr
r = sr.Recognizer()
emptyRecords = []
for fname in os.listdir(TESTDIR):
with sr.AudioFile(TESTDIR + fname) as source:
recorded = r.record(source)
recognized = r.recognize_sphinx(recorded)
if len(recognized) <= 10:
print("{} seems to be an empty record.".format(fname))
emptyRecords.append(fname)
也就是说,我尝试将录制的音频转换为字符串列表,并根据10个单词的“直观”阈值将这些列表分开,因为有时pocketphinx将背景噪声识别为几个插入的稀疏序列。然而,由于不必要的语音识别过程,这花费了很长时间 - 对于每个记录,我只需要检查它是否包含超过10个单词而不是更多。据我所知,在SpeechRecognition的文档中,Recognizer类不包含任何限制要识别的单词数量的属性或方法。
有人可以为这个问题提出更好的建议吗?
提前致谢。
试试webrtcvad lib。设置激进模式并使用您记录的数据进行测试。
你可以使用STFT(短时傅里叶变换)
获取信号中的总能量,并将其与人体声音范围(300 Hz至3000 Hz)中的能量进行比较。 (https://en.wikipedia.org/wiki/Short-time_Fourier_transform)
这是一个简单的stft使用numpy和fft大小1024,你可以使用它https://github.com/JPabloVasquez/SimpleAudioTools