как реализовать цикл прослушивания с микрофона в 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()
При нажатии на кнопку открываю новый поток, который содержит в себе бесконечный цикл прослушки.