Синтез речи в формате WAV с помощью API v1
Пример показывает, как с помощью API v1 синтезировать речь из текста в TTS-разметке в файл формата WAV
В примере заданы следующие параметры синтеза:
- формат синтезированного аудиофайла — LPCM с частотой дискретизации 48 000 Гц, контейнер WAV
; - язык — русский;
- голос —
filipp
.
Преобразование и запись результата в формат WAV выполняются с помощью утилиты SoX
Аутентификация происходит от имени аккаунта на Яндексе или федеративного аккаунта с помощью IAM-токена. Если вы используете сервисный аккаунт, передавать в запросе идентификатор каталога не нужно. Подробнее об аутентификации в API SpeechKit см. Аутентификация в API SpeechKit.
-
Синтезируйте файл в формате LPCM:
cURLC#Python 3PHPОтправьте запрос на преобразование текста в речь:
read -r -d '' TEXT << EOM > Я Яндекс Спичк+ит. > Я могу превратить любой текст в речь. > Теперь и в+ы — можете! EOM export FOLDER_ID=<идентификатор_каталога> export IAM_TOKEN=<IAM-токен> curl \ --request POST \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --output speech.raw \ --data-urlencode "text=${TEXT}" \ --data "lang=ru-RU&voice=filipp&folderId=${FOLDER_ID}&format=lpcm&sampleRateHertz=48000" \ https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize
Где:
TEXT
— текст в TTS-разметке, который нужно синтезировать.FOLDER_ID
— идентификатор каталога.IAM_TOKEN
— IAM-токен.lang
— язык текста.voice
— голос для синтеза речи.format
— формат синтезированного аудиофайла.sampleRateHertz
— частота дискретизации аудиофайла в формате LPCM.
Отправьте запрос на преобразование текста в речь:
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 }, { "format", "lpcm" }, { "sampleRateHertz", "48000" } }; 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.raw", responseBytes); } } }
Где:
iamToken
— IAM-токен.folderId
— идентификатор каталога.text
— текст в TTS-разметке, который нужно синтезировать.lang
— язык текста.voice
— голос для синтеза речи.format
— формат синтезированного аудиофайла.sampleRateHertz
— частота дискретизации аудиофайла в формате LPCM.
-
Создайте файл, например
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, 'format': 'lpcm', 'sampleRateHertz': 48000, } 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)
Где:
-
Выполните созданный файл:
export FOLDER_ID=<идентификатор_каталога> export IAM_TOKEN=<IAM-токен> python3 test.py --token ${IAM_TOKEN} --folder_id ${FOLDER_ID} --output speech.raw --text "Я Яндекс Спичк+ит. Я могу превратить любой текст в речь. Теперь и в+ы — можете!"
Где:
FOLDER_ID
— идентификатор каталога.IAM_TOKEN
— IAM-токен.--output
— имя файла для записи аудио.--text
— текст в TTS-разметке, который нужно синтезировать.
Отправьте запрос на преобразование текста в речь:
<?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', 'format' => 'lpcm', 'sampleRateHertz' => '48000'); $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.raw", $response); } curl_close($ch);
Где:
token
— IAM-токен.folderId
— идентификатор каталога.text
— текст в TTS-разметке, который нужно синтезировать.lang
— язык текста.voice
— голос для синтеза речи.format
— формат синтезированного аудиофайла.sampleRateHertz
— частота дискретизации аудиофайла в формате LPCM.
-
Сконвертируйте полученный файл в формат WAV с помощью утилиты SoX
:sox -r 48000 -b 16 -e signed-integer -c 1 speech.raw speech.wav