2014-11-03 3 views
1

У меня есть код, который отобразит текст из распознавания речи в текстовое поле.распознавание речи python в Tkinter

Проблема: он просто прослушивает один раз затем останавливается. Мне нужно listen it till,i close the Tkinter.

Если я говорю ясно, то он должен очистить содержимое в текстовом поле. Моя проблема заключается в том, что я не могу напрямую передать содержимое в Tkinter. Он слушает после выхода Shell.

Пожалуйста, помогите мне решить мою проблему.

Coding:

from Tkinter import * 
import pyaudio 
import tkMessageBox 
import Tkinter as tki 
import tkFileDialog as th1 
import speech_recognition as sr 
r = sr.Recognizer() 
with sr.Microphone() as source: 
    audio = r.listen(source) 
try: 
    a=(r.recognize(audio)) 
    print a 
except LookupError:        
    a=("Could not understand audio") 
    print a 
class App(object): 

    def __init__(self,root): 
     self.root = root 

    # create a Frame for the Text and Scrollbar 
     txt_frm = tki.Frame(self.root, width=900, height=900) 
     txt_frm.pack(fill="both", expand=True) 
     # ensure a consistent GUI size 
     txt_frm.grid_propagate(False) 

    # create first Text label, widget and scrollbar 
     self.lbl1 = tki.Label(txt_frm, text="Type") 
     self.lbl1.grid(row=0,column=0,padx=2,pady=2) 

     self.txt1 = tki.Text(txt_frm, borderwidth=3, relief="sunken", height=4,width=55) 
     self.txt1.config(font=("consolas", 12), undo=True, wrap='word') 
     self.txt1.grid(row=25, column=7, sticky="nsew", padx=2, pady=2) 
     self.txt1.insert(0.0,a) 

    def clearBox(self): 
     if a == "clear": 
      self.txt1.delete('1.0', 'end')   
root = tki.Tk() 
app = App(root) 
root.mainloop() 
+0

Для решения этой проблемы вам нужна нить, и поскольку Tkinter не знает про потоки, вам необходимо выполнить последующую функцию для опроса изменений/распознаваний в вашем mainloop. – deets

+0

@deets вы можете помочь мне с небольшим примером, связанным с моим запросом? –

+0

@sarkite: Если у вас есть PyAudio для работы с speech_recognition, как вы, кажется, сделали здесь, не могли бы вы либо закрыть, либо лучше ответить на другой вопрос. http://stackoverflow.com/questions/26666216/pyaudio-build-and-install-python-portaudio-bindings-first – tom10

ответ

3

Вы должны использовать многопоточность для выполнения надлежащего параллельного распознавания речи, а также обновлять содержимое текстовых виджетов, используя после метода, так как Tkinter не поддерживает многопоточность в другом манера.

У меня нет функции распознавания речи, поэтому вам нужно заполнить пробелы и заменить random.choice-call своим фактическим распознаванием речи.

import threading 
import time 
import random 

from Tkinter import * 
import tkMessageBox 
import Tkinter as tki 
import tkFileDialog as th1 

class SpeechRecognizer(threading.Thread): 

    ANSWERS = ["foo", "bar"] 

    def __init__(self): 
     super(SpeechRecognizer, self).__init__() 
     self.setDaemon(True) 
     self.recognized_text = "initial" 

    def run(self): 
     while True: 
      time.sleep(1.0) 
      self.recognized_text = random.choice(self.ANSWERS) 


recognizer = SpeechRecognizer() 
recognizer.start() 

class App(object): 

    def __init__(self,root): 
     self.root = root 

    # create a Frame for the Text and Scrollbar 
     txt_frm = tki.Frame(self.root, width=900, height=900) 
     txt_frm.pack(fill="both", expand=True) 
     # ensure a consistent GUI size 
     txt_frm.grid_propagate(False) 

    # create first Text label, widget and scrollbar 
     self.lbl1 = tki.Label(txt_frm, text="Type") 
     self.lbl1.grid(row=0,column=0,padx=2,pady=2) 

     self.recognized_text = StringVar() 
     self.txt1 = tki.Text(txt_frm, borderwidth=3, relief="sunken", height=4,width=55, 
     ) 
     self.txt1.config(font=("consolas", 12), undo=True, wrap='word') 
     self.txt1.grid(row=25, column=7, sticky="nsew", padx=2, pady=2) 
     root.after(100, self.update_recognized_text) 

    def update_recognized_text(self): 
     self.txt1.delete(0.0, END) 
     self.txt1.insert(0.0, recognizer.recognized_text) 
     root.after(100, self.update_recognized_text) 

    def clearBox(self): 
     if a == "clear": 
      self.txt1.delete('1.0', 'end') 

root = tki.Tk() 
app = App(root) 
root.mainloop() 
+0

Я выполнил вышеупомянутое выполнение и отредактировал случайное с моим распознаванием речи как sgown здесь http://pastebin.com/7Czqq1Pr Но, я могу говорить только один раз, тогда он не распознает и не печатает, и работает так же, как и в моем предыдущем кодировании. Пожалуйста, помогите мне внести некоторые изменения, чтобы я мог говорить, пока я не закрою свой Tkinter. И я не признаю 'clear' –

+0

. Вы должны ввести свой код распознавания речи * внутри * run-method подкласса Thread, а не просто присваивать однократно вычисленное значение снова и снова. – deets

+0

Я задал новый вопрос, касающийся этой проблемы, полностью. http://stackoverflow.com/questions/26731763/tkinter-to-display-and-clear-text-from-speech-recognition Не могли бы вы помочь мне в этом. –

Смежные вопросы