как реализовать цикл прослушивания с микрофона в kivy с дальнейшим распознанием и т.п

Создаю голосового помощника на Python и хотелось бы обернуть его в графический интерфейс. Использовал kivy. При нажатии кнопки, которая запускает запись звука и распознавания(посредством цикла), графическое окно зависает и работает только консоль. Вопрос: возможно ли реализовать то, что я хочу в kivy, если да, то как? если нет, то какую оболочку для графического интерфейса использовать в данной задаче? (чтобы работали циклы, или чем их заменить и как?)

В коде ниже убрал всё лишнее, оставил только саму суть проблемы.

import json, pyaudio
from vosk import Model, KaldiRecognizer
from kivy.config import Config
Config.set('kivy','keyboard_mode','systemanddock')
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=8000)
stream.start_stream()

model_ru_small = Model('C:/1/Python/voice_helper/model_ru_small')
rec_ru_small = KaldiRecognizer(model_ru_small, 16000)

def listen():
    while True:
        data = stream.read(4000, exception_on_overflow=False)
        if (rec_ru_small.AcceptWaveform(data)) and (len(data)>0):
            answer_ru = json.loads(rec_ru_small.Result())
            if answer_ru['text']!='':
                yield answer_ru['text']

def m_n():
    for text in listen():
        print(text)
        if text!='':
            if text=='привет':
                print('привет')
                ## далее идут другие команды..

class MyApp(App):

    def btn_pressed(self, *args):
        m_n()

    def build(self):
        self.title = 'Голосовой помощник'
        box=BoxLayout()
        btn=Button(text='Запуск')
        btn.bind(on_press=self.btn_pressed)
        label=Label(text='Голосовой \n помощник \n 1.0')
        box.add_widget(label)
        box.add_widget(btn)
        return box

if __name__=='__main__':
    MyApp().run()

Ответы (1 шт):

Автор решения: Виталий
def btn_pressed(self, *args):
    thread = Thread(target=m_n)
    thread.start()

При нажатии на кнопку открываю новый поток, который содержит в себе бесконечный цикл прослушки.

→ Ссылка