from PyQt4 import QtCore import random # WIP - DON'T USE class SpeechThread(QtCore.QThread): say = QtCore.pyqtSignal(unicode, str) interrupt = QtCore.pyqtSignal() def __init__(self, parent=None): super(SpeechThread, self).__init__(parent) self._queue = [] self._running = True self.say.connect(self._enqueue) self.interrupt.connect(self._interrupt) self.maleVoices = [0, 1, 4, 7] self.femaleVoices = [5, 6, 8, 9, 10] self.speaker = None def run(self): import win32com.client import pythoncom pythoncom.CoInitialize() self.speaker = win32com.client.Dispatch("SAPI.SpVoice") voices = self.speaker.GetVoices() while self._running: if self._queue: text, gender = self._queue.pop(0) if "http" in text: continue if "female" in gender: self.speaker.Voice = voices.Item(random.choice(self.femaleVoices)) else: self.speaker.Voice = voices.Item(random.choice(self.maleVoices)) text = unicode(text.toUtf8(), 'utf-8') self.speaker.Speak(text, 1) else: self.msleep(20) pythoncom.CoUninitialize() def _interrupt(self): if self.speaker: self.speaker.Speak("", 2) self._queue[:] = [] def _enqueue(self, text, gender): self._queue.append([text, gender]) def stop(self): self._interrupt() self._running = False