实时速度和音调调整Swift

时间:2019-04-24 15:33:16

标签: ios swift uislider avspeechsynthesizer

我正在使用AVSpeechSynthesizer设置一个tts应用程序。我必须进行实时音高和速率调整。我正在使用UISLider来调整音高和速率。

这是我的代码:-

@IBAction func sl(_ sender: UISlider) {
    if synthesizer.isSpeaking {
        synthesizer.stopSpeaking(at: .immediate)

        self.rate = sender.value

        if currentRange.length > 0 {
            let valuee = currentRange.length + currentRange.location
            let neww = self.tvEditor.text.dropFirst(valuee)
            self.tvEditor.text = String(neww)
            synthesizer.speak(buildUtterance(for: rate, pitch: pitch, with: String(neww), language: self.preferredVoiceLanguageCode2 ?? "en"))
        }
    } else {

    }
}

1 个答案:

答案 0 :(得分:1)

即使没有提供详细信息,我也可能已经理解您的问题:您无法考虑ratepitchMultiplier 的新值语音正在运行

为解释以下详细信息,我阅读了this example,其中包含代码片段(ObjC,Swift)和插图。 enter image description here

  1. 使用其AVSpeechUtterancerate属性创建pitchMultiplier实例。
  2. 将它们中的每一个添加到一个代表要说出的队列的数组中。
  3. 使用合成器在上一个队列中循环以读取每个元素。

现在,如果要实时更改属性值,请在其中一个滑块移动后查看以下步骤:

  1. 借助AVSpeechSynthesizerDelegate协议,获取当前的语音。
  2. 运行stopSpeaking合成器方法,该方法将从队列中删除尚未讲出的讲话。
  3. 使用新的属性值创建之前删除的语音。
  4. 重做步骤2 /和3 /以使用这些更新的值恢复到您停止的位置。

在您要求不影响所存储话语的新值之前,合成器会将所有要说的信息放入队列中。您必须删除并重新创建具有新属性值的话语

如果上面链接提供的代码示例还不够,我建议看一下this WWDC video detailed summaryAVSpeechSynthesizer的处理。