python - 在 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 中线程并不太难。
推荐阅读
- r - 按列分组并折叠所有其他没有 NA 的列
- azure - 我想在自动化帐户上创建一个运行手册,其中已经通过 arm 连接到它
- php - Laravel Model Create 方法返回不完整的字段模型实例
- c++ - 模数(浮点数)与分支
- gmail-api - WinError 10054 使用 Python 通过 Gmail API 发送带附件的电子邮件时,远程主机强制关闭现有连接
- node.js - 如何使用 flask 和 node.js 设置 HTTPS?
- php - PHP 不正确的变量声明
- selenium-webdriver - Jenkins 中为 TestNG 报告的实时测试
- c++ - 结构内的联合——如何指定初始化程序?
- ios - NSLayoutConstraint 没有成员“属性”