iOS9 AVSpeechSynthesizer 问题的 AVSpeechUtterance 速率
iOS9 AVSpeechUtterance rate for AVSpeechSynthesizer issue
iOS 9 和 OS 之前版本的 AVSpeechUtterance 速率不同。
这是我必须做出的改变,以便以相同的速度说出句子。我还需要为 iOS9 做任何其他更改吗?
似乎 AVSpeechUtterance.rate 乘以 6.0 效果很好。
谢谢!
我也看到了用新 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
我也遇到过几次这个问题。鉴于最近 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 版本,我选择走这条路,而不是将其硬编码到我的应用程序中。
iOS 9 和 OS 之前版本的 AVSpeechUtterance 速率不同。 这是我必须做出的改变,以便以相同的速度说出句子。我还需要为 iOS9 做任何其他更改吗? 似乎 AVSpeechUtterance.rate 乘以 6.0 效果很好。 谢谢!
我也看到了用新 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
我也遇到过几次这个问题。鉴于最近 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 版本,我选择走这条路,而不是将其硬编码到我的应用程序中。