- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 Swift
和 OS 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/
我如何知道 NSSpeechSynthesizer 何时结束讲话? 最佳答案 您阅读了documentation for NSSpeechSynthesizer并发现-speechSynthesize
如何添加 NSSpeechSynthesizer 类引用。我认为是在 /System/Library/Frameworks/AppKit.framework。但是,当我单击“添加现有框架”时,框架窗口
不幸的是,我只能说四种语言,那么如果我知道文本的语言,我如何知道我必须使用哪种 OS X 语音?我在Apple的文档中找不到任何有关它的信息。至少有一张有语音/语言的 table 吗? 最佳答案 您可
这次我有一道逻辑题。希望你们中有人能帮助我。使用“NSSpeechSynthesizer”您可以设置速率,即每分钟 235 个单词、每分钟 100 个单词等等... 我发现每分钟的平均单词数通常是使用
我正在使用 NSSpeechSynthesizer 类,但由于某种原因声音无法播放。这是我使用的源代码 #import #import int main(int argc, const char
我正在编写一个 OS X 应用程序,它使用 NSSpeechSynthesizer 向用户读取文本,并在文本字段 (NSTextView) 中突出显示正在读取的单词。这是通过实现 NSSpeechSy
我正在编写一个基于 Cocoa Book 示例的简单程序,该示例使用 NSSpeechSynthesizer 来说出短语。我想知道如何更改用于合成相位的语言。 #import "PHAppDelega
我正在尝试使用 XCode 编译一个简单的命令行工具: #import int main (int argc, const char * argv[]) { NSAutoreleasePoo
我有一个简短的问题:我可以通过 JavaScript 使用 NSSpeechSynthesizer 或 Mac OS 的文本转语音引擎(如果我在 Mac 上使用 Safari)吗?如果是这样:怎么办?
我收到“程序收到信号:EXC_BAD_ACCESS”,但我不明白为什么 这是我的界面 #import @interface AppController : NSObject { NSSpee
在 OS X 10.9.4 上使用 Xcode 5.1.1, 考虑以下代码片段: - (IBAction)speak:(id)sender // text to loudspeaker,
当我在 NSSpeechSynthesizer 实例上调用 startSpeaking(String) 方法时,设置了一个委托(delegate),会说话,但以下委托(delegate)方法永远不会触
我正在结合 Apple 文档完成一个教程,我正在尝试更改 NSSpeechSynthesizer 的 voiceName 但是它的初始化函数说它接受一个字符串但我不确定如何在文档中查找找到可接受的字符
我是 Swift 和 OS X 编程新手。我正在尝试使用进度监视器来指示我的语音合成器朗读文本的进度。 let speechSynthesizer = NSSpeechSynthesizer() sp
我使用 Nuance TTS 发现了这个奇怪的问题。 startSpeakingString: 和 startSpeakingString:toURL: 工作找到,但 stopSpeakingAtBo
我有一个 OS X 应用程序,它使用 NSSpeechSynthesizer 类来读取一些文本。我需要能够设置读取速度,这是使用 NSSpeechSynthesizer 的 rate 属性完成的。然而
我有以下 NSSpeechSynthesizer 的委托(delegate)方法: - (void) speechSynthesizer:(NSSpeechSynthesizer *)sender d
有没有办法获得 NSSpeechSynthesizer 的 Siri 声音? ? NSSpeechSynthesizer.availableVoices()没有列出它们,但也许有一个未记录的技巧或什么
我知道我可以使用 PyObjC 在 Python 中访问 Cocoa 对象。我可以用 C++ 做这个吗?我还可以使用哪些其他语言? 最佳答案 您可以直接从 Objective-C++(.mm 扩展名)
say command-line utility从 macOS 11 (Big Sur) 开始,似乎不知道 Siri 的声音: say -v '?'没有列出 Siri 的声音。 明确针对 Siri 语
我是一名优秀的程序员,十分优秀!