Сбой потока Pyaudio на Raspberry Pi4
Я запускаю поток pyaudio как часть приложения голосового помощника, которое я пишу. Поток pyaudio является непрерывным и записывает данные в буфер, из которого другие компоненты приложения могут читать, чтобы обнаружить такие вещи, как слово пробуждения и т. д. Эти другие компоненты находятся в отдельном потоке при чтении из буфера и вообще не изменяют буфер. Я сталкиваюсь с ситуацией, когда запускаю его на Raspberry Pi4, где он работает изначально, он может обнаружить слово пробуждения и записать мою команду. Но когда обнаруживается второе слово пробуждения, происходит сбой. На Windows и Mac этого не происходит.
Это код, который запускает поток pyaudio
import queue
import pyaudio
import time
class Stream():
def __init__(self,
node,
frames_per_buffer: int = 1024,
recording_buffer_size: int = 12
):
self.mic_idx = node.mic_idx
self.sample_rate = node.sample_rate
self.sample_width = node.sample_width
self.channels = node.audio_channels
self.frames_per_buffer = frames_per_buffer
# Define a buffer to store audio frames
self.buffer = queue.Queue()
def start(self):
self.record()
def record(self):
pass
def get_chunk(self) -> bytes:
return self.buffer.get()
def clear(self):
self.buffer.queue.clear()
class PyaudioStream(Stream):
def record(self):
try:
audio = pyaudio.PyAudio()
def callback(in_data, frame_count, time_info, status):
if in_data:
self.buffer.put(in_data)
return (None, pyaudio.paContinue)
# Open device
mic = audio.open(
input_device_index=self.mic_idx,
channels=self.channels,
format=audio.get_format_from_width(self.sample_width),
rate=self.sample_rate,
frames_per_buffer=self.frames_per_buffer,
input=True,
stream_callback=callback
)
assert mic is not None
mic.start_stream()
print("Pyaudio stream started")
while mic.is_active():
time.sleep(0.1)
print("Finished recording")
mic.stop_stream()
audio.terminate()
except Exception as e:
print(repr(e))
print("Error recording")
raise e
Это сама ошибка
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/home/pi/openvoiceassistant-node/node/__main__.py", line 78, in <module>
run_node()
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/click/core.py", line 1130, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/click/core.py", line 1055, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/click/core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/click/core.py", line 760, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/pi/openvoiceassistant-node/node/__main__.py", line 75, in run_node
node.start()
File "/home/pi/openvoiceassistant-node/node/node.py", line 33, in start
self.stream.start()
File "/home/pi/openvoiceassistant-node/node/stream.py", line 21, in start
self.record()
File "/home/pi/openvoiceassistant-node/node/stream.py", line 69, in record
raise e
File "/home/pi/openvoiceassistant-node/node/stream.py", line 59, in record
while mic.is_active():
^^^^^^^^^^^^^^^
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/pyaudio.py", line 538, in is_active
return pa.is_stream_active(self._stream)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno -10000] PortAudio not initialized
Exception ignored in atexit callback: <function _exit_handler at 0xf6ae7b68>
Traceback (most recent call last):
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/sounddevice.py", line 2874, in _exit_handler
_terminate()
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/sounddevice.py", line 2858, in _terminate
_check(_lib.Pa_Terminate(), 'Error terminating PortAudio')
File "/home/pi/openvoiceassistant-node/env/node/lib/python3.11/site-packages/sounddevice.py", line 2747, in _check
raise PortAudioError(errormsg, err)
Ошибка, похоже, исходит изmic.is_active()
функция
Я не могу найти какие-либо ресурсы, специально связанные с этой ошибкой. Мне было любопытно, имеет ли это какое-либо отношение к переменной среды, которую я установил специально для экспорта Raspberry Pi.PA_ALSA_PLUGHW=1
Я не могу себе представить, что это как-то связано с кодом, считывающим из потока, поскольку, похоже, это не связано с проблемой с буфером.
Я попытался поместить поток pyaudio в основной поток, но это не решило проблему.