代码之家  ›  专栏  ›  技术社区  ›  Berry Tsakala

如何延长文字转换为语音的单词之间的停顿时间(pyTTS或SAPI5)

  •  4
  • Berry Tsakala  · 技术社区  · 14 年前

    在SAPI5中使用文本对语音时,是否可以扩大口语之间的差距?

    问题是,特别是在某些声音中,这些词几乎是相互连接的,这使得讲话更难理解。

    我使用python和pyTTS模块(在windows上,因为它使用SAPI)

    我试图钩住OnWord事件并添加time.sleep()或tts.Pause(),但很明显,即使所有事件都被捕获,它们也只是在口语文本的末尾被处理,无论我使用的是sync还是async标志。

    在这个非工作示例中,sleep()方法仅在语句被说出后执行:

    tts = pyTTS.Create()
    def f(x):
        tts.Pause()
        sleep(0.5)
        tts.Resume()
    
    tts.OnWord = f
    tts.Speak(text)
    

    编辑:--接受的解决方案

    我的实际答案是

    • 在自己的“speak”命令中说出每个单词(由@Lennart Regebro建议),或者
    • 用逗号替换每个空格(如@Dawson所述),例如。

      text=text.replace(“,”,“)

    这就有了一个合理的停顿。我并没有比上面提到的更多地研究暂停方法,因为“我对公认的解决方案感到满意。

    3 回复  |  直到 13 年前
        1
  •  2
  •   Dawson    13 年前

    你说的是语速,对吧? http://msdn.microsoft.com/en-us/library/ms990078.aspx

    Pause()我相信,它的工作原理很像普通语音模式中的逗号…除了你决定长度(自然还是不自然)。

        2
  •  2
  •   Lennart Regebro    13 年前

    我这里没有什么好的解决办法。但是:

    PyTTS上一次发布是在2007年,似乎没有文档。同样的人现在维护一个名为pyttsx的跨平台库,它也支持SAPI。它有每分钟字数设置,但没有设置来增加字数之间的停顿。这很可能是因为两个词之间根本没有停顿。

    你可以通过让每个词都有自己的“话语”来插入一个长的停顿。

    engine.say('The')
    engine.say('quick')
    engine.say('brown')
    engine.say('fox.')
    

    而不是

    engine.say('The quick brown fox."
    

    但那可能是 很长。除此之外,您可能需要包装SAPI驱动程序或对其进行子类化,但我也不能百分之百地确定这是否可行。人们在两个词之间没有停顿,所以我不确定语音引擎本身是否支持它。

        3
  •  0
  •   alimbada    13 年前

    我以前用.netapi做过一些TTS工作。System.Speech.Synthesis命名空间中有一个名为PromptBreak的枚举,该枚举对于所需的暂停/中断长度具有不同的值: http://msdn.microsoft.com/en-us/library/system.speech.synthesis.promptbreak.aspx

    不知道它是否/如何与PyTTS一起使用,但也许这是一个起点。