【问题标题】:Running speech_recognition on tkinter makes it freeze在 tkinter 上运行 speech_recognition 使其冻结
【发布时间】:2016-04-01 02:26:21
【问题描述】:

我正在编写一个程序,你可以与它交谈并且它会像 siri 一样响应。我正在使用谷歌的语音识别和espeak 来听和说。然后将对话打印到文本框。

当程序被要求使用语音识别进行收听时,它会冻结并再次单击 GUI,然后显示“没有响应”,是我运行错了还是无法在 tkinter 中运行语音识别?

为什么会结冰?

这是我到目前为止编写的全部代码:

import tkinter as tk
from subprocess import call as say
import winsound
import speech_recognition as sr

def cbc(tex):

    return lambda : callback(tex)

def callback(tex):
    button = "Listen" 

    tex.insert(tk.END, button)
    tex.see(tk.END)# Scroll if necessary

def listen(tex):

        say('espeak '+"Say,,your,,command,,after,,the,,beep", shell=True)
        winsound.Beep(1000,500)

        ltext = 'listening...'
        tex.insert(tk.END, ltext)
        tex.see(tk.END)

        r = sr.Recognizer()

        with sr.Microphone() as source:
            damand = r.listen(source)

        damandtxt = (recognizer_google(damand))
        tex.insert(tk.END, damandtxt)
        tex.see(tk.END)



top = tk.Tk()
tex = tk.Text(master=top)
tex.pack(side=tk.RIGHT)
bop = tk.Frame()
bop.pack(side=tk.LEFT)


tk.Button(bop, text='Listen', command=lambda: listen(tex)).pack()
tk.Button(bop, text='Exit', command=top.destroy).pack()

top.mainloop()

【问题讨论】:

  • 这是因为您的计算机一次只能做一件事。当它在监听时,它不能处理任何 GUI 操作。为了防止这种情况发生,请尝试使用多个线程来解决此问题。
  • @Dzhao 如何添加多个线程?抱歉,我对 python 很陌生。
  • 刚刚更新了我的答案。 a_thread = threading.Thread(target = callback(tex)) 行需要 callback 函数的输入。
  • stackoverflow.com/questions/56343553/… Dzhao 先生能帮我解决这个问题吗?

标签: python python-3.x tkinter speech-recognition


【解决方案1】:

运行脚本时,您的计算机一次只能做一件事。因此,例如,如果您希望它侦听,则计算机在执行当前命令时将无法运行任何其他命令。解决这个问题的方法是使用多个线程,这样你的计算机就可以一次做两件事。查看 Python 的线程模块。老实说,我对这方面也不太了解,但这是我在自己的 GUI 中实现的。

import tkinter as tk
from subprocess import call as say
import winsound
import speech_recognition as sr

import threading

def cbc(tex):

    return lambda : callback(tex)

def callback(tex):
    button = "Listen" 

    tex.insert(tk.END, button)
    tex.see(tk.END)# Scroll if necessary

def listen(tex):
    def callback(tex):
        say('espeak '+"Say,,your,,command,,after,,the,,beep", shell=True)
        winsound.Beep(1000,500)

        ltext = 'listening...'
        tex.insert(tk.END, ltext)
        tex.see(tk.END)

        r = sr.Recognizer()

        with sr.Microphone() as source:
            damand = r.listen(source)

        damandtxt = (recognizer_google(damand))
        tex.insert(tk.END, damandtxt)
        tex.see(tk.END)

    a_thread = threading.Thread(target = callback(tex))
    a_thread.start()

top = tk.Tk()
tex = tk.Text(master=top)
tex.pack(side=tk.RIGHT)
bop = tk.Frame()
bop.pack(side=tk.LEFT)


tk.Button(bop, text='Listen', command=lambda: listen(tex)).pack()
tk.Button(bop, text='Exit', command=top.destroy).pack()

top.mainloop()

基本思想是创建一个线程对象,然后给它一个函数来运行。然后当你想运行这个线程时,调用线程的start() 方法。绝对是read,因为当同时运行多个线程时,事情会变得很糟糕。

【讨论】:

  • 好的,谢谢,我会坚决阅读线程,因为看起来我会经常使用它。
猜你喜欢
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2018-12-30
  • 2015-04-08
  • 2018-10-11
  • 2015-11-27
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多