Обновить Yandex SpechKit - как? Кто обновил\перешёл на v3, поделитесь опытом

Как на версии SpeechKit v1. Строка http-запроса к серверу:

https://tts.voicetech.yandex.net/generate?text=Озвучить текст&format=mp3&lang=ru-RU&speaker=jane&emotion=neutral&key=[здесь ваш ключ]

Вставлялось в плеер и всё работало и работает сейчас прекрасно.
Но! Но они создали ИИ и теперь ИИ говорит конечно же приятнее и ближе к человеческой речи.
И с подключением ИИ Yandex перешли сразу на версию 3.
В версии 3 указан формат такого рода:

HTTP-запрос:

GRPC tts.api.cloud.yandex.net: 443 

Параметры в теле запроса:

{ 
    "text": "Озвучить текст", 
    "hints": [ 
        { 
            "speed": 1 
        }, 
        { 
            "voice": "jane" 
        }, 
        { 
            "role": "neutral" 
        } 
    ] 
}

И я не понимаю на каком языке это делать? Это явно не строка GET обращения к API, и не php. И что за GRPC такое?

Как это всё "завернуть" в строку GET-запроса не понимаю.
В документации описание прямой реализации не нашёл.

P.S. И с GRPC нет опыта работы. Это устанавливать дополнительно на сервер?


Ответы (1 шт):

Автор решения: Artem Gafarov

В Get запрос сейчас генерацию не завернешь. Они предоставляют GRPC и REST API. Если с первым опыта нет, то со вторым должно быть понятнее. Документация здесь.

Что нужно сделать:

  1. Получить API-ключ. Думаю, у вас уже есть.
  2. Сформировать POST-запрос по этому URL: https://tts.api.cloud.yandex.net/tts/v3/utteranceSynthesis.
  3. В Header к этому запросу указать "Authorization": "Api-Key" <ваш_ключ>. Подробнее здесь.
  4. Тело запроса представляет из себя JSON. Полное описание здесь. Я писал на Python c использованием из библиотеки, поэтому подробно про содержание полей в теле запроса не расскажу. Но основная структура выглядит следующим образом:
{
  "model": "string",
  "hints": [
    {

      // `hints[]` includes only one of the fields `voice`, `audioTemplate`, `speed`, `volume`, `role`, `pitchShift`, `duration`
      "voice": "string",
      "audioTemplate": {
        "audio": {
          "audioSpec": {

            // `hints[].audioTemplate.audio.audioSpec` includes only one of the fields `rawAudio`, `containerAudio`
            "rawAudio": {
              "audioEncoding": "string",
              "sampleRateHertz": "string"
            },
            "containerAudio": {
              "containerAudioType": "string"
            },
            // end of the list of possible fields`hints[].audioTemplate.audio.audioSpec`

          },
          "content": "string"
        },
        "textTemplate": {
          "textTemplate": "string",
          "variables": [
            {
              "variableName": "string",
              "variableValue": "string"
            }
          ]
        },
        "variables": [
          {
            "variableName": "string",
            "variableStartMs": "string",
            "variableLengthMs": "string"
          }
        ]
      },
      "speed": "number",
      "volume": "number",
      "role": "string",
      "pitchShift": "number",
      "duration": {
        "policy": "string",
        "durationMs": "string"
      },
      // end of the list of possible fields`hints[]`

    }
  ],
  "outputAudioSpec": {

    // `outputAudioSpec` includes only one of the fields `rawAudio`, `containerAudio`
    "rawAudio": {
      "audioEncoding": "string",
      "sampleRateHertz": "string"
    },
    "containerAudio": {
      "containerAudioType": "string"
    },
    // end of the list of possible fields`outputAudioSpec`

  },
  "loudnessNormalizationType": "string",
  "unsafeMode": true,

  //  includes only one of the fields `text`, `textTemplate`
  "text": "string",
  "textTemplate": {
    "textTemplate": "string",
    "variables": [
      {
        "variableName": "string",
        "variableValue": "string"
      }
    ]
  },
  // end of the list of possible fields

}
→ Ссылка