В мобильном приложении 1С есть простой способ распознавания речи с использованием объекта ЗапускПриложенияМобильногоУстройства.
Приложение = Новый ЗапускПриложенияМобильногоУстройства("android.speech.action.RECOGNIZE_SPEECH");
Результат = Приложение.Запустить(Истина);
Если Результат = 0 Тогда
Возврат;
КонецЕсли;
СтрокаВвода = Приложение.ДополнительныеДанные.Получить("query").Значение;
Вот хорошая статья, описывающая работу с подобным подходом. Казалось бы, запускай и радуйся, но мне понадобилось сделать свою Алису фоновое распознавание в непрерывном режиме, поэтому и пришлось реализовать следующую связку:
- Приложение (фоновая служба) для Android «Сервис распознавания речи для мобильной 1С»
- Внешняя компонента для мобильной платформы, которая взаимодействует с указанной службой.
Схема работы выглядит следующим образом:
На устройство Android устанавливает отдельное приложение (служба), которая работает в фоновом режиме, а в мобильное приложение добавляется внешняя компонента, умеющая с этой службой договариваться и генерирующая внешние события.
Наличие соединения с интернет для распознавания не обязательно, но качество распознавания, как мне показалось, немного лучше, когда оно есть.
Подключение и запуск распознавания:
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаРаспознаванияРечи", "Component", ТипВнешнейКомпоненты.Native) Тогда
Компонента = Новый("AddIn.Component.SpeechRecognizer");
Компонента.ЗапуститьРаспознаваниеРечи();
КонецЕсли;
Обработка внешних событий:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Событие = "initialization" Тогда
Компонента.ЗапроситьСтатусСервиса();
ПодключитьОбработчикОжидания("ПроверкаСтатусаСервисаРаспознавания", 1, Истина);
ИначеЕсли Событие = "RecognitionResult" Тогда
ОбработатьГолосовойВвод(Данные);
ИначеЕсли Событие = "RecognitionReady" Тогда
ДатаПоследнегоОтветаКомпоненты = ТекущаяДата();
ЕстьПромежуточныеРезультаты = Ложь;
ИначеЕсли Событие = "RecognitionPartialResult" Тогда
ДатаПоследнегоОтветаКомпоненты = ТекущаяДата();
ЕстьПромежуточныеРезультаты = Истина;
ИначеЕсли Событие = "ServiceStatus" Тогда
СтатусСервисаРаспознавания = Данные;
ИначеЕсли Событие = "onBeginningOfSpeech" Тогда
ДатаНачалаПроизношения = ТекущаяДата();
КонецЕсли;
КонецПроцедуры
Остановка распознавания:
Компонента.ОстановитьРаспознаваниеРечи();
Требования:
Для работы приложения требуется Android API 28 и выше.
Тестировалось в следующих условиях:
Релизы мобильной платформы 8.3.17.76, 8.3.18.47
Исходники:
Исходники можно взять тут https://github.com/salexdv/speechrecognizer
Для скачивания:
В архиве находится сама компонента, демонстрационная конфигурация, а также для apk-файла. Тот, который самый маленький - это приложение-служба, а большой - демонстрационной приложение (ARM64)
Благодарности:
В разработке использованы материалы, которые на конференции INFOSTART 2018 EDUCATION представил Игорь Кисиль, в частности статья Внешние компоненты мобильной платформы 1С для ОС Андроид, за что ему большое спасибо! Также очень помогла вот эта публикация и репозиторий.