2011-12-15 3 views
1

Я пишу приложение OS X, которое использует NSSpeechSynthesizer, чтобы читать текст пользователю и выделяет слово, которое он читает в текстовом поле (NSTextView). Это делается путем реализации метода speechSynthesizer:willSpeakWord:ofString: протокола NSSpeechSynthesizerDelegate. Этот метод предоставляет диапазон (NSRange) слова, которое он собирается говорить, который я пересылаю методу setSelectedRange моего NSTextView.Возможная ошибка в NSSpeechSynthesizer?

Все хорошо, пока я не прекратил чтение с помощью метода stopSpeaking. Если после этого я снова заново его прочитаю, диапазоны, заданные speechSynthesizer:willSpeakWord:ofString:, похоже, не синхронизированы. Кажется, что он колеблется, называя speechSynthesizer:willSpeakWord:ofString: в течение нескольких секунд, в результате чего диапазоны немного отстают от речи, когда она наконец-то делает.

Я написал простое приложение, иллюстрирующее вопрос, который можно найти здесь: http://dl.dropbox.com/u/12516679/SpeechTest.zip

Я надеюсь, что кто-то будет смотреть на этот код (это действительно просто) и либо подтвердить, что это действительно, кажется, ошибка, или (надеюсь) сказать мне, что я делаю неправильно.

- ОБНОВЛЕНИЕ -

Оказывается, что проблема возникает с неанглийскими голосами. Я изначально использовал Иду, которая датский голос. Я сейчас тестировал его разными голосами, и я могу подтвердить, что он хорошо работает со всеми английскими голосами. Однако он не совпал с датским, шведским, норвежским и голландским. Вероятно, это влияет и на другие языки, но это те, которые я тестировал до сих пор.

+1

Ваше речевое приложение работает нормально, по крайней мере, на моем компьютере. Не могли бы вы более подробно описать свою проблему? Потому что, с моей точки зрения, все работает нормально, даже когда я вызываю метод stopSpeaking и нажимаю play. Синхронизация работает нормально. –

+0

Работаю отлично для меня тоже ... Какая версия OS X вы? – spudwaffle

+0

Ну, я думаю, это хорошая новость. Возможно, есть и надежда для меня :) Моя проблема в том, что после того, как чтение было остановлено, и я снова нажимаю кнопку воспроизведения, синтезатор начинает говорить сразу. Однако первый вызов «speechSynthesizer: willSpeakWord: ofString:», кажется, заходит несколько секунд, в результате чего подсветка не синхронизирована. И диапазоны, которые я распечатываю с помощью NSLog, также ошибочны. У меня есть новый 15-дюймовый MBP, на котором работает Lion. Мы протестировали приложение на новом iMac коллеге (также на котором работает Lion), и у него такая же проблема. – pajevic

ответ

0

Хорошо, я нашел источник проблемы и обходной путь. Это не имеет никакого отношения к языку как таковому, но тот факт, что большинство неанглийских голосов в OS X Lion - это голоса Nuance (сделанные Nuance Communications). Я подтвердил это, проверив английские голоса Nuance, и у них действительно есть та же проблема. Похоже, что в api есть что-то неправильное для голосов, предоставленных Nuance. Я создал обходное решение проблемы, создав экземпляр нового объекта NSSpeechSynthesizer после того, как чтение было остановлено. Это некрасиво, но это работает :)

1

Это ошибка, но она была решена в обновлении голосов Nuance для Mountain Lion.

+0

Да, это правда. Я подал отчет об ошибке Apple чуть меньше года назад, и через несколько недель я получил ответ, что это будет исправлено в Mountain Lion. Тем не менее, мне все еще нужно обходное решение, так как 1) наше приложение было выпущено до Mountain Lion и 2) ему также нужно было работать со Львом. – pajevic

Смежные вопросы