Синтез речи в формате OggOpus с помощью API v1

С помощью API v1 можно синтезировать речь из текста в TTS-разметке в файл формата OggOpus.

В примере заданы следующие параметры синтеза:

  • язык — русский;
  • голосfilipp;
  • остальные параметры оставлены по умолчанию.

Аутентификация происходит от имени аккаунта на Яндексе или федеративного аккаунта с помощью IAM-токена. Если вы используете сервисный аккаунт, передавать в запросе идентификатор каталога не нужно. Подробнее об аутентификации в API SpeechKit см. Аутентификация в API SpeechKit.

Отправьте запрос на преобразование текста в речь:

read -r -d '' TEXT << EOM
        > Я Яндекс Спичк+ит.
        > Я могу превратить любой текст в речь.
        > Теперь и в+ы — можете!
        EOM
        export FOLDER_ID=<идентификатор_каталога>
        export IAM_TOKEN=<IAM-токен>
        curl \
          --request POST \
          --header "Authorization: Bearer ${IAM_TOKEN}" \
          --data-urlencode "text=${TEXT}" \
          --data "lang=ru-RU&voice=filipp&folderId=${FOLDER_ID}" \
          "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > speech.ogg
        

Где:

Синтезированная речь будет записана в файл speech.ogg в папке, из которой вы отправляли запрос.

Отправьте запрос на преобразование текста в речь:

using System;
        using System.Collections.Generic;
        using System.Net.Http;
        using System.Threading.Tasks;
        using System.IO;
        
        namespace TTS
        {
          class Program
          {
            static void Main()
            {
              Tts().GetAwaiter().GetResult();
            }
        
            static async Task Tts()
            {
              const string iamToken = "<IAM-токен>";
              const string folderId = "<идентификатор_каталога>";
        
              HttpClient client = new HttpClient();
              client.DefaultRequestHeaders.Add("Authorization", "Bearer " + iamToken);
              var values = new Dictionary<string, string>
              {
                { "text", "Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!" },
                { "lang", "ru-RU" },
                { "voice", "filipp" },
                { "folderId", folderId }
              };
              var content = new FormUrlEncodedContent(values);
              var response = await client.PostAsync("https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize", content);
              var responseBytes = await response.Content.ReadAsByteArrayAsync();
              File.WriteAllBytes("speech.ogg", responseBytes);
            }
          }
        }
        

Где:

Синтезированная речь будет записана в файл speech.ogg в папке, из которой вы отправляли запрос.

  1. Создайте файл, например test.py, и добавьте в него следующий код:

    import argparse
            import requests
            
            def synthesize(folder_id, iam_token, text):
               url = 'https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize'
               headers = {
                   'Authorization': 'Bearer ' + iam_token,
               }
            
               data = {
                   'text': text,
                   'lang': 'ru-RU',
                   'voice': 'filipp',
                   'folderId': folder_id
               }
            
               with requests.post(url, headers=headers, data=data, stream=True) as resp:
                   if resp.status_code != 200:
                       raise RuntimeError("Invalid response received: code: %d, message: %s" % (resp.status_code, resp.text))
            
                   for chunk in resp.iter_content(chunk_size=None):
                       yield chunk
            
            if __name__ == "__main__":
               parser = argparse.ArgumentParser()
               parser.add_argument("--token", required=True, help="IAM token")
               parser.add_argument("--folder_id", required=True, help="Folder id")
               parser.add_argument("--text", required=True, help="Text for synthesize")
               parser.add_argument("--output", required=True, help="Output file name")
               args = parser.parse_args()
            
               with open(args.output, "wb") as f:
                   for audio_content in synthesize(args.folder_id, args.token, args.text):
                       f.write(audio_content)
            

Где:

  1. Выполните созданный файл:

    export FOLDER_ID=<идентификатор_каталога>
            export IAM_TOKEN=<IAM-токен>
            python3 test.py
              --token ${IAM_TOKEN} \
              --folder_id ${FOLDER_ID} \
              --output speech.ogg \
              --text "Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!"
            

    Где:

    Синтезированная речь будет записана в файл speech.ogg в папке, из которой вы выполняли файл.

Отправьте запрос на преобразование текста в речь:

<?php
        
        $token = '<IAM-токен>'; # Укажите IAM-токен.
        $folderId = "<идентификатор_каталога>"; # Укажите идентификатор каталога.
        
        $url = "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize";
        $headers = ['Authorization: Bearer ' . $token];
        $post = array(
            'text' => "Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!",
            'folderId' => $folderId,
            'lang' => 'ru-RU',
            'voice' => 'filipp');
        
        $ch = curl_init();
        
        curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, false);
        if ($post !== false) {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        }
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        
        $response = curl_exec($ch);
        if (curl_errno($ch)) {
            print "Error: " . curl_error($ch);
        }
        if (curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200) {
            $decodedResponse = json_decode($response, true);
            echo "Error code: " . $decodedResponse["error_code"] . "\r\n";
            echo "Error message: " . $decodedResponse["error_message"] . "\r\n";
        } else {
            file_put_contents("speech.ogg", $response);
        }
        curl_close($ch);
        

Где:

Синтезированная речь будет записана в файл speech.ogg в папке, из которой вы отправляли запрос.

Установите необходимые зависимости:

npm install --save axios form-data
        

Отправьте запрос на преобразование текста в речь:

import FormData from 'form-data';
        import axios from 'axios';
        import fs from 'node:fs';
        
        const IAM_TOKEN = '<IAM_TOKEN>';
        const FOLDER_ID = '<FOLDER_ID>';
        
        const formData = new FormData();
        
        formData.append('voice', 'filipp');
        formData.append('text', 'Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!');
        formData.append('lang', 'ru-RU');
        formData.append('folderId', FOLDER_ID);
        
        const headers = {
          Authorization: `Bearer ${IAM_TOKEN}`,
          ...formData.getHeaders(),
        };
        
        axios
          .post('https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize', formData, {
            headers,
            responseType: 'arraybuffer'
          })
          .then(response => fs.writeFileSync('speech.ogg', response.data));
        

Где:

Синтезированная речь будет записана в файл speech.ogg в папке, из которой вы отправляли запрос.

См. также