Описание метода API
Генерирует речь по переданному тексту.
HTTP-запрос
POST https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize
Параметры в теле запроса
Для всех параметров обязательно используйте URL-кодирование. Максимальный размер тела POST-запроса 15 КБ.
Параметр | Описание |
---|---|
text | string Текст, который нужно озвучить, в кодировке UTF-8. Можно использовать только одно из полей text и ssml .Для передачи слов-омографов используйте + перед ударной гласной. Например, гот+ов или def+ect .Чтобы отметить паузу между словами, используйте - .Ограничение на длину строки: 5000 символов. |
ssml | string Текст, который нужно озвучить, в формате SSML. Можно использовать только одно из полей text и ssml . |
lang | string Язык. Допустимые значения:
|
voice | string Желаемый голос для синтеза речи из списка. Значение параметра по умолчанию: oksana .Подробнее о выборе голоса читайте в разделе Выбор голоса и качество произношения. |
emotion | (deprecated) string Эмоциональная окраска голоса. Поддерживается только при выборе русского языка ( ru-RU ) и голосов jane или omazh .Допустимые значения:
|
speed | string Скорость (темп) синтезированной речи. Для премиум-голосов временно не поддерживается. Скорость речи задается дробным числом в диапазоне от 0.1 до 3.0 . Где:
|
format | string Формат синтезируемого аудио. Допустимые значения:
|
sampleRateHertz | string Частота дискретизации синтезируемого аудио. Применяется, если значение format равно lpcm . Допустимые значения:
|
folderId | string Идентификатор каталога, к которому у вас есть доступ. Требуется для авторизации с пользовательским аккаунтом (см. ресурс UserAccount ). Не используйте это поле, если вы делаете запрос от имени сервисного аккаунта. Максимальная длина строки в символах — 50. |
Ответ
Если синтез прошел успешно, в ответе будет бинарное содержимое аудиофайла. Формат выходных данных зависит от значения параметра format
.
Примеры
Чтобы воспользоваться примерами, установите cURL и получите данные вашего аккаунта для авторизации:
- На странице биллинга убедитесь, что платежный аккаунт находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его. - Получите IAM-токен, необходимый для аутентификации.
- Получите идентификатор любого каталога, на который у вашего аккаунта есть роль
editor
или выше.
-
Выберите способ аутентификации:
-
Получите IAM-токен, используемый в примерах.
-
Создайте API-ключ. Передайте API-ключ в заголовке
Authorization
в следующем формате:Authorization: Api-Key <API-ключ>
-
-
Назначьте сервисному аккаунту роль
editor
или выше на каталог, в котором он был создан.Не указывайте в запросах идентификатор каталога — сервис использует каталог, в котором был создан сервисный аккаунт.
-
Аутентифицируйтесь в CLI от имени федеративного пользователя.
-
С помощью CLI получите IAM-токен, необходимый для аутентификации:
$ yc iam create-token
-
Получите идентификатор любого каталога, на который у вашего аккаунта есть роль
editor
или выше.
Превратить текст в речь в формате OggOpus
В этом примере текст "Hello World" синтезируется и записывается в аудиофайл.
По умолчанию данные в аудиофайле кодируются с помощью аудиокодека OPUS и упаковываются в контейнер OGG (OggOpus).
$ export FOLDER_ID=b1gvmob95yysaplct532
$ export IAM_TOKEN=CggaATEVAgA...
$ curl -X POST \
-H "Authorization: Bearer ${IAM_TOKEN}" \
--data-urlencode "text=Hello World" \
-d "lang=en-US&folderId=${FOLDER_ID}" \
"https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > 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 = "CggaATEVAgA..."; // Укажите IAM-токен.
const string folderId = "b1gvmob95yysaplct532"; // Укажите ID каталога.
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + iamToken);
var values = new Dictionary<string, string>
{
{ "text", "Hello World" },
{ "lang", "en-US" },
{ "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);
}
}
}
-
Создайте файл, например
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': 'en-US', '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)
-
Выполните созданный файл, передав в аргументах IAM-токен, идентификатор каталога, текст и имя файла для записи аудио:
$ export FOLDER_ID=b1gvmob95yysaplct532 $ export IAM_TOKEN=CggaATEVAgA... $ python test.py --token ${IAM_TOKEN} --folder_id ${FOLDER_ID} --output speech.ogg --text "Hello World"
<?
$token = 'CggaATEVAgA...'; # IAM-токен
$folderId = "b1gvmob95yysaplct532"; # Идентификатор каталога
$url = "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize";
$post = "text=" . urlencode("Hello World") . "&lang=en-US&folderId=${folderId}";
$headers = ['Authorization: Bearer ' . $token];
$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);
Превратить текст в речь в формате WAV
В этом примере переданный текст синтезируется в формате LPCM с частотой дискретизации 48 кГц и сохраняется в файле speech.raw
. Затем этот файл конвертируется в формат WAV с помощью утилиты SoX.
-
Синтезируйте файл в формате LCPM:
cURLC#PythonPHP$ export FOLDER_ID=b1gvmob95yysaplct532 $ export IAM_TOKEN=CggaATEVAgA... $ curl -X POST \ -H "Authorization: Bearer ${IAM_TOKEN}" \ -o speech.raw \ --data-urlencode "text=Hello World" \ -d "lang=en-US&folderId=${FOLDER_ID}&format=lpcm&sampleRateHertz=48000" \ https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize
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 = "CggaATEVAgA..."; // Укажите IAM-токен. const string folderId = "b1gvmob95yysaplct532"; // Укажите ID каталога. HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Authorization", "Bearer " + iamToken); var values = new Dictionary<string, string> { { "text", "Hello World" }, { "lang", "en-US" }, { "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); } } }
-
Создайте файл, например
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': 'en-US', '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)
-
Выполните созданный файл, передав в аргументах IAM-токен, идентификатор каталога, текст и имя файла для записи аудио:
$ export FOLDER_ID=b1gvmob95yysaplct532 $ export IAM_TOKEN=CggaATEVAgA... $ python test.py --token ${IAM_TOKEN} --folder_id ${FOLDER_ID} --output speech.raw --text "Hello World"
<? const FORMAT_PCM = "lpcm"; const FORMAT_OPUS = "oggopus"; $token = 'CggaATEVAgA...'; # IAM-токен $folderId = "b1gvmob95yysaplct532"; # Идентификатор каталога $url = "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize"; $post = "text=" . urlencode("Hello World") . "&lang=en-US&folderId=${folderId}&sampleRateHertz=48000&format=" . FORMAT_PCM; $headers = ['Authorization: Bearer ' . $token]; $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);
-
-
Cконвертируйте полученный файл в формат WAV с помощью утилиты SoX.
$ sox -r 48000 -b 16 -e signed-integer -c 1 speech.raw speech.wav
Превратить текст в формате SSML в речь
В этом примере текст передается в формате SSML.
Текст синтезируется и записывается в аудиофайл. По умолчанию данные в аудиофайле кодируются с помощью аудиокодека OPUS и упаковываются в контейнер OGG (OggOpus).
-
Создайте файл, например
text.xml
, и напишите в нем текст в формате SSML:<speak> Вот несколько примеров использования SSML. Вы можете добавить в текст паузу любой длины:<break time="2s"/> та-дааам! Или разметить текст на параграфы и предложения. Паузы между параграфами длиннее. <p><s>Первое предложение</s><s>Второе предложение</s></p> А еще вы можете подменять фразы. Например, чтобы произносить аббревиатуры и <sub alias="тому подобное">т.п.</sub> </speak>
-
Отправьте запрос с текстом на сервер. Текст передайте в параметре
ssml
. В этом примере содержимое файла считывается с помощью утилиты cat:$ export FOLDER_ID=b1gvmob95yysaplct532 $ export IAM_TOKEN=CggaATEVAgA... $ curl -X POST \ -H "Authorization: Bearer ${IAM_TOKEN}" \ --data-urlencode "ssml=`cat text.xml`" \ -d "lang=ru-RU&folderId=${FOLDER_ID}" \ "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize" > speech.ogg