0

私のプログラムでは、「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()

ありがとう。

4

1 に答える 1

2

Python のビルトイン Queue クラスを使用して、適切な結果を得ることができます。

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

上記は、私が作成した簡単な例です。「キュー/コンシューマー」モデルを使用して、個別の関数/クラスが同じキューにアクセスできるようにし、キューにアイテムがあるときはいつでも実行されるワーカーを許可します。あなたのニーズに適応するのはかなり簡単なはずです。

Queues についてさらに読む: 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
于 2016-08-21T22:05:23.770 に答える