gpt4 book ai didi

swift - 使用 NSSpeechStatusNumberOfCharactersLeft 更新 NSSpeechSynthesizer 的进度指示器

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:10 25 4
gpt4 key购买 nike

我是 SwiftOS X 编程新手。我正在尝试使用进度监视器来指示我的语音合成器朗读文本的进度。

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

我要设置

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

然后使用 NSSpeechStatusNumberOfCharactersLeft 定期更新 progressIndicator ,根据 Apple 的文档应为 0。

我尝试访问此 key 的每一种方式,它都会返回相同的不准确数字,因此我显然没有正确使用它。我找到的唯一示例是在 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))

抛出运行时异常。有什么想法吗?提前致谢!

最佳答案

您的第二次尝试非常接近正确:

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

没有错误消息(因为我手边没有 Swift 2 编译器),我猜测失败的原因是 objectForProperty 的返回值未知一本字典,因此您无法在其中查找值。

这是我用来测试这个的快速而肮脏的 Swift 3 Playground :

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])
}

(显然,如果您在具有合成器委托(delegate)的应用中运行它,则不需要所有计时器或 Playground 业务。)

关键位(没有双关语意)是转换 objectForProperty 的返回值,以便 Swift 知道它是一个字典,然后在该字典中查找字符数。

现在,这段代码可以正确运行,但它不能完全用于设置进度条——当合成器结束说话时,NSSpeechStatusNumberOfCharactersLeft 可能是某个非零值。 (在这种情况下,另一个状态键 NSSpeechStatusOutputBusy 将变为 false。)因此您的进度条将不会达到 100%,您可以使用 NSSpeechStatusOutputBusy 键或委托(delegate) didFinishSpeaking 回调让你的酒吧完成剩下的事情,删除你的进度 UI 或其他任何东西。

关于swift - 使用 NSSpeechStatusNumberOfCharactersLeft 更新 NSSpeechSynthesizer 的进度指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39502839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com