Python pyttsx,如何使用外部循环

时间:2016-08-21 12:16:58

标签: python text-to-speech pyttsx

在我的程序中,我需要类(可以是一些线程)来检查一些列表,如" say_list"当其他类添加一些文本时,pyttsx会说出文本。 我在pyttsx docs中搜索,我发现了一些外部循环功能,但我找不到正确工作的示例。 我想要这样的东西:

import pyttsx
import threading

class VoiceAssistant(threading.Thread):
    def __init__(self):
        super(VoiceAssistant, self).__init__()
        self.engine = pyttsx.init()
        self.say_list = []

    def add_say(self, msg):
        self.say_list.append(msg)

    def run(self):
        while True:
            if len(self.say_list) > 0:
                self.engine.say(self.say_list[0])
                self.say_list.remove(self.say_list[0])


if __name__ == '__main__':
    va = VoiceAssistant()
    va.start()

感谢。

1 个答案:

答案 0 :(得分:1)

我可以通过使用Queue类中内置的python来获得正确的结果:

import pyttsx
from Queue import Queue
from threading import Thread

q = Queue()

def say_loop():
    engine = pyttsx.init()
    while True:
        engine.say(q.get())
        engine.runAndWait()
        q.task_done()

def another_method():
    t = Thread(target=say_loop)
    t.daemon = True
    t.start()
    for i in range(0, 3):
        q.put('Sally sells seashells by the seashore.')
    print "end of another method..."

def third_method():
    q.put('Something Something Something')

if __name__=="__main__":
    another_method()
    third_method()
    q.join() # ends the loop when queue is empty

上面是一个我掀起的简单例子。它使用'队列/消费者'模型允许单独的函数/类访问同一个队列,然后是一个将在队列中有项目时执行的工作者。应该很容易适应您的需求。

进一步阅读有关队列的信息:https://docs.python.org/2/library/queue.html 在您链接的文档中似乎有一个接口,但似乎您已经在单独的线程轨道上,所以这看起来更接近您想要的。

以下是代码的修改版本:

import pyttsx
from Queue import Queue
import threading

class VoiceAssistant(threading.Thread):
    def __init__(self):
        super(VoiceAssistant, self).__init__()
        self.engine = pyttsx.init()
        self.q = Queue()
        self.daemon = True

    def add_say(self, msg):
        self.q.put(msg)

    def run(self):
        while True:
            self.engine.say(self.q.get())
            self.engine.runAndWait()
            self.q.task_done()


if __name__ == '__main__':
    va = VoiceAssistant()
    va.start()
    for i in range(0, 3):
        va.add_say('Sally sells seashells by the seashore.')
    print "now we want to exit..."
    va.q.join() # ends the loop when queue is empty