【问题标题】:Can I estimate synthesized speech duration?我可以估计合成语音的持续时间吗?
【发布时间】:2014-11-16 09:20:23
【问题描述】:

我正在尝试在 Windows 操作系统中从用户输入的特定持续时间的文本生成波形文件。 例如,如果用户想要波形文件的“HH:MM:SS”时间跨度(获取格式为总秒数).. 文本“我爱堆栈溢出”将循环用于“HH:MM:SS”。

如何从文本中计算 Wavfile 的持续时间并生成具有特定持续时间的 Wavefile 并将其保存到磁盘。我需要遵循什么算法或代码?

目前我正在使用 Speech.Synthesis 将文本生成到波形文件,但从文本计算持续时间似乎是个大问题..

【问题讨论】:

    标签: c# signals signal-processing text-to-speech


    【解决方案1】:

    跟踪语音生成的进度。 SpeakProgressEventArgs 具有 AudioPosition 属性,即 TimeSpanSpeak 调用之间的计时会重置,因此如果您有多个短语、句子、ssml 标记或具有不同重点、音量或速率的区域,您可以使用单个 System.Speech.Synthesis.PromptBuilder 来获取整个持续时间。

      SpeechSynthesizer synth = new SpeechSynthesizer();
      synth.SpeakProgress += new EventHandler<SpeakProgressEventArgs>(synth_SpeakProgress);
      //
      string s1 = "I love Stack Overflow";
      PromptBuilder builder = new PromptBuilder();
      builder.AppendSsmlMarkup("I love <emphasis>Stack Overflow</emphasis>");
      builder.AppendText(s1);
      builder.AppendText(s1, PromptEmphasis.Strong);
      builder.AppendText(s1, PromptRate.ExtraFast);
      builder.AppendText(s1,PromptVolume.Loud);
      //
      synth.Speak(builder);    
    
    static void synth_SpeakProgress (object sender, SpeakProgressEventArgs e)
    {
      Console.WriteLine("Speak progress: {0} AudioPosition: {1} Text: {2}", e.CharacterPosition, e.AudioPosition, e.Text);
    }
    

    【讨论】:

    • 嗨..我不明白这里..我想根据用户输入生成波形文件..说如果用户想要 6 分钟的音频循环“我喜欢堆栈溢出”6 分钟..但在这里我想我们不能把它作为输入......可以给我更多的例子。
    • 单次测量长度,速度会影响长度。计算适合您的区间的次数并循环。
    • 我发现与上面的方法有点相反.. 上面的例子讲进度:82 AudioPosition:00:00:00.1000000 文本:我讲进度:84 AudioPosition:00:00:00.2100000 文本: love Speak 进度:99 AudioPosition:00:00:00.4200000 Text:Stack Speak 进度:105 AudioPosition:00:00:00.7850000 Text:Overflow 需要(0.785 ms),但为文本“I love stack overflow”生成了实际 Wave 文件" 需要 2 秒。
    • 显然这取决于机器性能。想法是您可以使用 AudioPosition 的最后(最高)值。
    • 你是对的,我明白了你的想法,但我的问题是如何匹配 2 秒 .. 我需要写什么算法?您在上面看到相同文本的 0.785 毫秒和 2 秒。我该如何匹配它...抱歉问你这个问题,因为我是初学者
    【解决方案2】:

    所以如果我理解正确的话,你想输入一个文本并找出合成器声音说出所需的时间

    这有点不确定,因为每个录制的声音都会以自己的方式发音每个音素。所以我可以说“我爱 Stack Overflow”比别人快或慢。为了创建合成器,Microsoft 使用了不同的声音并要求他们说出不同的文本,并在创建语音时使用与您的文本最佳匹配。

    请注意,说出每个音素的时间也因文本而异。例如“flow”中的“o”时间与“olive”中的“o”时间不同

    这使得无法估计合成器说出您的文本所需的时间。您可以使用 Synthesizer.Rate 参数控制讲话的节奏,但您无法计算讲话所需的确切时间。

    所以我认为如果不使用您想要的文本生成单个录音并从那里获取时间,您无法非常准确地做到这一点

    【讨论】:

    • 嗨,好的,谢谢.. 但让我们以微软默认语音和速率 = 0 为例,您的意思是告诉我们无法计算持续时间.. 使用任何手动算法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多