Введение
Платформа, начиная с версии 8.3.23, реализует как распознавание, так и синтез речи. Есть механизмы работы как в облачном сервисе, так и локально.
Разработчики разместили сайт, посвященный технологиям работы с речью.
Предложена конфигурация, в которой реализована эта функциональность.
При попытке им воспользоваться кодом из этой конфигурации выяснилось, что он очень объемный, и для того чтобы запустить минимальную функциональность приходится потратить много усилий, чтобы в нем разобраться.
Как оказалось - можно не заимствуя громоздкий код, получить рабочий пример, состоящий из нескольких десятков строк.
Поддерживаются всего два формата: WAV и Opus (ogg).
Подключение модели распознавания
Будем использовать локальное распознавание. Сначала необходимо подключить хотя бы одну модель. Для этого запускаем стандартную обработку "Управление работой с речью" в функциях технического специалиста. Подключаемся к сервису speech.1c.ai по кнопке "Подключить", используем логин пароль от портала Портал 1C:ИТС. Выбираем модель распознавания и устанавливаем по кнопке "Установить". Появляется флажок в колонке "Локально":
Обработка распознавания
Описание процедур и функций модуля формы.
Получаем файл по событию НачалоВыбора поля ПутьКФайлу:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл";
Диалог.ПолноеИмяФайла = "";
Фильтр = "Файл аудио (*.wav,*.ogg)|*.wav;*.ogg";
Диалог.Фильтр = Фильтр;
Диалог.МножественныйВыбор = Ложь;
Диалог.Показать(Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтаФорма, Новый Структура("Диалог", Диалог)));
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Диалог = ДополнительныеПараметры.Диалог;
Если (ВыбранныеФайлы <> Неопределено) Тогда
ПутьКФайлу = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
Вызываем процедура распознавания речи по кнопке "Распознать". Функции работы с речью реализует объект глобального контекста РаботаСРечью. Механизм предполагает, что формируется задание на выполнение распознавания, исполнение кода продолжается, а далее мы проверяем результат по расписанию. Здесь я не стал этого делать в целях упрощения, просто в цикле ожидаем какое-то количество времени до завершения работы.
&НаКлиенте
Процедура Распознать(Команда)
Если НЕ ПроверитьЗаполнение() Тогда
Возврат;
КонецЕсли;
РаспознатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура РаспознатьНаСервере()
// загружаем тело файла
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
// получаем установленные модели
СписокМоделей = РаботаСРечью.ПолучитьОписаниеМоделейРаспознавания();
// прекращаем выполнение, если нет установленных
Если СписокМоделей.Количество() = 0 Тогда
Сообщить("Не обнаружено установленных моделей");
КонецЕсли;
// задаем параметры работы менеджера работы с речью по умолчанию
ПараметрыМодели = Новый ПараметрыМоделиРаспознаванияРечи;
// запускаем процесс распознавания локально
ИдентификаторОтложенногоРаспознаванияРечи = РаботаСРечью.ВыполнитьОтложенноеРаспознавание(ДвоичныеДанные, ПараметрыМодели, ВариантИспользованияРасположенияРаботыСРечью.ТолькоЛокальное);
// получили ИдентификаторОтложенногоРаспознаванияРечи, его исползуем в дальнейшем, чтобы получить результаты распознования
Ключи = Новый Массив;
Ключи.Добавить(ИдентификаторОтложенногоРаспознаванияРечи);
// максимальное время ожидания завершения
ВремяОжидания = 60;
// основной цикл ожидания
Для Счетчик = 1 По ВремяОжидания Цикл
// ждем одну секнду
Пауза(1);
// получаем результы отложенного распознаванию
Результаты = РаботаСРечью.ПолучитьРезультатыОтложенныхРаспознаваний(Ключи);
Результат = Результаты[0];
// если распознавание завершено, переходим к выоду результатов
Если Результат.Завершено = Истина Тогда
Если НЕ Результат.Успешно Тогда
Сообщить("Ошибка распознавания речи: " + Результат.Ошибка);
Возврат;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Результаты = Результат.Результаты;
// если прошло больше, чем ВремяОжидания, а задание не завершено, выводим об этом информацию
Если НЕ Результат.Завершено Тогда
Сообщить("Ошибка распознавания речи: " + "слишком большой объем данных.");
Возврат;
КонецЕсли;
// формируем результат как строку
ИтогОтвет = "";
Для каждого Результат Из Результаты Цикл
Для каждого ДанныеФразы из Результат.ДанныеФраз Цикл
Фраза = СокрЛП(ДанныеФразы.Фраза);
ИтогОтвет = ИтогОтвет + ?(ЗначениеЗаполнено(ИтогОтвет), Символы.ПС, "") + Фраза;
КонецЦикла;
КонецЦикла;
Сообщить("Результат распознавания:");
Сообщить(ИтогОтвет);
КонецПроцедуры
Код процедуры паузы:
&НаСервере
Процедура Пауза(Таймаут) Экспорт
HTTPСоединение = Новый HTTPСоединение("1C.ru",11111,,,,Таймаут);
Попытка
HTTPСоединение.получить(новый HTTPЗапрос (""));
Исключение
Конецпопытки;
КонецПроцедуры
Затраты времени на ожидание примерно 1:1 длительности входящего аудиопотока и времени его обработки.
Результат выполнения обработки:
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.176.38