【问题标题】:Overflow - reader is not reading fast enough PyAudio溢出 - 阅读器阅读速度不够快 PyAudio
【发布时间】:2022-08-05 17:21:43
【问题描述】:

当我遇到问题时,我目前正在尝试使用 Python 构建语音助手。 我正在使用 porcupine/picovoice 进行唤醒词检测,然后我调用一个函数,该函数可以在我调用它时识别出我所说的一切。

这是功能:

def recognizevoicecommand():
    try:
        r = sr.Recognizer()
        print(\"A moment of silence, please...\")
        with sr.Microphone() as source:
            time.sleep(2)
            r.adjust_for_ambient_noise(source)
        print(\"Set minimum energy threshold to {}\".format(r.energy_threshold))
        while True:
            print(\"Say something!\")
            with m as source:
                time.sleep(2)
                print(\"Now!\")
                audio = r.listen(source)
            print(\"Got it! Now to recognize it...\")
            try:
    # recognize speech using Google Speech Recognition
                value = r.recognize_google(audio)
                print(value)
                return value
                break
            except sr.UnknownValueError():
                print(\"OOps\")
                break
    except KeyboardInterrupt:
        pass

如果我只是单独调用该函数,它工作得非常好,可以识别我所说的然后打印出来。

但问题是,一旦我将它与唤醒词检测器一起使用,我就会收到垃圾邮件溢出 - 阅读器阅读速度不够快请稍等片刻...被打印出来。

这是唤醒词检测代码,它自己以及脚本都可以正常工作,问题似乎出在识别部分

    porcupine = pvporcupine.create(access_key = accesskey, keywords=[\'computer\'])
    recorder = PvRecorder(device_index = 0, frame_length = porcupine.frame_length)
    recorder.start()

    while True:
        pcm = recorder.read()
         
        result = porcupine.process(pcm)
        if(result >= 0):
            print(\"Keyword detected\")
            print(recognizevoicecommand())
except pvporcupine.PorcupineInvalidArgumentError as e:
    print(\"One or more arguments provided to Procupine is invalid!\")
    raise e
except pvporcupine.PorcupineActivationError as e:
    print(\"Accesskey denied.\")
    raise e
except pvporcupine.PorcupineActivationLimitError as e:
    print(\"Accesskey has reached it\'s temporary device limit.\")
    raise e
except pvporcupine.PorcupineActivationRefusedError as e:
    print(\"Accesskey refused.\")
    raise e
except pvporcupine.PorcupineActivationThrottledError as e:
    print(\"Accesskey has been throttled.\")
    raise e
except pvporcupine.PorcupineError as e:
    print(\"Failed to initialize Porcupine.\")
    raise e
except KeyboardInterrupt:
    print(\"Stopping\")
finally:
    if porcupine is not None:
        porcupine.delete()
    if recorder is not None:
        recorder.delete()

老实说,我不知道为什么它不起作用。希望能找到解决办法!

    标签: python pyaudio microphone


    【解决方案1】:

    我正在处理类似的任务并遇到同样的问题。我发现解决方案是避免使用两种不同的录音方式。

    PvRecorder 类将记录的数据表示为有符号整数。

    pcm = recorder.read() 
    result = porcupine.process(pcm)
    

    这与 wav 数据通常存储在音频文件中的方式不同。如果您查看 PvRecorder 如何保存 wav 文件,您会发现它们使用 struct 模块:

    sp = struct.pack("h" * len(pcm), *pcm)
    

    您可以使用它来构建要传递的音频文件。 我将它与 Vosk 一起使用,效果很好!

    if self.rec.AcceptWaveform(sp):
        res = json.loads(self.rec.Result())
        if res["text"] != "":
            print(res["text"])
    

    【讨论】:

    • 非常感谢!我想我也遇到了不同的解决方案,但我不确定它是否在所有情况下都有效。我添加了一些额外的代码,当我调用recognizeVoiceCommand 时,它会关闭pvporcupine 录音机,因此一次只运行一个录音机。
    【解决方案2】:

    我遇到了同样的错误,这似乎是 - 正如其他人所指出的 - 音频设备被多个进程使用的结果。我通过在其他操作发生时停止 Pico 录音机然后再次启动它来解决它:

    # Standard setup
    recorder = PvRecorder(
        device_index=self._device_index,
        frame_length=self._picovoice.frame_length,
    )
    recorder.start()
    
    # Stop the recordeer
    recorder.stop()
    
    # Run other function here that uses the device
    
    # Start the recorder again
    recorder.start()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多