Я пишу приложение для OS X, которое использует NSSpeechSynthesizer
для чтения текста пользователю и выделяет слово, которое оно читает, в текстовом поле (NSTextView
). Это делается путем реализации метода speechSynthesizer:willSpeakWord:ofString:
протокола NSSpeechSynthesizerDelegate
. Этот метод обеспечивает диапазон (NSRange
) слова, которое он собирается произнести, который я пересылаю методу setSelectedRange моего NSTextView
.
Все хорошо, пока я не остановил чтение методом stopSpeaking
. Если после этого я установлю его на чтение снова, диапазоны, предоставленные speechSynthesizer:willSpeakWord:ofString:
, будут не синхронизированы. Кажется, что он колеблется, звоня speechSynthesizer:willSpeakWord:ofString:
в течение нескольких секунд, в результате чего диапазоны немного отстают от речи, когда он, наконец, делает.
Я написал простое приложение, иллюстрирующее проблему, которое можно найти здесь:
http://dl.dropbox.com/u/12516679/SpeechTest.zip
Я надеюсь, что кто-то посмотрит на этот код (он действительно прост) и либо подтвердит, что это действительно кажется ошибкой, либо (надеюсь) скажет мне, что я делаю неправильно.
- ОБНОВЛЕНИЕ -
Оказывается, проблема возникает с неанглийскими голосами. Первоначально я использовал Ida, который является датским голосом. Сейчас я проверил его многими разными голосами и могу подтвердить, что он хорошо работает со всеми английскими голосами. Однако он не синхронизировался с датским, шведским, норвежским и голландским языками. Возможно, это влияет и на другие языки, но это те, которые я тестировал до сих пор.