在我的程序中,我需要类(可以是一些线程)来检查一些列表,如" 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()
感谢。
答案 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