Распознавание речи — одно из наиболее перспективных направлений автоматизации рутинных процессов в 1С. Голосовой ввод позволяет ускорить заполнение длинных текстовых полей, осуществлять быстрый поиск документов по названию или номеру, а также создавать удобные голосовые интерфейсы для складских и мобильных рабочих мест. В данной статье мы подробно разберем, почему старые методы интеграции с бесплатными сервисами распознавания больше не работают, как подключить современное API от Яндекса, какими способами можно записать аудиопоток с микрофона непосредственно из 1С, а также рассмотрим новейшие штатные механизмы платформы.
В ранних версиях интеграции разработчики часто использовали недокументированные возможности Google Speech API v2, которые позволяли отправлять короткие аудиофайлы на сервера Chromium без сложной авторизации. Код выглядел следующим образом:
Соединение = Новый HTTPСоединение("http://www.google.com");
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-type", "audio/x-flac; rate=" + Формат(Рейт, "ЧГ="));
ЗапросHTTP = Новый HTTPЗапрос("/speech-api/v2/recognize?xjerr=1&key=AIzaSyCPYK...&client=chromium&lang=ru-RU", Заголовки);
ЗапросHTTP.УстановитьИмяФайлаТела(ИмяФайла);
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
На сегодняшний день этот метод полностью неактуален. Компания Google закрыла публичный доступ к сервису без предварительной регистрации, авторизации и привязки платежного аккаунта Google Cloud. При попытке выполнить такой запрос система возвращает пустой результат вида {"result":[]} или ошибку авторизации. Для стабильной работы распознавания требуется использовать официальные современные API, которые предоставляют как зарубежные, так и отечественные облачные провайдеры.
Одним из самых качественных и доступных решений для распознавания русской речи является сервис Yandex SpeechKit. Нам доступно распознавание как коротких аудиозаписей в режиме реального времени, так и фоновая обработка длинных файлов (например, записей телефонных разговоров менеджеров).
Для работы с сервисом вам потребуется завести аккаунт в Yandex Cloud, создать сервисный аккаунт, получить платежный кабинет (для тестирования выдается бесплатный грант) и сгенерировать IAM-токен или статический API-ключ.
Рассмотрим пример отправки аудиофайла в формате WAV на распознавание с помощью HTTP-запроса из 1С. Важно помнить, что SpeechKit очень чувствителен к формату передаваемого звука. Рекомендуется использовать несжатый формат 16-bit PCM (WAV) или сжатый формат Opus в контейнере OGG.
&НаСервере
Функция РаспознатьРечьЧерезYandex(ПутьКФайлу, ТокенАвторизации, ИдентификаторКаталога) Экспорт
// Задаем адрес API Яндекса
Сервер = "stt.api.cloud.yandex.net";
Ресурс = "/speech/v1/stt:recognize";
// Подготавливаем заголовки запроса
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Bearer " + ТокенАвторизации);
// Параметры распознавания передаем в строке запроса (Query Parameters)
ПараметрыЗапроса = "?folderId=" + ИдентификаторКаталога + "&lang=ru-RU&format=lpcm&sampleRateHertz=16000";
// Инициализируем защищенное SSL-соединение
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
HTTPСоединение = Новый HTTPСоединение(Сервер, 443, , , , , ЗащищенноеСоединение);
// Формируем запрос
HTTPЗапрос = Новый HTTPЗапрос(Ресурс + ПараметрыЗапроса, Заголовки);
HTTPЗапрос.УстановитьИмяФайлаТела(ПутьКФайлу);
Попытка
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
КодСостояния = HTTPОтвет.КодСостояния;
ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
Если КодСостояния = 200 Тогда
// Успешно. Разбираем полученный JSON
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
РезультатСтруктура = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат РезультатСтруктура.result;
Иначе
ВызватьИсключение "Ошибка сервиса SpeechKit: " + ТелоОтвета;
КонецЕсли;
Исключение
ЗаписатьЛогОшибки(ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Разберем важный нюанс: параметр sampleRateHertz определяет частоту дискретизации аудиофайла. Если ваш файл записан с частотой 8000 Гц (стандарт для телефонии), обязательно передавайте значение 8000. Если запись качественная (с микрофона), используйте 16000 или 48000. Несоответствие реальной частоты файла указанному параметру приведет к критическому ухудшению качества распознавания или к ошибке API.
В старых версиях платформы 1С не было штатных средств для прямой работы с аудиоустройствами ввода. Разработчикам приходилось искать обходные пути. Проанализируем основные способы записи звука, которые можно использовать в прикладных решениях.
В операционной системе Windows до версии Windows 10 присутствовала встроенная утилита SoundRecorder.exe (Звукозапись), которую можно было запускать скрыто с параметрами командной строки. Этот подход идеально подходит для legacy-систем.
Мы можем вызвать запись звука через объект WshShell или стандартный метод 1С ЗапуститьПриложение():
// Запуск записи звука длительностью 5 секунд в указанный файл
ИмяФайла = "C:\Temp\voice_input.wma";
ПараметрыЗапуска = "SoundRecorder /FILE """ + ИмяФайла + """ /DURATION 0000:00:05";
// Запускаем процесс в фоновом режиме и ждем его завершения
ЗапуститьПриложение(ПараметрыЗапуска, , Истина);
Главный недостаток этого метода — в современных версиях Windows 10 и Windows 11 классическая утилита SoundRecorder была заменена на UWP-приложение «Запись голоса», которое не поддерживает управление через параметры командной строки.
Для универсальной работы на любых версиях ОС Windows рекомендуется использовать компактные кроссплатформенные консольные утилиты для записи звука, такие как FFmpeg или специализированные рекордеры вроде NirCmd или SoX (Sound eXchange). Скачаем и разместим исполняемый файл утилиты во временной папке или в макете конфигурации.
Рассмотрим пример использования утилиты SoX для записи короткого фрагмента:
&НаКлиенте
Процедура ЗаписатьЗвукЧерезSox(ПутьКФайлуWav, ДлительностьВСекундах)
// Путь к исполняемому файлу утилиты (можно хранить в двоичном макете и извлекать при запуске)
ПутьКУтилите = КаталогВременныхФайлов() + "sox.exe";
// Формируем параметры записи: моно, 16000 Гц, 16 бит
ПараметрыКоманднойСтроки = "-t waveaudio -d -r 16000 -c 1 -b 16 """ + ПутьКФайлуWav + """ trim 0 " + Формат(ДлительностьВСекундах, "ЧГ=0");
// Вызываем утилиту в скрытом окне
ЗапуститьПриложение(ПутьКУтилите + " " + ПараметрыКоманднойСтроки, , Истина);
КонецПроцедуры
Использование подобных утилит гарантирует высокую надежность, независимость от обновлений Windows и позволяет тонко настраивать параметры записи (шумоподавление, уровень громкости, порог тишины для автостопа).
Начиная с версии платформы 8.3.23, фирма «1С» кардинально упростила жизнь разработчикам, представив встроенный объект РаспознаваниеРечи. Теперь платформа способна самостоятельно захватывать звук с микрофона пользователя и отправлять его на обработку. Разработчику больше не нужно использовать внешние компоненты, консольные рекордеры или сторонние API.
Платформа предлагает два варианта работы встроенной службы:
Рассмотрим, как запустить потоковое распознавание речи прямо с микрофона пользователя в управляемой форме:
&НаКлиенте
Процедура НачатьГолосовойВвод(Команда)
// Инициализируем настройки распознавания речи
НастройкиSTT = Новый НастройкиРаспознаванияРечи;
НастройкиSTT.Язык = "ru-RU";
НастройкиSTT.ФорматАудио = ФорматАудиоРаспознаванияРечи.Wav;
// Создаем экземпляр менеджера распознавания
// Если параметры не переданы, будет использоваться настроенная по умолчанию служба (облачная или локальная)
МенеджерSTT = Новый РаспознавательРечи;
// Проверяем доступность записи с микрофона на устройстве
Если Не МенеджерSTT.ПоддерживаетсяПотоковоеРаспознавание() Тогда
ПоказатьПредупреждение(, "Потоковое распознавание речи не поддерживается на данном устройстве!");
Возврат;
КонецЕсли;
// Описываем обработчики событий потокового ввода
ОписаниеОповещенияРезультат = Новый ОписаниеОповещения("ОбработкаРезультатаРаспознавания", ЭтотОбъект);
ОписаниеОповещенияСтатус = Новый ОписаниеОповещения("ОбработкаИзмененияСтатусаРаспознавания", ЭтотОбъект);
// Запускаем сессию записи и анализа
МенеджерSTT.НачатьПотоковоеРаспознавание(ОписаниеОповещенияРезультат, ОписаниеОповещенияСтатус, НастройкиSTT);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаРезультатаРаспознавания(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Текст содержит гипотезы распознавания
ТекущийТекст = Результат.Текст;
// Заполняем реквизит формы надиктованным текстом
Объект.Комментарий = ТекущийТекст;
// Если распознавание завершено окончательно
Если Результат.Окончательный Тогда
ПоказатьОповещениеПользователя("Распознавание завершено", , ТекущийТекст);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаИзмененияСтатусаРаспознавания(Статус, ДополнительныеПараметры) Экспорт
// Здесь можно обрабатывать изменения состояния (например, "ИдетЗапись", "ОжиданиеСервера", "Ошибка")
Состояние("Статус распознавания: " + Статус);
КонецПроцедуры
В версии 8.3.28 встроенные алгоритмы получили очередное развитие: появился так называемый легкий режим работы, который позволяет платформе находиться в режиме ожидания "активационной фразы" (например, «Эй, Один-Эс!»), после чего автоматически включается высокоточное распознавание для диктовки команд или текста.
Если специфика вашего предприятия накладывает строгие ограничения на конфиденциальность данных (коммерческая тайна, персональные данные клиентов) и вы не имеете права отправлять аудиозаписи в публичные облака (Яндекс или Google), отличным решением будет развертывание собственной локальной нейросети класса OpenAI Whisper.
Для реализации этой схемы на сервере предприятия разворачивается небольшой веб-сервер на Python, работающий с оптимизированной моделью Whisper.cpp или Faster-Whisper. Модель принимает файлы по протоколу HTTP POST и мгновенно возвращает расшифрованный текст.
Схема взаимодействия выглядит следующим образом:
http://192.168.1.100:5000/transcribe.Этот подход гарантирует нулевую стоимость за транскрибацию любого объема аудиоданных и абсолютную безопасность информации, так как весь трафик не покидает периметр локальной сети компании.