2016-09-15 37 views
3

我是SwiftOS X編程的新手。我正在嘗試使用進度監視器來指示我的講話合成器講話文本的進度。使用NSSpeechStatusNumberOfCharactersLeft更新NSSpeechSynthesizer的進度指示器

let speechSynthesizer = NSSpeechSynthesizer() 
speechSynthesizer.delegate = self; 
speechSynthesizer.startSpeakingString(contents) 

我想設置

progressIndicator.maxValue = Double(NSSpeechStatusNumberOfCharactersLeft.characters.count) 

,然後定期更新NSSpeechStatusNumberOfCharactersLeft的progressIndicator,而根據蘋果的文檔應該打0

每一個辦法,我嘗試訪問該鍵,它返回相同的不準確的數字,所以我顯然沒有正確使用它。我發現的唯一的例子是Objective-C

NSNumber *n = [[self.speechSynth objectForProperty:NSSpeechStatusProperty error:NULL] objectForKey:NSSpeechStatusNumberOfCharactersLeft]; 

,我想那意思就是Swift,但仍然沒有骰子。

let count = try speechSynthesizer.objectForProperty(NSSpeechStatusProperty).objectForKey(NSSpeechStatusNumberOfCharactersLeft) 

我也試過

speechSynthesizer.valueForKey(NSSpeechStatusNumberOfCharactersLeft)) 
speechSynthesizer.valueWithName(NSSpeechStatusNumberOfCharactersLeft, inPropertyWithKey: NSSpeechStatusProperty)) 

其拋出運行時異常。有什麼想法嗎?提前致謝!

+0

好吧,所以事情現在有點怪異。此關鍵NSSpeechStatusNumberOfCharactersLeft只返回一次正確的值,但僅在重新啓動計算機後才返回。 (不要問我是如何注意到:P)它通過訪問它:let count =嘗試speechSynthesizer.objectForProperty(NSSpeechStatusProperty).objectForKey(NSSpeechStatusNumberOfCharactersLeft) 我已經 –

回答

1

你的第二次嘗試是相當接近正確:

let count = try speechSynthesizer.objectForProperty(NSSpeechStatusProperty).objectForKey(NSSpeechStatusNumberOfCharactersLeft) 

沒有一條錯誤信息(因爲我沒有斯威夫特2編譯器方便)我猜,這失敗的原因是,返回值objectForProperty不知道是字典,所以你不能在其中查找值。

這裏是我的快速&髒斯威夫特3操場測試此:

import PlaygroundSupport 
import Cocoa 

let synth = NSSpeechSynthesizer() 
synth.startSpeaking("I'm not standing still, I am lying in wait") 

// quick way to test for progress without setting up an app and delegate 
PlaygroundPage.current.needsIndefiniteExecution = true 
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in 
    let statusDict = try! synth.object(forProperty: NSSpeechStatusProperty) as! [String: Any] 
    print(statusDict[NSSpeechStatusNumberOfCharactersLeft]) 
} 

(當然,你並不需要所有的,如果你正在運行此計時器的東西或操場業務的應用與合成代碼)。

關鍵位(沒有雙關意圖)是將返回值objectForProperty轉換爲Swift知道它是字典,然後查找該字典中的字符數。

現在,這段代碼可以正常運行,但它不能完全用於設置進度條 - 當合成器完成說話時,NSSpeechStatusNumberOfCharactersLeft很可能是某個非零值。 (在這種情況下,另一個狀態鍵NSSpeechStatusOutputBusy將變爲false)。因此,您的進度條將不會達到100%,並且您可以使用NSSpeechStatusOutputBusy鍵或代表didFinishSpeaking回調使您的酒吧休息,刪除你的進度UI,或其他。

+0

Swift 2.2不太喜歡那個調用所以我將其修改爲:let statusDict = try! speechSynthesizer.objectForProperty(NSSpeechStatusProperty)as![String:Any] print(statusDict [NSSpeechStatusNumberOfCharactersLeft]),但它在運行時拋出異常。 –

+0

對於Swift 2.x,你可能需要'[String:AnyObject]',而不是'[String:Any]'。 – rickster

+0

試過了,沒有運氣。然後更新xcode,使用Swift 2.3,然後3.嘗試它。沒有運氣。然後,我在3 Playground中嘗試了你的代碼,它不會運行,它只是坐在那裏嘗試「Running Playground」永遠。也許有一個問題,我的開發環境:( –