Python 3.x Python:OSError:[Errno-9985]在Raspberry PI 3B+上使用雪人和语音识别时设备不可用;

Python 3.x Python:OSError:[Errno-9985]在Raspberry PI 3B+上使用雪人和语音识别时设备不可用;,python-3.x,speech-recognition,raspberry-pi3,snowboy,raspbian-buster,Python 3.x,Speech Recognition,Raspberry Pi3,Snowboy,Raspbian Buster,我正在我的3B+上建立一个个人助理。我现在要做的是使用Snowboy来检测我的hotword(工作完美),然后在检测到hotword后,使用SpeechRecognitor来接收语音命令。Hotword检测工作正常,调用sr.microscope()时会发生错误 示例代码: import speech_recognition as sr import snowboydecoder def detected_callback(): r = sr.Recognizer() with

我正在我的3B+上建立一个个人助理。我现在要做的是使用Snowboy来检测我的hotword(工作完美),然后在检测到hotword后,使用SpeechRecognitor来接收语音命令。Hotword检测工作正常,调用sr.microscope()时会发生错误

示例代码:

import speech_recognition as sr
import snowboydecoder

def detected_callback():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print('Ready...')
        r.adjust_for_ambient_noise(source, duration=.2)
        audio = r.listen(source)

    try:
        command = r.recognize_google(audio).lower()
        print('You said: ' + command + '\n')

    except sr.UnknownValueError:
        print('Your last command couldn\'t be heard')
        comand = None

detector = snowboydecoder.HotwordDetector("SnowboyDependencies/Ancilla.pmdl", sensitivity=.5, audio_gain=1)
detector.start(detected_callback)
我收到以下输出:

INFO:snowboy:Keyword 1 detected at time: 2020-03-24 21:53:35
Expression 'ret' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1736
Expression 'AlsaOpen( &alsaApi->baseHostApiRep, params, streamDir, &self->pcm )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 1904
Expression 'PaAlsaStreamComponent_Initialize( &self->capture, alsaApi, inParams, StreamDirection_In, NULL != callback )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2171
Expression 'PaAlsaStream_Initialize( stream, alsaHostApi, inputParameters, outputParameters, sampleRate, framesPerBuffer, callback, streamFlags, userData )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 2840
Traceback (most recent call last):
  File "sttTest.py", line 43, in <module>
    detector.start(detected_callback)
  File "/home/pi/AncillaFiles/SnowboyDependencies/snowboydecoder.py", line 221, in start
    callback()
  File "sttTest.py", line 27, in detected_callback
    with sr.Microphone(device_index = 2, sample_rate = 44100, chunk_size = 512) as source:
  File "/home/pi/.local/lib/python3.7/site-packages/speech_recognition/__init__.py", line 141, in __enter__
    input=True,  # stream is an input stream
  File "/usr/local/lib/python3.7/dist-packages/pyaudio.py", line 750, in open
    stream = Stream(self, *args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/pyaudio.py", line 441, in __init__
    self._stream = pa.open(**arguments)
OSError: [Errno -9985] Device unavailable
INFO:snowboy:在时间2020-03-24 21:53:35检测到关键词1
表达式'ret'在'src/hostapi/alsa/pa_linux_alsa.c'中失败,行:1736
表达式“AlsaOpen(&alsaApi->baseHostApiRep,params,streamDir,&self->pcm)”在“src/hostapi/alsa/pa_linux_alsa.c”中失败,行:1904
“src/hostapi/alsa/pa_linux_alsa.c”行中的表达式“paalstreamcomponent_Initialize(&self->capture,alsaApi,inParams,StreamDirection_In,NULL!=callback)”失败
“src/hostapi/alsa/pa_linux_alsa.c”行中的表达式“paalstream_Initialize(stream,alsaHostApi,inputParameters,outputParameters,sampleRate,framesPerBuffer,callback,streamFlags,userData)”失败
回溯(最近一次呼叫最后一次):
文件“sttTest.py”,第43行,在
检测器启动(检测到\u回调)
文件“/home/pi/AncillaFiles/SnowboyDependencies/snowboydecoder.py”,第221行,开始
回调函数()
文件“sttTest.py”,第27行,在检测到的\u回调中
以sr.话筒(设备索引=2,采样率=44100,块大小=512)作为源:
文件“/home/pi/.local/lib/python3.7/site packages/speech_recognition/_init__.py”,第141行,输入__
input=True,#流是一个输入流
文件“/usr/local/lib/python3.7/dist-packages/pyaudio.py”,第750行,打开
流=流(自,*args,**kwargs)
文件“/usr/local/lib/python3.7/dist packages/pyaudio.py”,第441行,在__
self.\u stream=pa.open(**参数)
OSError:[Errno-9985]设备不可用
雪人工作得很好。程序按预期运行,直到检测到热词。我想这一定与雪人和语音识别公司试图使用麦克风有关。还要注意的是,SpeechRecognition本身工作得很好。如果我创建一个只使用SpeechRecognition而不是Snowboy的程序,它会按预期工作

我在树莓Pi3B+上使用Python3运行树莓Buster


如果我能提供更多信息,请告诉我。

解决方案是在初始化麦克风之前终止snowboy 例:


解决方案是在初始化麦克风之前终止snowboy 例:

问题是,(雪人和SpeechRec)都试图连接到你的麦克风。第二次连接尝试将被拒绝

几天前我也有同样的问题。@Mezex的解决方案很好,在我的情况下,关闭Snowboy和打开SpeechRec只需要很长时间(大约2或3秒,直到它准备好聆听)

我的解决方案涉及ALSA。有一个名为
dsnoop
的插件,它类似于一个设备文件,可以被多个程序调用

文件
/etc/asound.config
决定如何处理操作系统的声音。如果将其更改为:

defaults.pcm.rate_converter "samplerate"

pcm.!default {
    type asym
    playback.pcm "playback"
    capture.pcm "capture"
}

pcm.playback {
    type plug
    slave.pcm "dmixed"
}

pcm.capture {
    type plug
    slave.pcm "array"
}

pcm.dmixed {
    type dmix
    slave.pcm "hw:name_of_your_speaker"
    ipc_key 555555
}

pcm.array {
    type dsnoop
    slave {
        pcm "hw:name_of_your_Mic"
        channels 2
    }
    ipc_key 666666
}
并删除您的
~/asoundrc
文件,它应该可以工作

您将通过
arecord-l

pcm。!默认情况下会调用default
。它将输入流(您的麦克风)指向
caputre
,后者指向
array
。这是通过可由多个任务同时调用的dsnoop类型实现的

看看,这里有所有的插件列表

我知道这有点复杂,但对我来说这是最好的解决办法。希望有帮助。

问题是,(雪人和SpeechRec)都尝试连接到麦克风。第二次连接尝试将被拒绝

几天前我也有同样的问题。@Mezex的解决方案很好,在我的情况下,关闭Snowboy和打开SpeechRec只需要很长时间(大约2或3秒,直到它准备好聆听)

我的解决方案涉及ALSA。有一个名为
dsnoop
的插件,它类似于一个设备文件,可以被多个程序调用

文件
/etc/asound.config
决定如何处理操作系统的声音。如果将其更改为:

defaults.pcm.rate_converter "samplerate"

pcm.!default {
    type asym
    playback.pcm "playback"
    capture.pcm "capture"
}

pcm.playback {
    type plug
    slave.pcm "dmixed"
}

pcm.capture {
    type plug
    slave.pcm "array"
}

pcm.dmixed {
    type dmix
    slave.pcm "hw:name_of_your_speaker"
    ipc_key 555555
}

pcm.array {
    type dsnoop
    slave {
        pcm "hw:name_of_your_Mic"
        channels 2
    }
    ipc_key 666666
}
并删除您的
~/asoundrc
文件,它应该可以工作

您将通过
arecord-l

pcm。!默认情况下会调用default
。它将输入流(您的麦克风)指向
caputre
,后者指向
array
。这是通过可由多个任务同时调用的dsnoop类型实现的

看看,这里有所有的插件列表

我知道这有点复杂,但对我来说这是最好的解决办法。希望有帮助