Каталог решений - Распознавание речи средствами платформы 1С

Распознавание речи средствами платформы 1С

Распознавание речи средствами платформы 1С

В наличии

Пример простой обработки локального распознавания речи средствами платформы.

Категория:

Описание

Введение

Платформа, начиная с версии 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 длительности входящего аудиопотока и времени его обработки. 

Результат выполнения обработки:

 

has been added to your cart:
Оформление заказа