【问题标题】:iOS9 AVSpeechUtterance rate for AVSpeechSynthesizer issueAVSpeechSynthesizer 问题的 iOS9 AVSpeechUtterance 速率
【发布时间】:2015-09-24 12:50:40
【问题描述】:

对于 iOS 9 和之前版本的操作系统,AVSpeechUtterance 速率的工作方式不同。 这是我必须做出的改变,以便以相同的速度说出句子。我还需要为 iOS9 做任何其他更改吗? 似乎将 AVSpeechUtterance.rate 乘以 6.0 效果很好。 谢谢!

【问题讨论】:

  • iOS9 有什么不一样的地方?
  • 它说得慢很多,所以我将 iOS9 的速率乘以 6.0。但我不喜欢这种解决方案。
  • 我不会对任何比率使用相同的乘数。合成器之间的差异可能是 6 倍,速度较慢,但​​是当您接近 1 时,这两个速率开始收敛。请参阅下面 Ernie Thomason 的回答。

标签: iphone xcode ios9 avspeechsynthesizer


【解决方案1】:

我还看到了使用新 XCode 编译后的变化。以下是我从旧速度到新速度的映射。如果设备是 = iOS9,我现在有不同的速度分配。

           iOS 8   iOS 9
Very Slow  0       0.42
Slower     0.06    0.5
My Normal  0.15    0.53
Faster     0.23    0.56

【讨论】:

  • 这似乎是正确的。你也检查过iOS7吗?
  • 我刚刚检查了 iOS 7。它对我来说比 iOS 8 慢一点。我以前从未意识到这一点。例如,我认为 iOS 7 需要大约 0.25 才能使其与 iOS 8 中的 0.015 匹配。我提供了 +/- 3 的速度控制,以便用户可以处理这个微小的差异。
  • 这对 Apple 来说真的没有考虑,我的应用程序是为残障人士设计的,并且速度必须在所有设备/iOS 版本上完全相同。有人知道从版本到版本的确切转换吗?
【解决方案2】:

我也遇到过几次这个问题。鉴于最近 iOS 的变化频率,我根据用户在AppDelegate.swift 中运行的 iOS 版本设置了默认语速,如下所示:

// iOS speech synthesis is flakey between 8 and 9, so set default utterance rate based on iOS version
if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 8, minorVersion: 0, patchVersion: 0)) {
    NSUserDefaults.standardUserDefaults().setFloat(0.15, forKey: "defaultSpeechRate")
    if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 9, minorVersion: 0, patchVersion: 0)) {
        NSUserDefaults.standardUserDefaults().setFloat(0.53, forKey: "defaultSpeechRate")
    }
} else {
    NSUserDefaults.standardUserDefaults().setFloat(0.5, forKey: "defaultSpeechRate")
}

在我的偏好场景中,我添加了一个滑块来调整速率:

@IBOutlet var speechRateSlider: UISlider!

viewDidLoad 中,我添加了以下内容:

    // Set speech rate
    speechRateSlider.value = NSUserDefaults.standardUserDefaults().floatForKey("defaultSpeechRate")
    speechRateSlider.maximumValue = 1.0
    speechRateSlider.minimumValue = 0.0
    speechRateSlider.continuous = true
    speechRateSlider.addTarget(self, action: "adjustSpeechRate:", forControlEvents: UIControlEvents.ValueChanged)

我还将一个动作绑定到UISlider

@IBAction func adjustSpeechRate(sender: AnyObject) {

    NSUserDefaults.standardUserDefaults().setFloat(speechRateSlider.value, forKey: "defaultSpeechRate")
    speechRateSlider.setValue(NSUserDefaults.standardUserDefaults().floatForKey("defaultSpeechRate"), animated: true)
    print(NSUserDefaults.standardUserDefaults().floatForKey("defaultSpeechRate"))
}

考虑到跨设备的意外行为以及浮动的众多 iOS 版本,我选择走这条路,而不是将其硬编码到我的应用程序中。

【讨论】:

    猜你喜欢
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2016-01-03
    相关资源
    最近更新 更多