首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >溢出读取器读取的PyAudio不够快。

溢出读取器读取的PyAudio不够快。
EN

Stack Overflow用户
提问于 2022-03-01 17:04:31
回答 2查看 413关注 0票数 1

当我遇到问题时,我正在尝试用Python构建一个语音助理。我使用豪猪/皮音来检测唤醒词,然后我调用一个函数,它能识别我所说的每一句话。

这是一项功能:

代码语言:javascript
复制
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

如果我只调用这个函数,它就能很好地工作,识别我说的话,然后打印出来。

但问题是,一旦我将它与唤醒词检测器一起使用,我就会被溢出垃圾处理--在之后,阅读器读取的速度不够快--请静默片刻,请……打印出。

这是wakeword检测代码,它自己工作得很好,在脚本中,问题似乎在识别部分。

代码语言:javascript
复制
    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()

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-04 22:46:10

我正在做一个类似的工作,并且遇到了同样的问题。我发现解决方案是避免使用两种不同的录音方式。

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

代码语言:javascript
复制
pcm = recorder.read() 
result = porcupine.process(pcm)

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

代码语言:javascript
复制
sp = struct.pack("h" * len(pcm), *pcm)

您可以使用它构造要传递的音频文件。我把它和Vosk一起用了,效果很好!

代码语言:javascript
复制
if self.rec.AcceptWaveform(sp):
    res = json.loads(self.rec.Result())
    if res["text"] != "":
        print(res["text"])
票数 2
EN

Stack Overflow用户

发布于 2022-08-05 09:21:43

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

代码语言:javascript
复制
# 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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71312127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档