При разработке мобильных решений на платформе 1С часто возникает задача ускорить ввод текстовой информации — например, при заполнении комментариев, описаний неисправностей или адресов. Одним из удобных способов решения является использование системного механизма распознавания речи операционной системы Android с помощью объекта ЗапускПриложенияМобильногоУстройства.
Разберем типичные ошибки при настройке интента (Intent), рассмотрим правильный рабочий код и изучим способы извлечения распознанного текста.
Проанализируем частую ситуацию, когда разработчик пытается запустить голосовой ввод, но метод возвращает 0 и диалог распознавания не открывается:
НовВз = Новый ЗапускПриложенияМобильногоУстройства();
НовВз.Действие = "android.intent.RecognizerIntent.ACTION_RECOGNIZE_SPEECH";
НовВз.Категория = "android.intent.category.RecognizerIntent";
Сообщить(НовВз.Запустить(Истина));
Выясним причину такого поведения:
RecognizerIntent.ACTION_RECOGNIZE_SPEECH на системном уровне имеет строковое значение "android.speech.action.RECOGNIZE_SPEECH". Использование полного имени Java-константы вместо строкового значения приводит к тому, что система не находит подходящего обработчика."android.intent.category.RecognizerIntent" не существует в спецификации Android. Для распознавания речи свойство Категория заполнять не требуется.Запустить(Истина) возвращается системный код результата Activity (resultCode). Значение -1 (RESULT_OK) свидетельствует об успешном распознавании, а 0 (RESULT_CANCELED) возвращается при отмене действия пользователем либо в случае, когда на устройстве отсутствует или отключен сервис распознавания речи.Посмотрим на корректный пример инициализации объекта и передачи необходимых дополнительных параметров:
ЗПМУ = Новый ЗапускПриложенияМобильногоУстройства("android.speech.action.RECOGNIZE_SPEECH");
ЗПМУ.ДополнительныеДанные.Добавить("android.speech.extra.LANGUAGE_MODEL", "free_form");
ЗПМУ.ДополнительныеДанные.Добавить("android.speech.extra.MAX_RESULTS", 1);
ЗПМУ.ДополнительныеДанные.Добавить("android.speech.extra.PROMPT", "Говорите...");
ЗПМУ.ДополнительныеДанные.Добавить("android.speech.extra.LANGUAGE", "ru-RU");
КодВозврата = ЗПМУ.Запустить(Истина);
Рассмотрим подробнее назначение переданных параметров:
android.speech.extra.LANGUAGE_MODEL: модель распознавания речи. Значение "free_form" указывает на распознавание произвольной свободной речи.android.speech.extra.MAX_RESULTS: максимальное количество возвращаемых вариантов распознавания текста (в примере установлено 1 для получения наиболее точного совпадения).android.speech.extra.PROMPT: текстовая подсказка, отображаемая пользователю в стандартном системном диалоговом окне записи.android.speech.extra.LANGUAGE: явное указание локали распознавания речи (например, "ru-RU").После успешного завершения записи (когда метод Запустить(Истина) возвращает -1), распознанные данные помещаются в коллекцию ДополнительныеДанные объекта ЗапускПриложенияМобильногоУстройства.
Разберем пример извлечения итогового текста:
Если КодВозврата = -1 Тогда
Результаты = ЗПМУ.ДополнительныеДанные.Получить("android.speech.extra.RESULTS");
Если Результаты <> Неопределено И Результаты.Количество() > 0 Тогда
РаспознанныйТекст = Результаты[0];
Сообщить("Распознано: " + РаспознанныйТекст);
КонецЕсли;
Иначе
Сообщить("Ввод отменен или сервис распознавания недоступен.");
КонецЕсли;
При использовании вызова через Intent важно учитывать технические особенности механизма:
Если требуется кроссплатформенность или непрерывный ввод, рассмотрим альтернативные варианты:
android.speech.SpeechRecognizer, что позволяет кастомизировать интерфейс и получать промежуточные результаты ввода.