【问题标题】:Python: setting apart speech from empty audio recordsPython:将语音与空音频记录区分开来
【发布时间】:2018-09-03 21:45:28
【问题描述】:

我正在尝试编写一个 Python-3.6 脚本,它将空的 .aif 音频记录(即仅包含环境噪声)与包含语音的那些分开。我的目标是识别语音内容 - 首先,它不是英语,其次,我的目的不需要它。

尽管如此,我没有发明出比使用 SpeechRecognition 和 pocketsphinx 更好的方法来解决这个问题。我的想法很原始:

        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 个单词的“直观”阈值分隔这些列表,因为有时 pocketsphinx 将背景噪声识别为几个感叹词的稀疏序列。然而,由于不必要的语音识别过程,这花费了非常长的时间——对于每条记录,我只需要检查它是否包含超过 10 个单词,仅此而已。据我从 SpeechRecognition 的文档中了解到,Recognizer 类不包含任何会限制要识别的单词数量的属性或方法。

有人可以为这个问题提出一个更好的主意吗?

提前致谢。

【问题讨论】:

    标签: python anaconda speech-recognition pocketsphinx


    【解决方案1】:

    试试 webrtcvad 库。设置攻击性模式并使用您记录的数据进行测试。

    https://pypi.org/project/webrtcvad/

    【讨论】:

    • 非常感谢您的回复,这个库解决了我的问题。
    【解决方案2】:

    您可以使用 STFT(短时间傅里叶变换)

    获取信号中的总能量并将其与位于人声范围(300 Hz 至 3000 Hz)内的能量进行比较。 (https://en.wikipedia.org/wiki/Short-time_Fourier_transform)

    这里是一个使用numpy的简单stft,fft大小为1024,你可以用https://github.com/JPabloVasquez/SimpleAudioTools

    【讨论】:

    • 感谢您的回复,我也会尝试您的解决方案,虽然 webrtcvad 已经解决了我的问题。
    猜你喜欢
    • 2011-12-18
    • 2020-05-18
    • 1970-01-01
    • 2016-08-07
    • 2017-07-10
    • 2014-05-27
    • 2020-09-18
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多