当我遇到问题时,我正在尝试用Python构建一个语音助理。我使用豪猪/皮音来检测唤醒词,然后我调用一个函数,它能识别我所说的每一句话。
这是一项功能:
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检测代码,它自己工作得很好,在脚本中,问题似乎在识别部分。
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()老实说,我不知道为什么它不起作用。希望能找到解决办法!
发布于 2022-03-04 22:46:10
我正在做一个类似的工作,并且遇到了同样的问题。我发现解决方案是避免使用两种不同的录音方式。
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"])发布于 2022-08-05 09:21:43
我遇到了同样的错误,正如其他人所指出的,这似乎是音频设备被多个进程使用的结果。我解决了这个问题,在另一个动作发生时,我停止了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()https://stackoverflow.com/questions/71312127
复制相似问题