Очередная конференция — очередные новшества. Судя по настроениям нас ждет отмена клавиатур и устройств ввода. Apple в iOS 10 представила разработчикам возможность работать с речью. Мой коллега Геор Касапиди уже описал возможности Siri в своей статье, а я расскажу о Speech.framework. Рассмотренный в статье материал реализован в демо-приложении what_i_say. На момент написания статьи официальной документации нет, так что будем основываться на том, что рассказал Henry Mason. Работа с речью полностью завязана на доступе к Интернету, и это неудивительно, так как используется тот же самый движок Siri. Разработчику даётся возможность либо распознавать живую речь, либо уже записанную в файл. Различие в объекте запроса: SFSpeechURLRecognitionRequest — используется для распознавания из файла;
SFSpeechAudioBufferRecognitionRequest — используется для распознания диктовки. Рассмотрим работу с real-time диктовкой. Вся работа основывается на принципиальной схеме:  Но так как Speech.framework не содержит специального API для работы с микрофоном, разработчику потребуется задействовать AVAudioEngine. Первым делом разработчику необходимо добавить два ключа в Info.plist файл NSMicrophoneUsageDescription — для чего нужен доступ к микрофону
NSSpeechRecognitionUsageDescription — для чего нужен доступ к распознанию речи  это важно, потому как без них будет неминуемый крэш. Далее нам необходимо обработать статус авторизации: На этапе знакомства с Speech.framework я так и не нашел use-case использования статуса SFSpeechRecognizerAuthorizationStatusRestricted. Я предполагаю, что этот статус планировался под ограниченные права доступа, но пока для “Распознавание речи” нет дополнительных опций. Что ж, дождёмся официальной документации.  При первом запуске приложения после установки распознаватель вернёт статус SFSpeechRecognizerAuthorizationStatusNotDetermined, поэтому необходимо запросить авторизацию у пользователя: В API нет ни методов, ни нотификаций для отслеживания изменения статуса. Система форсированно перезагрузит приложение, если пользователь изменит состояние авторизации. Для успешной работы по распознаванию речи нам потребуется четыре объекта: и реализовать протокол: recognizer — объект, который будет обрабатывать запросы.
Из важного: распознаватель не переключает локаль автоматически. Он работает в рамках локали, определенной при инициализации. Т.е. если инициализация была локалью en-US, а пользователь говорит на другом языке, то распознаватель отработает и вернёт пустой ответ; audioEngine — объект, который будет связывать входной сигнал с микрофона (диктуемую речь) и выходной сигнал в буфер. request — запрос на распознавание речи.
Из интересного: по описанию можно предположить, что планируется разделить запросы еще и на типы, т. е. обычная диктовка, диктовка для поиска информации, диктовка для подтверждения чего-либо. Увы, сейчас они нигде не используются, разве что как маркеры. Предполагаю, будет развитие этого звена. currentTask — объект задачи на обработку одного запроса.
Из важного: После успешной настройки менеджера речи можно приступить к самой работе.
Необходимо создать запрос: и передать его в распознаватель: Приняв запрос, система вернёт нам объект задачи. Он потребуется позже для остановки процесса. Объект запроса нельзя переиспользовать пока он активен, иначе будет крэш “reason: 'SFSpeechAudioBufferRecognitionRequest cannot be re-used’”. Поэтому важно по завершении процесса остановить задачу и audioEngine: По окончании задачи результат будет доставлен в методы делегата SFSpeechRecognitionTaskDelegate: обработать распознанный текст можно в методе: а ошибки в методе: За время работы с приложением я столкнулся с ошибками: первая ошибка прилетела, когда после небольшой диктовки речь была закончена (пользователь перестал говорить), а распознаватель продолжал работу; вторая ошибка была, когда распознаватель не получил никакого аудиопотока и процесс был отменен пользователем. Обе ошибки были пойманы в методе делегата: После первого знакомства с Speech.framework стало понятно, что он ещё “сырой”. Многое необходимо доработать и протестировать. Начало неплохое, есть стремление в сторону искусственного интеллекта и работы без средств ввода информации. В комбинации с IoT, открываются большие возможности по управлению гаджетами, домом, автомобилем. А пока ждём, тренируемся и исследуем дальше. iOS разработка