首页 > 解决方案 > 如何随时停止 pyttsx3 语音

问题描述

我希望 pyttsx 从我的剪贴板读取文本,所以我可以复制文本,然后让计算机为我读取它,它工作得很好,除了它真的很烦人我不能随意停止文本到语音,我要么尽管我已经失去了兴趣,但必须停止整个程序并重新启动或让它完成。

我试过使用engine.startloop和engine.endloop,但它只是让我的代码卡住了,也许有一种方法可以使用startloop,我可以在按下按钮时退出语音,但老实说我不知道​​如何使用startloop .

然后我尝试了这个脚本:

    import win32com.client as wincl
    speak = wincl.Dispatch("SAPI.SpVoice")
    speak.Speak("Hello World")

再次。效果很好,但我不知道如何在演讲中停止它。

哦,是的,我尝试使用线程,问题是 engine.runAndWait() 从字面上使语音运行,其他一切都在等待。

    import keyboard
    import win32clipboard
    import pyttsx3

    def init():
        print("init")
        def start(text):
            engine = pyttsx3.init()
            #more code here but its just setting the volume and speech rate
            engine.say(text,"txt")
            engine.runAndWait()

        def action():
              win32clipboard.OpenClipboard()
              data = win32clipboard.GetClipboardData()
              win32clipboard.CloseClipboard()
              start(data)

        keyboard.add_hotkey("ctrl+alt", lambda: action())

    init()

所以是的,基本上,我正在寻找一种使用热键停止文本到语音的方法,如果 pyttsx3 不可能,那很好,但我想使用不需要互联网的文本到语音模块,因为我的连接是有时安静穷哈哈

标签: python-3.xpyttsx

解决方案


我现在感觉真的很笨,我解决了,我在之前的尝试中使用了 pynput,然后尝试使用键盘,达到了我之前的状态(无法在语音中停止文本)

无论如何,如果您想知道如何让 pyttsx3 关闭用户输入...这里是:

def onWord(name, location, length):
    print ('word', name, location, length)
    if keyboard.is_pressed("esc"):
       engine.stop()

    engine.connect('started-word', onWord)

只需将其复制并粘贴到“engine.say('your text')”上方,引擎将在您按下键盘上的 esc 时停止,同时确保:

     import keyboard

在脚本的顶部


推荐阅读