2017-11-21 3 views
0

Ich mache Gui für meine Chatbot in Pyqt, aber ich habe ein bisschen Problem in diesem Bereich des Codes.Verwenden Sie pyttsx in PyQt

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() 

paar Dinge wie def ändern offline_speak (Selbst-) dann über init wie self.offline_speak erwähnen in(), aber ich habe keine Ahnung von Maschinencode.

Kann mir jemand etwas vorschlagen?

Antwort

0

Es ist nicht notwendig, offline_speak() eine Methode der Klasse zu machen, aber diese Aufgabe kann sehr zeitaufwendig sein, damit sie die von Qt erzeugte Hauptschleife blockieren kann. Daher ist es ratsam, sie in einem zweiten Thread auszuführen die Hilfe von QRunnable und QThreadPool

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

Vielen Dank für die Antwort bekam es aber das Problem ist nicht die Rede nicht stoppt auch das Programm geschlossen wird. Und kann ich es durch MP3-Dateien speichern und ausführen? Danke nochmal :) –

+0

Ich habe den Fehler bereits korrigiert, überprüfen Sie es und wenn es funktioniert, vergessen Sie nicht, es als richtig zu markieren. – eyllanesc

+0

Danke, aber ich benutze PyQt4 und ich änderte die PyQt5 zu PyQt4, aber habe nicht die QtWidget. Also sollte ich mit PyQt.Gui oder so etwas gehen? –