2016-03-31 32 views
0

私はあなたと話すことができ、それはsiriのように応答しました。私はグーグルの音声認識とespeakを使って聴いたり話したりしています。会話はテキストボックスに印刷されます。tkinterでspeech_recognitionを実行するとフリーズします

プログラムが音声認識を使用して聞くように要求されると、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() 
+1

これは、コンピュータが一度に1つのことしか実行できないためです。リッスンしているときは、GUI操作を処理できません。この問題を回避するには、この問題を回避するために複数のスレッドを使用してみてください。 – Dzhao

+0

@Dzhao複数のスレッドを追加するにはどうすればよいですか?すみません、私はPythonの初心者です。 –

+0

私の答えをちょうど更新しました。 'a_thread = threading.Thread(target = callback(tex))'行は 'callback'関数の入力を必要としました。 – Dzhao

答えて

1

スクリプトを実行しているコンピュータが一度に一つのことを行うことができます

は、ここで私はこれまでに書いたコード全体です。たとえば、コンピュータが現在のコマンドを実行している間は、他のコマンドを実行することができません。これを回避して複数のスレッドを使用する方法は、コンピュータであるためすぐに2つのことができます。 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は、一度に複数のスレッドを実行しているときに、物事が毛むくじゃらすることがあるので、これを上にアップしてください。

+0

Okayおかげさまで、私はスレッドを読んで挑戦しています。私はそれをたくさん使っているようです。 –

関連する問題