Сбой потока 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 в основной поток, но это не решило проблему.

0 ответов

Другие вопросы по тегам