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)
Но в моём коде кое-что не работает:
- Вместо английского, я получаю русский голос, хотя я в самом начале указал
engine.setProperty('voice', voice)
- Я не слышу "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 не выводится.
Спасибо