0

有什么方法可以暂停、恢复和停止 pyttsx3 说话?

我尝试了很多方法,但我找不到解决方案。

这是代码:

from tkinter import *
import pyttsx3
import threading

root = Tk()

def read():
    engine.say(text.get(1.0 , END))
    engine.runAndWait()

def stop():
    # Code to stop pyttsx3 from speaking
    pass

def pause():
    # Code to pause pyttsx3
    pass

def unpause():
    # Code to unpause pyttsx3
    pass

engine = pyttsx3.init()

text = Text(width = 65 , height = 20 , font = "consolas 14")
text.pack()

text.insert(END , "This is a text widget\n"*10)

read_button = Button(root , text = "Read aloud" , command = lambda: threading.Thread(target=read, daemon=True).start())
read_button.pack(pady = 20)

pause_button = Button(root , text = "Pause" , command = lambda: threading.Thread(target=pause , daemon = True).start())
pause_button.pack()

unpause_button = Button(root , text = "Unpause" , command = unpause)
unpause_button.pack(pady = 20)

stop_button = Button(root , text = "Stop" , command = threading.Thread(target=stop, daemon = True).start())
stop_button.pack()

mainloop()

我想要的是通过单击按钮随时暂停、恢复和停止 pyttsx3。

有没有办法在 tkinter 中实现这一点?

如果有人可以帮助我,那就太好了。

4

1 回答 1

2

没有提供暂停和恢复功能pyttsx3,但是您可以通过将句子拆分为单词来模拟这些功能,然后逐字逐句地说。在单词之间,您可以检查是否单击了暂停、取消暂停或停止按钮并执行相应的操作:

from tkinter import *
import pyttsx3
import threading

root = Tk()

class Speaking(threading.Thread):
    def __init__(self, sentence, **kw):
        super().__init__(**kw)
        self.words = sentence.split()
        self.paused = False

    def run(self):
        self.running = True
        while self.words and self.running:
            if not self.paused:
                word = self.words.pop(0)
                print(word)
                engine.say(word)
                engine.runAndWait()
        print("finished")
        self.running = False

    def stop(self):
        self.running = False

    def pause(self):
        self.paused = True

    def resume(self):
        self.paused = False

speak = None

def read():
    global speak
    if speak is None or not speak.running:
        speak = Speaking(text.get(1.0, END), daemon=True)
        speak.start()

def stop():
    global speak
    if speak:
        speak.stop()
        speak = None

def pause():
    if speak:
        speak.pause()

def unpause():
    if speak:
        speak.resume()

engine = pyttsx3.init()

text = Text(width=65, height=20, font="consolas 14")
text.pack()

text.insert(END, "This is a text widget\n"*10)

read_button = Button(root, text="Read aloud", command=read)
read_button.pack(pady=20)

pause_button = Button(root, text="Pause", command=pause)
pause_button.pack()

unpause_button = Button(root, text="Unpause", command=unpause)
unpause_button.pack(pady=20)

stop_button = Button(root, text="Stop", command=stop)
stop_button.pack()

mainloop()

更新:pygame作为播放器使用:

from tkinter import *
import pyttsx3
import pygame

pygame.mixer.init()
engine = pyttsx3.init()

root = Tk()

def read():
    outfile = "temp.wav"
    engine.save_to_file(text.get('1.0', END), outfile)
    engine.runAndWait()
    pygame.mixer.music.load(outfile)
    pygame.mixer.music.play()

def stop():
    pygame.mixer.music.stop()

def pause():
    pygame.mixer.music.pause()

def unpause():
    pygame.mixer.music.unpause()


text = Text(width=65, height=20, font="consolas 14")
text.pack()

text.insert(END, "This is a text widget\n"*10)

read_button = Button(root, text="Read aloud", command=read)
read_button.pack(pady=20)

pause_button = Button(root, text="Pause", command=pause)
pause_button.pack()

unpause_button = Button(root, text="Unpause", command=unpause)
unpause_button.pack(pady=20)

stop_button = Button(root, text="Stop", command=stop)
stop_button.pack()

mainloop()
于 2021-01-15T04:59:42.310 回答