python音频侦听器在几分钟后失去质量

python音频侦听器在几分钟后失去质量,python,audio,speech-recognition,speech,Python,Audio,Speech Recognition,Speech,我正在尝试设置一个持久的音频侦听器。这个想法是记录一些音频,发送到谷歌的语音识别API,然后根据所说的内容运行命令。我知道这已经实施了好几次了;事实上,我从这里借用了大量代码(稍加修改): 我希望它能一直在后台运行。现在,它在最初的几分钟内工作得很好,但过了一段时间,录音机停止录音需要更长的时间(即使完全静音),而且我不确定是否正确的音频被发送到了谷歌,因为识别的质量下降得很快。请注意,我目前正在使用一种非常积极的尝试/例外,以避免在录制第一段音频后出现IOErrors。任何更加优雅和/或有效

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

我希望它能一直在后台运行。现在,它在最初的几分钟内工作得很好,但过了一段时间,录音机停止录音需要更长的时间(即使完全静音),而且我不确定是否正确的音频被发送到了谷歌,因为识别的质量下降得很快。请注意,我目前正在使用一种非常积极的尝试/例外,以避免在录制第一段音频后出现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发出请求

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


提前感谢您的帮助。

更有效的方法是在关键字定位模式下使用Pocketsphinx,该模式专为持续收听而设计。要尝试它,您需要从trunk签出最新的开发版本,并在文件上运行spotting:

     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上进行,因此上述实现似乎更容易进行设置/安装。你对如何优化我的原始代码有什么想法吗?没有,没有想法。谷歌的音频流被设计打破了。