将外部输入库与Kivy一起使用



如何在Kivy中调用函数,例如在遵循最佳实践的同时使用speech_recognition从用户那里获得音频输入?

我在下面尝试了这种方法(button2调用getAudioInput函数(,如果我允许函数接受任意参数,这种方法就会起作用。当我点击按钮时,它偶尔也会冻结加载图标,更不用说函数嵌套在同一个启动类中了——这些都感觉像是我做错了。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.core.window import Window
class SayHello(App):

def build(self):
Window.borderless = True
self.window = GridLayout()
self.window.cols =1

#
#---nonrelevant code stripped out
#

# Button 2
self.button2 = Button(text="talk", size_hint=(None, None))
self.button2.bind(on_press =self.getAudioInput)
self.window.add_widget(self.button2)

return self.window
def getAudioInput(*argv):
import speech_recognition as sr
# Initialize recognizer class (for recognizing the speech)
r = sr.Recognizer()
# Reading Microphone as source
# listening the speech and store in audio_text variable
with sr.Microphone() as source:
audio_text = r.listen(source)
# recognise throws error if unavailable 
try:
# using google speech recognition
audio_text = str(r.recognize_google(audio_text))
print(audio_text)
except:
print("Sorry, I didn't get that 😓")
return(audio_text)

if __name__ == "__main__":
SayHello().run()

一开始我的应用程序中有很多冻结问题。我通过实验了解到,最好先创建所有东西,然后调用它,而不是在需要的时候创建

  • import speech_recognition as sr不应该出现在按钮点击事件上,而应该出现在应用程序的创建上
  • 更令人质疑,但你可以对r = sr.Recognizer()做同样的事情(我愿意(

如果你尝试不使用kivy的监听器,你会发现r.recognize_google(audio_text)是一个需要时间的函数,所以它与kivy速度无关。实际上,kivy会等待这个长函数完成后再做其他事情,这样你就可以尝试一个小线程了。在不接触ui的情况下,kivy中的线程不会太难。

最新更新