首页 > 解决方案 > 在 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()

标签: pythonkivy

解决方案


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

  • import speech_recognition as sr不应该在按钮点击事件上,而是在应用程序的创建上。
  • 更值得怀疑,但你可以为r = sr.Recognizer()(我愿意)做同样的事情

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


推荐阅读