Доброго времени суток, уважаемые пользователи сайта. Цель написания данной обработки была в облегчении работы для отдела работы с клиентами. Ежедневно сотрудники отдела продаж совершают множество звонков, общаются со множеством клиентов, а менеджеры по работе с клиентами вынуждены прослушивать часы аудиозаписей звонков, анализируя диалоги сотрудников и клиентов.
Для облегчения труда сотрудников и была сделана данная обработка. Она позволяет преобразовать аудио файл в текст для последующего его анализа.
Описание работы
Поскольку работа из России с OpenAI заблокирована, был использован сервис https://proxyapi.ru/. Для начала работы необходимо зарегистрировать и получить токен. Для доступа к сервисам OpenAI используется API сервиса proxyapi.
Запросы на распознавания речи, отправляются на адрес:
https://api.proxyapi.ru/openai/v1/audio/transcriptions
В заголовках передается полученный токен proxyapi для авторизации:
Authorization : Bearer <Полученный токен proxyapi>
Content-Type : multipart/form-data; boundary=<Разделитель>
В качестве разделителя можно использовать уникальный идентификатор, предварительно освободив его от "-".
Содержимое POST-запроса представляет собой значение отдельных полей, разделенных строкой-разделителем, указываемой в "boundary".
Основная проблема как раз в корректном формировании POST-данных. Любое отклонение от заданного формата приводит к ошибке.
Для формирования запроса использовался объект ЗаписьДанных. Код функции ниже:
Функция ПолучитьДанныеТела(Разделитель, ИмяФайла)
ДД = Новый ДвоичныеДанные(ИмяФайла);
НовРазделитель = "--"+Разделитель;
Тело = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(Тело, , , Символы.ВК + Символы.ПС);
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""model""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("whisper-1");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""language""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("ru");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""response_format""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("text");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file"";filename=""audio.wav""");
ЗаписьДанных.ЗаписатьСтроку("Content-Type: audio/x-wav");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.Записать(ДД);
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель+"--");
ЗаписьДанных.Закрыть();
ДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();
Возврат ДанныеТела;
КонецФункции
Описание работы для версии платформы 8.2
При работе с платформой 8.2 столкнулся с несколькими проблемами:
1. Стандартные функции платформы не работают с https
2. Нет объекта ЗаписьДанных
3. Нет объектов для работы с JSON
4. Проблемы с кодировкой при разборе результата анализа текста.
Проблему с https разрешил при помощи использования com-объекта WinHttp.WinHttpRequest.5.1.
Вместо ЗаписиДанных был использован объект ЗаписьТекста. Функция ПолучитьДанныеТела приняла вид:
Функция ПолучитьДанныеТела(Разделитель)
НовРазделитель = "--"+Разделитель;
ПервыйФайл = ПолучитьИмяВременногоФайла();
ПоследнийФайл = ПолучитьИмяВременногоФайла();
ЗаписьДанных = Новый ЗаписьТекста(ПервыйФайл, КодировкаТекста.ANSI, Символы.ПС);
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""model""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("whisper-1");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""language""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("ru");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""response_format""");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("text");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file"";filename=""audio.wav""");
ЗаписьДанных.ЗаписатьСтроку("Content-Type: audio/x-wav");
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.Закрыть();
ЗаписьДанных = Новый ЗаписьТекста(ПоследнийФайл, КодировкаТекста.ANSI, Символы.ВК + Символы.ПС);
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку(НовРазделитель+"--");
ЗаписьДанных.Закрыть();
ВременныйФайл = ПолучитьИмяВременногоФайла();
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(ПервыйФайл);
МассивФайлов.Добавить(Файл);
МассивФайлов.Добавить(ПоследнийФайл);
ОбъединитьФайлы(МассивФайлов,ВременныйФайл);
УдалитьФайлы(ПервыйФайл);
УдалитьФайлы(ПоследнийФайл);
Возврат ВременныйФайл;
КонецФункции
JSON пришлось собирать вручную, по кусочкам текста. Ну, а проблему с кодировкой путем записи потока в файл:
ВФ = ПолучитьИмяВременногоФайла();
Stream = Новый COMОбъект("ADODB.Stream"); //Для создания этого объекта требуется MDAC 2.5 и выше
Stream.Type = 1;
Stream.Mode = 3;
Stream.Open();
Stream.Write(WinHttp.ResponseBody());
Stream.SaveToFile(ВФ);
Stream.Close();
Текст = Новый ЧтениеТекста(ВФ, КодировкаТекста.UTF8);
АнализТекстаОтвет = Текст.Прочитать();
Обработки тестировались на версии 1С:Предприятие 8.3 (8.3.22.2143) и на версии 1С:Предприятие 8.2 (8.2.19.130).