Я работаю на слушателя микрофона с Python (3.7).
Для работы с аудиопотоком я написал функцию, которая запускается в потоке и вызывает себя в конце (хвостовая рекурсия)
class Listener:
# [...]
def __init__(self, audio_conf: AudioConfiguration, listener_callback: Callable[[bytes], None] = None) -> None:
self.__configuration = audio_conf
if listener_callback:
self.__listener_callback = listener_callback
self.__stream = PyAudio().open(format=self.__configuration.FORMAT, # p.get_format_from_width(WIDTH),
channels=self.__configuration.CHANNELS,
rate=self.__configuration.RATE,
input=True,
output=True,
frames_per_buffer=self.__configuration.CHUNK)
thread = Thread(target=self.__listen, args=())
thread.start()
# [...]
def __listen(self) -> None:
if self.__flag_deactivation:
if self.__listener_callback:
print(f"Call listener callback")
p = Process(target=self.__listener_callback, args=(self.__active_buffer,))
p.start()
# p.join()
self.reset_state()
tmp_buffer: bytes = b""
count: int = 0
voice: int = 0
for i in range(0, self.__configuration.FRAMES_LENGTH):
tmp_buffer += self.__stream.read(self.__configuration.CHUNK_SIZE) # read audio stream
count += 1
if self.__mic_tuning.is_voice():
voice += 1
self.__previous_buffer = tmp_buffer
if self.__active:
self.__active_buffer += tmp_buffer
print(f"Listening {'active' if self.__active else 'background'} - Voice Threshold {voice / count}")
self.__listen()
Очевидно, что Python жалуется на «Максимальную глубину рекурсии» ...
Есть ли способ:
избавиться от максимальной глубины рекурсии (но я думаю, что это не очень хорошая идея, это может скрыть некоторые другие проблемы ...)
или переписать это без хвостовой рекурсии (но сохранить эффективность)
Я давно не работаю с Python, поэтому буду рад узнать какой-нибудь "питонический" способ добиться этого без взлома поведения по умолчанию:)
Спасибо!