如何在文本转语音中延长单词间的停顿(pyTTS 或 SAPI5)

5 投票
3 回答
13538 浏览
提问于 2025-04-16 07:01

使用SAPI5的文本转语音时,能否增加说话单词之间的间隔?

问题是,特别是某些语音的情况下,单词几乎是连在一起的,这让人听起来很难理解。

我在使用Python和pyTTS模块(在Windows上,因为它使用SAPI)。

我尝试连接到OnWord事件,并添加time.sleep()或tts.Pause(),但显然即使所有事件都被捕获,它们也只在说完文本的最后才被处理,无论我使用同步还是异步标志。

在这个不工作的例子中,sleep()方法只在句子说完后执行:

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

tts.OnWord = f
tts.Speak(text)

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

对我来说,实际的解决方案是:

  • 每个单词都用自己的“说”命令来说(这是@Lennart Regebro建议的),或者
  • 用逗号替换每个空格(@Dawson提到的),例如:

    text = text.replace(" ", ",")

这样就能设置一个合理的停顿。我没有进一步研究Pause方法,因为我对被接受的解决方案很满意。

3 个回答

0

我之前用过.NET的API做一些文本转语音的工作。在System.Speech.Synthesis这个命名空间里,有一个叫PromptBreak的枚举,它有不同的值来表示你想要的暂停或停顿的长度:http://msdn.microsoft.com/en-us/library/system.speech.synthesis.promptbreak.aspx

我不知道这个在PyTTS中能否使用或者怎么用,但也许这可以作为一个起点。

2

我这里没有什么特别好的解决办法。不过:

PyTTS最后一次更新是在2007年,而且似乎没有什么文档。现在同一组人维护着一个跨平台的库,叫做pyttsx,它也支持SAPI。这个库有每分钟多少个单词的设置,但没有增加单词之间停顿的选项。这很可能是因为单词之间根本就没有停顿。

你可以通过把每个单词当作一个独立的“发声”来插入较长的停顿。

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

而不是

engine.say('The quick brown fox."

不过这样可能会长。除此之外,你可能需要对SAPI驱动进行封装或子类化,但我不敢保证这样能行。人们在说话时通常不会在单词之间停顿,所以我不确定语音引擎本身是否支持这个功能。

2

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

Pause() 我觉得,它的作用就像我们平常说话时的逗号……不过你可以自己决定停顿的时间(可以是自然的,也可以不是)。

撰写回答