2017-11-21 20 views
0

pyqt에서 내 chatbot 용 Gui를 만들고 있지만이 영역의 코드에는 약간의 문제가 있습니다.PyQt에서 pyttsx 사용

def __init__(self): 
    super(Window, self).__init__() 
    self.setGeometry(50, 50, 500, 300) 
    self.setWindowTitle("Chatbot 0.3") 


def offline_speak(chat_speech): 
    engine = pyttsx.init() 
    engine.say(chat_speech) 
    engine.runAndWait() 

몇 가지 다음 데프 offline_speak (자기)와 같은을 변경 초기화 위에 그것을에서 언급같은 self.offline_speak()을하지만 난 엔진 코드에 대해 아무 생각이 없습니다.

아무에게도 제안 할 수 있습니까?

답변

0

offline_speak()을 클래스의 메서드로 만들 필요는 없지만이 작업은 매우 시간이 많이 걸릴 수 있으므로 Qt에서 생성 된 mainloop을 차단할 수 있으므로 표시 할 때 두 번째 스레드에서 실행하는 것이 좋습니다. QRunnable

import pyttsx 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 


class SpeechRunnable(QRunnable): 
    def __init__(self): 
     QRunnable.__init__(self) 
    def run(self): 
     self.engine = pyttsx.init() 
     self.engine.say(self.chat_speech) 
     self.engine.runAndWait() 

    def say(self, text): 
     self.chat_speech = text 
     QThreadPool.globalInstance().start(self) 

    def stop(self): 
     self.engine.stop() 


class Window(QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     self.runnable = None 
     self.setWindowTitle("Chatbot 0.3") 
     lay = QVBoxLayout(self) 
     self.le = QLineEdit(text, self) 
     self.btnStart = QPushButton("start", self) 
     self.btnStop = QPushButton("stop", self) 
     self.btnStart.clicked.connect(self.onClickedStart) 
     lay.addWidget(self.le) 
     lay.addWidget(self.btnStart) 
     lay.addWidget(self.btnStop) 


    def onClickedStart(self): 
     self.runnable = SpeechRunnable() 
     self.runnable.say(self.le.text()) 
     self.btnStop.clicked.connect(self.runnable.stop) 

    def closeEvent(self, event): 
     if self.runnable is not None: 
      self.runnable.stop() 
      QThread.msleep(100) #delay 
     super(Window, self).closeEvent(event) 
text = """ 

What is Lorem Ipsum? 
Lorem Ipsum is simply dummy text of the printing and typesetting industry. 
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 
when an unknown printer took a galley of type and scrambled it to make a type specimen book. 
It has survived not only five centuries, but also the leap into electronic typesetting, 
remaining essentially unchanged. 
It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, 
and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum. 
""" 


if __name__ == "__main__": 
    import sys 

    app = QApplication(sys.argv) 
    w = Window() 
    w.show() 
    sys.exit(app.exec_()) 
+0

QThreadPool의 도움이 응답을 주셔서 감사합니다 그것을 가지고 있지만, 문제는 연설도 프로그램이 닫혀 중지하지 않는 것입니다. mp3 파일로 저장하고 실행할 수 있습니까? Thanks again again :) –

+0

나는 이미 오류를 정정하고 점검하고 올바르게 작동했는지 확인하는 것을 잊지 마십시오. – eyllanesc

+0

고맙습니다.하지만 PyQt4를 사용하고 PyQt5를 PyQt4로 변경했지만 QtWidget이 없습니다. 그래서 PyQt.Gui 또는 다른 것과 같이 가야합니까? –