pyttsx3 неблокирующая функция для озвучки речи

Я пытаюсь написать неблокирующую функцию speak, которая озвучивает речь. Просто запускать engine.say(text) и engine.runAndWait() через threading нельзя (runAndWait выбрасывает ValueError если старый процесс озвучки не завершён, а новый начат). И я придумал такое решение:

import pyttsx3
import threading
from time import sleep

engine = pyttsx3.init()
voices = [i.id for i in engine.getProperty('voices')]
voice = [i for i in voices if 'TTS_MS_EN-' in i][0]
engine.setProperty('voice', voice)


def speak_runner(text):
    global engine
    engine.say(text)
    while True:
        try:
            engine.runAndWait()
            break
        except:
            sleep(.2)


def speak(text):
    threading.Thread(target=speak_runner, args=(text,), daemon=True).start()


speak('Text that will be taken from here')
speak('Another')
speak('Message')
sleep(30)

Но в моём коде кое-что не работает:

  1. Вместо английского, я получаю русский голос, хотя я в самом начале указал

engine.setProperty('voice', voice)

  1. Я не слышу "Another" и "Message", я слышу только "Text that will be taken from here"

Как это исправить?

import pyttsx3
import threading
from time import sleep

engine = pyttsx3.init()
voices = [i.id for i in engine.getProperty('voices')]
voice = [i for i in voices if 'TTS_MS_EN-' in i][0]
engine.setProperty('voice', voice)
tasks = []

def speak_runner():
    while True:
        if tasks:
            text = tasks.pop(0)
            engine.say(text)
            engine.runAndWait()
            print('next')
        sleep(.2)


def speak(text):
    tasks.append(text)

threading.Thread(target=speak_runner, daemon=True).start()

speak('Text that will be taken from here')
speak('Another')
speak('Message')
sleep(30)

Придумал ещё одно решение. Теперь голос вроде английский, но я не слышу "Another" и "Message", я слышу только "Text that will be taken from here". И next не выводится.

Спасибо


Ответы (0 шт):