Распознавание текста в iOS 7.1

Одной из новых возможностей, которые iOS 7 предоставила разработчикам, стала реализация функции text-to-speech, автоматической озвучки заданного текста. Недавнее обновление системы до версии 7.1 принесло с собой поддержку большого количества новых языков, среди которых оказался и русский.

В качестве эксперимента text-to-speech была внедрена в приложение ПФК ЦСКА для озвучки событий футбольных трансляций и новостей клуба.

AVSpeechSynthesizer особенно подкупает простотой своего использования: любой текст может быть преобразован в речь с использованием всего нескольких строк кода. Расскажу о реализации. Событие озвучки происходит по нажатию кнопки ячейки, содержащей определенное событие трансляции. Само преобразование текста в речь происходит в контроллере экрана трансляций, поэтому для связи его с ячейкой используется делегирование:

Метод stopReading: вызывается при повторном нажатии на кнопку озвучки, readCellText: withCell: — при первоначальном нажатии.

Реализация метода readCellText: withCell:

Разберем поэтапно:

1. Метод stopReading: вызывается для остановки текущего процесса чтения. Если убрать эту строчку, все запросы на озвучку будут собираться в единую очередь.

2. Создается объект класса AVSpeechUtterance, содержащий в себе конкретное высказывание: его текст, голос (и язык), скорость чтения и высоту голоса. В данном случае текст для чтения передается из используемой ячейки, в качестве голоса используется локаль @”ru-RU” (на данный момент доступна только женская озвучка), скорость и высота настраиваются в отдельной форме и берутся из NSUserDefaults.

3. Объект высказывания передается заранее инициализированному speechSynthesizer и начинается его прочтение.

Реализация метода stopReading:, в идеале, должна была содержать всего одну строчку кода, но в связи с недавно выявленным багом, пришлось воспользоваться костылем:

Баг заключается в том, что при наличии только одной записи в очереди у AVSpeechSynthesizer, ее остановка периодически проходит некорректно. Эта проблема обходится, если создать пустое высказывание и сразу же его остановить.

Помимо всего этого, для AVSpeechSynthesizer реализован отличный протокол делегирования, обрабатывающий такие события, как пауза в речи, ее начало, остановка и прочее.

Качество преобразования текста, конечно, пока что оставляет желать лучшего — большие проблемы наблюдаются с аббревиатурами и именами собственными, но со временем все должно наладиться. Новый функционал будет представлен в ПФК ЦСКА v.3.0.2, которая совсем скоро появится в App Store.