2015-09-24 18 views
8

對於iOS 9和以前版本的OS,AVSpeechUserrance費率不起作用。 我必須做出哪些改變才能讓句子以相同的速度說出來。我需要爲iOS9做什麼其他更改? 似乎乘以6.0的AVSpeechUtterance.rate工作正常。 謝謝!AVSpeechSynthesizer問題的iOS9 AVSpeechUtterance費率

+0

以什麼方式不適用於iOS9? – Fogmeister

+0

它講得慢得多,所以我把iOS9的速度乘以6.0。但我不喜歡這個解決方案。 – CristiCh

+0

我不會對任何比率使用相同的乘數。合成器之間的差異可能是6倍速,但是這兩個速率開始收斂得越接近1.請參閱下面的Ernie Thomason的答案。 – Gregarious

回答

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 
+0

這似乎是正確的。你還檢查過iOS7嗎? – CristiCh

+1

我剛剛檢查了iOS 7,它對我來說播放速度要慢一些。我從來沒有意識到這一點。例如,我認爲iOS 7需要約.25才能在iOS 8中匹配.015。我提供+/- 3速度控制,因此用戶可以處理這個小差異。 –

+1

對蘋果來說,這真的沒有考慮到,我的應用程序專爲殘疾人士設計,速度必須在所有設備/ iOS版本上完全相同。任何人都知道從版本到版本的確切轉換? –

1

我也碰到過這個問題幾次了。鑑於變化到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漂浮在這麼多版本的意外的行爲,我選擇走這條路,而不是硬編碼到我的應用程序。