【问题标题】:Advancing a progress bar during speech synthesis using Swift 2.0 (OS X)使用 Swift 2.0 (OS X) 在语音合成过程中推进进度条
【发布时间】:2016-02-07 03:24:27
【问题描述】:

当语音合成器正在读取一段文本时,我正在尝试以 5.0 的增量推进一个确定的进度条。这是我拥有的代码(不起作用):

if speechSynthesizer.speaking == false {
    if let contents = textView.string where !contents.isEmpty {
        speechSynthesizer.startSpeakingString(contents)
        progressIndicator.hidden = false

        while speechSynthesizer.speaking == true {
            progressIndicator.incrementBy(5.0)
        }

        } else {
            speechSynthesizer.startSpeakingString("The document is empty.")
        }
   }

}

进度条显示但不增加。如果我取出“while...”并只使用语句“progressIndicator.incrementBy(5.0)”,那么进度会增加,但只会增加一次。

关于如何解决此问题的任何建议?

提前感谢大家!

-同步-

【问题讨论】:

  • 您可能需要在主运行循环中执行此操作才能显示出来
  • 我对 OS X 编程非常陌生。您能否为我指出正确的方向来访问 OS X 中的主运行循环?我在生成的源代码中看不到它在哪里...

标签: swift macos speech-synthesis


【解决方案1】:

您可能需要将更新 UI 的代码移至主运行循环,以便 UI 真正得到更新。所以将该行放在一个调度块中。

dispatch_async(dispatch_get_main_queue()) {
    //insert UI code here 
}

【讨论】:

  • 谢谢。我将在下面 Chris 的建议中试一试。
【解决方案2】:

我会使用 NSSpeechSynthesizerDelegate 协议 - 它可以提供的最佳功能是告诉你它要说哪个词。

optional func speechSynthesizer(_ sender: NSSpeechSynthesizer,
                  willSpeakWord characterRange: NSRange,
                       ofString string: String)

每说出一个单词,就更新进度指示器

func speechSynthesizer(_ sender: NSSpeechSynthesizer,
                      willSpeakWord characterRange: NSRange,
                           ofString string: String) {

let pc = (characterRange.location + characterRange.length) / string.length
progressIndicator.doubleValue = (pc * 100)
}

【讨论】:

  • 谢谢。我已经尝试过了,但似乎我错过了一些东西。我实现了您的功能,但进度条似乎没有移动。我敢肯定这只是我和我缺乏语言经验。感谢您回答我,感谢您的时间和帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多