如何在文本转语音中延长单词间的停顿(pyTTS 或 SAPI5)
使用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 个回答
我之前用过.NET的API做一些文本转语音的工作。在System.Speech.Synthesis这个命名空间里,有一个叫PromptBreak的枚举,它有不同的值来表示你想要的暂停或停顿的长度:http://msdn.microsoft.com/en-us/library/system.speech.synthesis.promptbreak.aspx
我不知道这个在PyTTS中能否使用或者怎么用,但也许这可以作为一个起点。
我这里没有什么特别好的解决办法。不过:
PyTTS最后一次更新是在2007年,而且似乎没有什么文档。现在同一组人维护着一个跨平台的库,叫做pyttsx,它也支持SAPI。这个库有每分钟多少个单词的设置,但没有增加单词之间停顿的选项。这很可能是因为单词之间根本就没有停顿。
你可以通过把每个单词当作一个独立的“发声”来插入较长的停顿。
engine.say('The')
engine.say('quick')
engine.say('brown')
engine.say('fox.')
而不是
engine.say('The quick brown fox."
不过这样可能会太长。除此之外,你可能需要对SAPI驱动进行封装或子类化,但我不敢保证这样能行。人们在说话时通常不会在单词之间停顿,所以我不确定语音引擎本身是否支持这个功能。
你是在说语音的速度,对吧?http://msdn.microsoft.com/en-us/library/ms990078.aspx
Pause() 我觉得,它的作用就像我们平常说话时的逗号……不过你可以自己决定停顿的时间(可以是自然的,也可以不是)。