Вчера понадобилось мне записать голос для голосового (IVR) меню.. Решил воспользоваться голосами от яндекс.облака, тем более что они теперь все высококачественные, и от человеческого неотличимы. Но как бы это сделать поудобнее, чтобы не надо было потом файлы редактировать и конвертировать? Казалось бы, можно воспользоваться демкой на странице описания, но во первых там есть ограничение длины текста, во вторых она дает сохранить только запись в формате ogg, и в третьих иногда добавляет в запись рекламу. Оно и понятно в общем то, эта демка предназначена для показа технологии а не для коммерческого использования.

Резюме - надо получать записи как положено, через api, тем более что оно простое и понятное, только небольшая сложность с авторизацией. Но то что оно несложное не значит что им можно легко и просто с нуля воспользоваться, нужен хоть какой то интерфейс.

Беглый гуглёж ничего не принес, только несколько малопонятных проектов на гитхабе.

Уже думал быстренько наваять какой нибудь свой веб-интерфейс но тут вспомнил что есть Postman. Для тех кто не в теме - это замечательная программа для тестирования любых api интерфейсов.

Для дальнейших действий предполагается что вы уже зарегистрированы в яндекс.облаке, ваш аккаунт активен и оплачен (деньгами или грантом).

Итак, вооружимся документацией. Запрос к text2speech по сути это простой post запрос. Параметры передаются в теле запроса. Единственная сложность - это авторизация. Подписывать запросы надо IAM токенами, но у них срок жизни - до 12 часов, в некоторых случаях меньше. Яндекс рекомендует обновлять токены раз в час или вообще получать при каждом запросе. Получить токен можно в командной строке, но если это не автоматизировать, это придется делать руками и часто.

К счастью, у postman есть функционал pre-request script. Это когда программа, перед тем как отправить запрос к api, выполняет какие то действия. Скрипты пишутся там на js, ничего сложного. Результаты потом отправляются в запрос в переменных.

Получим сначала пару нужных значений: id каталога и oauth-токен.

Первое берется просто из адресной строки браузера

Oauth-токен берется по инструкции на этой странице (вкладка api). Я намеренно не привожу тут ссылку для его получения, чтобы вы использовали только ссылку из официальной документации. Помните, что oauth-токен - это ключ к вашему облаку, распоряжайтесь им бережливо. Кроме того, можно использовать токен для сервисного аккаунта, ему можно дать только нужные права.

Итак, открываем Postman, и заполняем запрос:

Адрес post запроса https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize, тип авторизации Bearer Token, вместо самого токена пишем конструкцию {{token}}.

Заполняем тело запроса:

Тип кодирования x-www-form-urlencoded.
Ключи:
text - {{text}}
lang - ru-RU
speed - 1
voice - oksana (список голосов доступен в документации)
emotion - good (список эмоций доступен в документации)
folderId - id каталога, который вы получили выше
format - mp3 (список форматов доступен в документации)

Ну и на вкладку pre-request script вставляем простой скрипт. Не забудьте вставить ваш oauth-токен.

const postRequest = {
  url: 'https://iam.api.cloud.yandex.net/iam/v1/tokens?yandexPassportOauthToken=<ваш oauth-токен>',
  method: 'POST',
};
pm.sendRequest(postRequest, (error, response) => {
  console.log(error ? error : response.json());
  var tok = response.json();
  console.log(tok['iamToken']);
  pm.collectionVariables.set("token", tok['iamToken']);
});

var text = "\
Это пример текста который надо озвучить. Для переноса строки пользуйтесь обратным слешем.\
";

pm.collectionVariables.set("text", text);

Ну вот собственно и все. Теперь если нажать на кнопку "Send" в нижнюю часть окна загрузится mp3 файл, который можно там же прослушать и сохранить.

Комментарии (3)


  1. vipassa
    18.04.2022 20:49
    -1

    Ох и сложно то как. Может надо искать проще варианты?


    1. past
      19.04.2022 22:09

      Куда уж проще?


  1. kolabaister Автор
    18.04.2022 22:05

    Вообще в статье есть скриншоты, но они почему то не показываются. Поддержка в курсе, но пока проблема не решается. На всякий случай добавляю тут, в порядке упоминания в статье.

    Скриншоты