我正在用 Python 创建语音助手,并希望将其包装在 GUI 中。我用的是kivy。当您按下开始录制声音和识别(通过循环)的按钮时,图形窗口将冻结,只有控制台工作。问题:是否可以在 kivy 中实现我想要的,如果可以,如何实现?如果不是,我应该为这个任务使用哪个 GUI 包装器?(为了循环工作,或者如何更换它们以及如何更换它们?)
在下面的代码中,我删除了所有多余的东西,只留下了问题的本质。
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()
当我点击按钮时,我会打开一个新的流,其中包含一个无限的监听循环。