【问题标题】:python audio listener losing quality after a few mins几分钟后python音频监听器质量下降
【发布时间】:2014-03-22 12:07:38
【问题描述】:

我正在尝试设置一个持久的音频侦听器。这个想法是记录一些音频,发送到谷歌的语音识别 API,然后根据所说的运行命令。我知道这已经实施了好几次了;事实上,我从这里借用了大量代码(稍作改编):

https://github.com/jeysonmc/python-google-speech-scripts/blob/master/stt_google.py

我希望它始终在后台运行。现在,它在最初的几分钟内效果很好,但过了一会儿,录音机需要更长的时间才能停止录音(即使完全静音),而且我不确定是否将正确的音频发送给谷歌,因为识别的质量下降得相当陡峭。请注意,我目前正在使用非常激进的 try/except 来解决在录制第一段音频后似乎出现的 IOErrors。当然欢迎任何更优雅和/或更有效的解决方案。我的代码如下:

#config
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 48000
THRESHOLD = 180 #The threshold intensity that defines silence signal (lower than).
SILENCE_LIMIT = 2 #Silence limit in seconds. The max ammount of seconds where only silence is recorded. When this time passes the recording finishes and the file is delivered.

p = pyaudio.PyAudio()

print "* listening. CTRL+C to finish."

all_m = []
data = ''
rel = RATE/chunk
slid_win = deque(maxlen=SILENCE_LIMIT*rel)
started = False

while (True):
    try:
        #listening loop, open new stream each time
        stream = p.open(format = FORMAT,channels = CHANNELS, rate = RATE, input = True, frames_per_buffer = chunk)
        data = stream.read(chunk)

        slid_win.append (abs(audioop.avg(data, 2)))

        #detect noise
        if(True in [ x>THRESHOLD for x in slid_win]):
            if(not started):
                print "starting record"
            started = True
            all_m.append(data)
        elif (started==True):
            stream.close()
            print "finished"

            #the limit was reached, finish capture and deliver
            filename = save_speech(all_m,p)
            google(filename)

            #reset all
            started = False
            slid_win = deque(maxlen=SILENCE_LIMIT*rel)
            all_m= []

            print "listening ..."
    except IOError as e:
        print "Caught IOError"
        stream.close()
        pass

其余代码只涉及到flac的转换和对Google的请求。

重申一下,我的代码在最初的几分钟内运行良好,前提是没有太多背景噪音,并且命令是直接对着麦克风说的。除了在打开流的位置移动(它最初位于主 while() 循环之外)之外,我还尝试在任何文件保存/发送到 Google 之前关闭 PyAudio 流。这两个变化似乎都有一点帮助。然而,随着时间的推移,由于记录指标变得越来越不准确,我的直觉是它与滑动窗口的“错位”有关。不过肯定是错的。

提前感谢您的帮助。

【问题讨论】:

    标签: python audio speech-recognition speech


    【解决方案1】:

    更有效的方法是在专为连续收听而设计的关键字发现模式下使用 Pocketsphinx。要尝试它,您需要从主干检查最新的开发版本并在文件上运行检测:

         pocketsphinx_continuouos -kws "oh mighty computer" -infile file.wav
    

    不需要互联网连接,消除噪音,您将能够调整检测阈值和关键字发音。

    您可以通过 Python API 使用 pocketspinx:

    config = Decoder.default_config()
    config.set_string('-kws', "oh mighty computer")
    decoder = Decoder(config)
    
    decoder.start_utt('')
    stream = open(path.join('file.wav'), 'rb')
    while True:
        buf = stream.read(1024)
        decoder.process_raw(buf, False, False)
    

    【讨论】:

    • 谢谢 - 这绝对有帮助,我会试一试。实际上,我最初计划使用 Pocketsphinx,但由于最终部署将在 Raspberry Pi 上,因此就设置/安装而言,上述实现似乎更容易。您对如何优化我的原始代码有任何想法吗?
    • 不,没有想法。将音频流式传输到 google 被设计破坏了。
    猜你喜欢
    • 2017-12-15
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多