我正在编写一个OS X应用程序,该应用程序使用NSSpeechSynthesizer
向用户读取文本,并在文本字段(NSTextView
)中突出显示正在读取的单词。这是通过实现speechSynthesizer:willSpeakWord:ofString:
协议的NSSpeechSynthesizerDelegate
方法来完成的。此方法提供了要说的单词的范围(NSRange
),我将其转发给我的NSTextView
的setSelectedRange方法。
一切都好,直到我停止使用stopSpeaking
方法阅读为止。如果在此之后将其设置为再次读取,则speechSynthesizer:willSpeakWord:ofString:
提供的范围似乎不同步。似乎犹豫不决地调用speechSynthesizer:willSpeakWord:ofString:
几秒钟,导致最终确定范围时语音有些落后。
我编写了一个简单的应用程序来说明问题,可以在这里找到:
http://dl.dropbox.com/u/12516679/SpeechTest.zip
我希望有人能看一下这段代码(它确实很简单),或者确认这确实是一个错误,或者(希望)告诉我我做错了什么。
-更新-
事实证明,问题是非英语声音出现的。我最初使用的是Ida,这是丹麦语的声音。现在,我已经用许多不同的声音测试了它,并且可以确认它可以与所有英语声音一起很好地工作。但是,它与丹麦,瑞典,挪威和荷兰不同步。它也可能会影响其他语言,但是到目前为止,我已经测试过这些语言。
最佳答案
好的,我已经找到了问题的根源和解决方法。它与这种语言无关,但事实上OS X Lion中的大多数非英语语音都是Nuance语音(由Nuance Communications制造)。我已经通过使用English Nuance语音进行测试来证实了这一点,他们的确存在相同的问题。看来Nuance提供的语音api中有问题。
通过在读取停止后实例化一个新的NSSpeechSynthesizer
对象,我为该问题创建了一种解决方法。它虽然不漂亮,但是可以用:)
关于objective-c - NSSpeechSynthesizer中的可能错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8520662/