Документация API
📖 Введение
Voiceponce – сервис, который позволяет загружать отзывы пользователей в виде аудио или текстовых файлов, транскрибировать их и анализировать полученный текст с помощью ИИ.
Через API вы можете инициировать создание новых транскрипций путём загрузки аудиофайлов (или текстовых файлов), запрашивать текущий статус транскрибации и анализа, получать результаты транскрибации и анализа, удалять созданные ранее транскрипции. API поддерживает аутентификацию с использованием токенов доступа, что обеспечивает безопасность и контроль доступа к ресурсам.
В случае, если отзыв был передан в виде текста, этап транскрибации будет пропущен.
📑 Спецификация API
OpenAPI-спецификация в формате JSON доступна по адресу:
Также для удобства вы можете просмотреть онлайн-предзагруженную спецификацию в одном из двух просмотрщиков по следующим ссылкам:
🚀 Быстрый старт
- Выполните аутентификацию, используя предоставленный вам сервисный аккаунт (пара:
USERNAME
иPASSWORD
), чтобы получить токен:Токен доступен в полеcurl -X POST "https://api.voiceponce.ru/api/v1/token" \ -F "username=USERNAME" \ -F "password=PASSWORD"
token
в ответе (действителен 24 часа): - Используя полученный токен
TOKEN
, загрузите аудиофайлFILE
с некоторой опциональными метаданными (SUBJECT_TITLE
иSUBJECT_URL
):Идентификатор транскрипции доступен в полеcurl -X POST "https://api.voiceponce.ru/api/v1/transcriptions" \ -H "Authorization: Bearer TOKEN" \ -F "input=@PATH/TO/FILE" \ -F "subject_title=SUBJECT_TITLE" \ -F "subject_url=SUBJECT_URL"
id
в ответе: - Получите всю доступную информацию о транскрипции:
Статус транскрипции доступен в поле
status
(если статус неcompleted
, попробуйте еще раз позже, например, через 10 секунд). Результаты представлены в полях ответа, названия которых начинаются сresult_
:
🔒 Аутентификация
API Voiceponce использует токены доступа для аутентификации пользователей и обеспечения безопасности с ограниченным временем действия (24 часа).
Получение токена
Для получения токена доступа необходимо отправить POST
-запрос с данными формы, содержащими username
и password
, на эндпоинт /api/v1/token
.
Для получения токена доступа учетная запись должна быть зарегистрирована в системе и иметь соответствующие права доступа. Убедитесь, что предоставленные учетные данные верны, чтобы избежать ошибок аутентификации.
Использование токена
При обращении к эндпоинтам, требующим авторизацию, передавайте токен в заголовке Authorization
в формате Bearer TOKEN
, где TOKEN
– ваш токен с ограниченным сроком действия.
Срок действия токена
Токен доступа действителен в течение 24 часов. По истечении этого времени необходимо запросить новый токен, чтобы продолжить использование API.
Роли
Для выполнения запросов сервисный аккаунт должен быть зарегистрирован в системе и обладать соответствующими правами доступа. Убедитесь, что предоставленные учетные данные верны, чтобы избежать ошибок аутентификации.
Возможные роли (назначаются администратором Voiceponce при создании сервисного аккаунта):
viewer
(предоставляет доступ только для чтения информации)editor
(позволяет создавать и удалять транскрипции)admin
(в настоящее время эквивалентна ролиeditor
)
ℹ️ Метаданные
При загрузке нового аудиофайла для транскрибации и анализа вы можете передать метаданные, релевантные сущности, (например, товару, услуге, приложению), о которой идет речь в отзыве. Метаданные могут быть использованы как алгоритмами транскрибирования и анализа для повышения качества транскрипции, так и аналитиками, которые могут проводить анализ обработанных отзывов. По возможности старайтесь передавать как можно более полную информацию.
Поддерживаемые поля:
subject_user_id
– идентификатор автора отзываsubject_title
– название сущности, о которой идет речь в отзывеsubject_description
– описание сущности, о которой идет речь в отзывеsubject_rating
– рейтинг, который выставил автор отзываsubject_max_rating
– максимально возможный рейтингsubject_url
– ссылка на сущностьsubject_article
– артикул/SKU сущности
🚥 Статусы
В результате загрузки файла обработка выполняется не мгновенно. Для отслеживания статуса вы можете выполнять запросы к эндпоинту /api/v1/transcriptions/id/status
(только статус и его словесное описание) или /api/v1/transcriptions/id
(полная информация о транскрипции) и проверять значение поля status
в ответе.
Статусы:
- В результате загрузки файла создаётся новая транскрипция со статусом
new
. - Новые запросы ставятся в очередь на обработку. Как только сервис Voiceponce начинает выполнение транскрибации и анализа, статус меняется на
processing
. - Для получения результатов транскрибации и анализа следует дождаться смены статуса на
completed
. - Если в процессе транскрибации возникла ошибка, статус меняется на
failed
. Строго говоря, статусfailed
не является терминальным. В ряде случаев сервис может попытаться автоматически исправить возникшую ошибку и обработать транскрипцию заново. При этом максимальный срок, в течение которого сервис совершает попытки повторной обработки, ограничен 24 часами. Транскрипции, которые находятся в статусеfailed
более 48 часов, повторно не обрабатываются.
Рекомендованный интервал проверки статуса:
- Если текущий статус
new
илиprocessing
, то рекомендованный интервал проверки составляет 10 секунд. - Если текущий статус
failed
, то рекомендованный интервал проверки составляет 10 минут.
📦 Результат
По завершении обработки статус транскрипции приобретает значение completed
. Для получения результата вы можете выполнять запросы к эндпоинту /api/v1/transcriptions/id/result
(только результат и его словесное описание) или /api/v1/transcriptions/id
(полная информация о транскрипции) и обращаться к полям ответа, названия которых начинаются с result_
.
result_text
(строка) – Полный текст переданного отзыва.result_revised_text
(строка) – Отредактированный текст результата транскрипции, пригодный для публикации.result_tldr
(строка) – Краткое резюме отзыва в 1-2 предложениях.result_name
(строка) – Название объекта отзыва (например, "доставка" или "Кофе Lavazza 1кг").result_category
(строка) – Категория объекта, например, "продукт", "услуга", "приложение".result_type_of_feedback
(строка) – Тип отзыва (например, жалоба, похвала, предложение).result_problem
(строка) – Основная проблема, упомянутая в отзыве, если таковая имеется.result_evidence_level
(строка, список значений ограничен) – Уровень доказательности отзыва:low
(низкий)medium
(средний)high
(высокий)
result_temporal_aspect
(строка) – Указанный временной аспект или продолжительность использования.result_keywords
(массив строк) – Список ключевых слов или фраз, отражающих основные темы отзыва.result_tone
(строка, список значений ограничен) – Общий эмоциональный тон отзыва:positive
(положительный)neutral
(нейтральный)negative
(негативный)
result_emotions
(массив строк, список значений ограничен) – Список конкретных эмоций, таких как:delight
(восторг)joy
(радость)trust
(доверие)gratitude
(благодарность)satisfaction
(удовлетворение)indifference
(безразличие)surprise
(удивление)uncertainty
(неопределённость)concern
(беспокойство)disappointment
(разочарование)irritation
(раздражение)anger
(злость)
result_call_to_action
(строка) – Явный запрос пользователя или предполагаемое ожидаемое действие от компании.
⚙️ Эндпоинты
Получение токена доступа
- Эндпоинт:
/api/v1/token
- Метод:
POST
- Параметры формы:
username
- имя сервисного аккаунтаpassword
- пароль/секрет сервисного аккаунта
- Ответ: JSON с токеном
В случае успешного выполнения сервис возвращает JSON со статусом 200
. Запрашиваемый токен доступен по ключу token
.
Пример запроса:
Пример ответа:
Версия
- Эндпоинт:
/api/v1/version
- Метод:
GET
- Ответ: Текстовая строка с версией
Этот запрос не требует авторизации и может быть использован, например, для проверки доступности сервиса Voiceponce. В случае успешного выполнения сервис возвращает строку с версией со статусом 200
.
Пример запроса:
Пример ответа:
Загрузка отзыва
- Эндпоинт:
/api/v1/transcriptions
- Метод:
POST
- Аутентификация: Заголовок
Authorization
со значениемBearer TOKEN
- Требуемая роль:
editor
- Тип контента:
multipart/form-data
илиapplication/json
- Параметры формы (в случае контента типа
multipart/form-data
):- Обязательные:
input
– аудио или текстовый файл
- Опциональные:
language
– язык отзыва, например,ru
илиen
(если язык не указан, сервис будет считать, что язык отзыва – русский)subject_user_id
– идентификатор автора отзываsubject_title
– название сущности, о которой идет речь в отзывеsubject_description
– описание сущности, о которой идет речь в отзывеsubject_rating
– рейтинг, который выставил автор отзываsubject_max_rating
– максимально возможный рейтингsubject_url
– ссылка на сущностьsubject_article
– артикул/SKU сущности
- Обязательные:
- Поля JSON (в случае контента типа
application/json
):- Обязательные:
input
– текст отзыва или файл, закодированный в base64-строку (аудио или текстовый файл)input_extension
– расширение файла (имеет смысл и является обязательным только в случае передачи аудиофайла в полеinput
), например:mp3
,m4a
и др.
- Опциональные:
language
– язык отзыва, например,ru
илиen
(если язык не указан, сервис будет считать, что язык отзыва – русский)subject_user_id
– идентификатор автора отзываsubject_title
– название сущности, о которой идет речь в отзывеsubject_description
– описание сущности, о которой идет речь в отзывеsubject_rating
– рейтинг, который выставил автор отзываsubject_max_rating
– максимально возможный рейтингsubject_url
– ссылка на сущностьsubject_article
– артикул/SKU сущности
- Обязательные:
- Ответ: JSON с ID транскрипции
Выполнение данного запроса инициирует асинхронный процесс транскрибирования и анализа отзыва. Для выполнения этого запроса сервисный аккаунт, от имени которого выполняется запрос, должен иметь назначенную роль не ниже уровня editor
.
Существует два альтернативных способа передачи данных:
- В виде формы (
multipart/form-data
). В этом случае единственным обязательным параметром формы являетсяinput
(аудио или текстовый файл). - В виде JSON (
application/json
). В этом случае обязательным полем являетсяinput
(текст отзыва в виде строки или файл, закодированный в base64-строку; при этом закодированный файл может быть как текстовым, так и аудио). Также, если в качествеinput
был передан аудиофайл, необходимо передать еще одно полеinput_extension
с расширением аудиофайла, содержимое которого было передано в полеinput
.
Если был передан аудиофайл, он будет транскрибирован перед анализом. Если же отзыв передан в виде текста в том или ином виде, его содержимое будет использовано как текст отзыва.
Опционально вы можете передать метаданные, релевантные сущности (например, товару, услуге или приложению), о которой идет речь в отзыве. Метаданные могут быть использованы как алгоритмами транскрибирования и анализа для повышения качества транскрипции, так и аналитиком, который может проводить анализ обработанных отзывов. По возможности старайтесь передавать как можно более полную информацию.
В случае успешного выполнения сервис возвращает JSON со статусом 200
. Идентификатор транскрипции доступен по ключу id
. Запомните идентификатор, чтобы иметь возможность получить информацию о транскрипции в будущем.
Пример запроса с передачей файла через форму (multipart/form-data
):
curl -X POST "https://api.voiceponce.ru/api/v1/transcriptions" \
-H "Authorization: Bearer TOKEN" \
-F "input=@PATH/TO/FILE" \
-F "subject_user_id=SUBJECT_USER_ID" \
-F "subject_title=SUBJECT_TITLE" \
-F "subject_description=SUBJECT_DESCRIPTION" \
-F "subject_rating=SUBJECT_RATING" \
-F "subject_max_rating=SUBJECT_MAX_RATING" \
-F "subject_url=SUBJECT_URL" \
-F "subject_article=SUBJECT_ARTICLE"
Пример запроса с передачей отзыва в виде текста через JSON (application/json
):
curl -s -X POST "https://api.voiceponce.ru/api/v1/transcriptions" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"input": "Отличный товар!"}'
Пример запроса с передачей текстового файла через JSON (application/json
):
curl -s -X POST "https://api.voiceponce.ru/api/v1/transcriptions" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"input": "0J7RgtC70LjRh9C90YvQuSDRgtC+0LLQsNGAIQ=="}'
Пример запроса с передачей аудио файла через JSON (application/json
):
filepath="PATH/TO/FILE"
extension="${filepath##*.}"
content=$(base64 -i ${filepath} | tr -d '\n')
data=$(cat <<eof
{
"input": "${content}",
"input_extension": "${extension}"
}
eof)
echo ${data} | curl -s -X POST "https://api.voiceponce.ru/api/v1/transcriptions" \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d @-
Пример ответа:
Получение статуса транскрипции
- Эндпоинт:
/api/v1/transcriptions/{id}/status
- Метод:
GET
- Аутентификация: Заголовок
Authorization
со значениемBearer TOKEN
- Параметры пути:
id
(идентификатор транскрипции) - Ответ: JSON со статусом транскрипции (
new
,processing
,completed
,failed
)
В результате загрузки файла создаётся новая трансрипция со статусом new
. Новые запросы ставятся в очередь на обработку. Как только сервис Voiceponce начинает выполнения транскрибации и анализа, статус меняется на processing
. Для получения результатов транскрибации и анализа следует дождаться смены статуса на completed
. Если в процессе транскрибации возникла ошибка, то статус меняется на failed
.
Рекомендованный интервал проверки статуса – 10 секунд.
Пример запроса:
curl -X GET "https://api.voiceponce.ru/api/v1/transcriptions/ID/status" \
-H "Authorization: Bearer TOKEN"
Пример ответа:
Получение результата
- Эндпоинт:
/api/v1/transcriptions/{id}/result
- Метод:
GET
- Аутентификация: Заголовок
Authorization
со значениемBearer TOKEN
- Параметры пути:
id
(идентификатор транскрипции) - Ответ: JSON с результатом транскрипции
Пример запроса:
curl -X GET "https://api.voiceponce.ru/api/v1/transcriptions/ID/result" \
-H "Authorization: Bearer TOKEN"
Пример ответа:
{
"detail": "Transcription result provided",
"result_text": "Вещь классная. У меня около дома настольная лампа, а оценя такой апгрейд за небольшие деньги. Полностью доволен, светит достаточно ярко.",
"result_revised_text": "Вещь классная. У меня около дома настольная лампа, а оценя такой апгрейд за небольшие деньги. Полностью доволен, светит достаточно ярко.",
"result_tldr": "Этот отзыв положительный: пользователь испытывает удовлетворение из-за удачного апгрейда настольной лампы за небольшие деньги.",
"result_name": "настольная лампа",
"result_category": "product",
"result_type_of_feedback": "похвала за апгрейд",
"result_problem": "",
"result_evidence_level": "medium",
"result_temporal_aspect": "",
"result_keywords": [
"настольная лампа",
"апгрейд",
"небольшие деньги",
"доволен",
"яркий свет"
],
"result_tone": "positive",
"result_emotions": [
"delight",
"joy"
],
"result_call_to_action": ""
}
Получение детальной информации о транскрипции
- Эндпоинт:
/api/v1/transcriptions/{id}
- Метод:
GET
- Аутентификация: Заголовок
Authorization
со значениемBearer TOKEN
- Параметры пути:
id
(идентификатор транскрипции) - Ответ: JSON с полной информацией о транскрипции
Пример запроса:
Пример ответа:
{
"detail": "Transcription completed successfully",
"id": "ID",
"status": "completed",
"result_text": "Вещь классная. У меня около дома настольная лампа, а оценя такой апгрейд за небольшие деньги. Полностью доволен, светит достаточно ярко.",
"result_revised_text": "Вещь классная. У меня около дома настольная лампа, а оценя такой апгрейд за небольшие деньги. Полностью доволен, светит достаточно ярко.",
"result_tldr": "Этот отзыв положительный: пользователь испытывает удовлетворение из-за удачного апгрейда настольной лампы за небольшие деньги.",
"result_name": "настольная лампа",
"result_category": "product",
"result_type_of_feedback": "похвала за апгрейд",
"result_problem": "",
"result_evidence_level": "medium",
"result_temporal_aspect": "",
"result_keywords": [
"настольная лампа",
"апгрейд",
"небольшие деньги",
"доволен",
"яркий свет"
],
"result_tone": "positive",
"result_emotions": [
"satisfaction",
"joy"
],
"result_call_to_action": "",
"project_id": "b6825c55-ff76-43f4-bba1-62ccc2963186",
"language": null,
"subject_user_id": "12345",
"subject_title": "Лампа настольная Light Fox Pro",
"subject_description": null,
"subject_rating": 4.0,
"subject_max_rating": 5.0,
"subject_url": null,
"subject_article": "12345678",
"note": null
}
Удаление транскрипции
- Эндпоинт:
/api/v1/transcriptions/{id}
- Метод:
DELETE
- Аутентификация: Заголовок
Authorization
со значениемBearer TOKEN
- Требуемая роль:
editor
- Параметры пути:
id
(идентификатор транскрипции) - Ответ: JSON с сообщением об успешном удалении
Для выполнения этого запроса сервисный аккаунт, от имени которого выполняется запрос, должен иметь назначенную роль как минимум уровня editor
.
Пример запроса:
curl -X DELETE "https://api.voiceponce.ru/api/v1/transcriptions/ID" \
-H "Authorization: Bearer TOKEN"
Пример ответа:
🚫 Ошибки
Ошибка аутентификации 401
Ошибка аутентификации 401
(Unauthorized) означает, что учетные данные или токен неверны.
Примеры ответов:
Ошибка доступа 403
Ошибка 403
(Forbidden) означает, что у аккаунта, от имени которого была выполнена аутентификация, нет подходящих прав.
Примеры ответов:
Ошибка ресурса 404
Ошибка 404
(Not found) означает, что запрашиваемый ресурс не найден.
Пример ответа:
Ошибка валидации 422
Ошибка валидации запроса 422
(Unprocessable entity) возникает, например, если вы не передали все необходимые параметры.
Пример ответа:
{
"detail": [
{
"loc": ["body", "field_name"],
"msg": "field required",
"type": "value_error.missing"
}
]
}
Ошибка 400
Прочие ошибки имеют статус 400
(Bad request).
Пример ответа:
Ошибки 5xx
Ошибки с кодом 5xx
(например, 500
, 502
, 503
, 504
) означают, что на стороне сервера произошла внутренняя ошибка или временная недоступность сервиса. Такие ошибки, как правило, не связаны с некорректностью запроса клиента, а указывают на проблемы в инфраструктуре или обработке на сервере.
Рекомендации:
- При получении ошибки 5xx
рекомендуется повторить запрос через некоторое время.
- Для минимизации нагрузки на сервер и повышения вероятности успешного выполнения запроса используйте стратегию экспоненциального увеличения интервала между попытками (exponential backoff). Например, увеличивайте задержку между повторными запросами по формуле: 1 секунда, 2 секунды, 4 секунды, 8 секунд и т.д., до достижения разумного лимита попыток.