8

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

4

2 回答 2

12

我也看到了用新的 XCode 编译后的变化。以下是我从旧速度到新速度的映射。如果设备是 <= iOS8 或 >= 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
于 2015-10-02T19:31:04.257 回答
2

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

// 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 版本,我选择走这条路,而不是将其硬编码到我的应用程序中。

于 2015-12-09T02:40:31.187 回答