【问题标题】:SSML - Is it possible to remove automatic break pauses?SSML - 是否可以删除自动中断暂停?
【发布时间】:2021-01-21 03:35:01
【问题描述】:

我正在尝试删除合成处理器添加的自动中断,以创建没有任何“语言暂停”的语音文件。

我正在使用 Microsoft 的语音合成引擎和 C# 中的 SpeechSynthesizer 类。

这是我通过“这是一个为什么会发生自动中断的示例?”得到的输出。用SpeechSynthesizer 包裹在<speak> 标签中:

https://clyp.it/4nofhh3n

这是我想要的输出(使用Oddcast's TTS Demo实现):

https://clyp.it/m55wt14u

我已经多次阅读w3.org's SSML documentation,其中3.2.3 - break element,请注意以下几点:

If the element is not present between tokens, the synthesis processor is expected to automatically determine a break based on the linguistic context. In practice, the break element is most often used to override the typical automatic behavior of a synthesis processor.

这就是我的声音目前的表现。我想以某种方式覆盖/关闭此功能,并让演讲完全不间断。我尝试在上面写的自动中断发生的单词之间放置一个<break>元素,属性strength="none"和time="0ms"覆盖它,以及各种不同的东西,例如将整个文本字符串包装在@987654333中@标签等,无济于事。

我也不能只删除后期处理中的中断,因为当添加自动中断时,语音对所说的话的语调不同。

我已经阅读了几个不同的 SSML 文档,虽然与 w3 文档相比,这些文档的措辞通常有所不同,但没有解释如何具体覆盖自动中断,这是我的问题。

【问题讨论】:

    标签: c# text-to-speech speech-synthesis ssml speechsynthesizer


    【解决方案1】:

    在我的experimenting with SpeechSynthesizer 中,如果您在最后放置 50 毫秒的休息时间,那么它会尊重它 - 如果它更少,那么它将被忽略。 但是,它将始终将 <speak> 包装的内容视为自己的子句,因此将其视为句子/子句,而不是像第二个示例那样带有韵律。您需要在单个 <speak> 元素(和语音)中发送所有文本,以便将其视为单个语言表达。

    【讨论】:

    • 感谢您的回答。在上面的示例中,我将 <voice> 标记中的所有文本包装在单个 <speak> 标记中,这仍然会在句子中间产生中断。我正在使用通常称为“Daniel UK”的外部下载语音 - 标准 Microsoft 语音不会导致此中断。我解决这个问题的方法是列出导致中断发生的每个单词(连词),并使用正则表达式命令用破折号替换空格(中断所在的位置)。结果几乎等同于我上面链接的演示的声音。仍然不知道如何“正确”地做到这一点。
    • 是的,我也注意到了这种行为。破折号是个好主意。我认为你可以让它作为语言表达的唯一方法是为每个声音呈现整个句子,然后使用<mark>s 作为在哪里剪切生成的音频文件的指南。当然,这不是一个理想的解决方案。
    • 是的,<mark> 的想法可能会奏效,但由于在句子/从句末尾所说的单词的变化/语气与不停顿的情况下不同,这会导致语气非常不一致。我认为现在必须使用破折号!
    猜你喜欢
    • 2021-07-26
    • 2018-08-29
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 2015-09-10
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多