Объект Device/Методы/TextToSound
Синтаксис
TextToSound (BSTR Text, BSTR Parameters)
Параметры
- Text - текст синтезируемого сообщения.
- Parameters - параметры синтеза текста.
Параметры синтеза текста с использованием сервиса Google
- Service - сервис синтеза Google (Service=Google;).
- Lang - язык.
- Speed - скорость произнесения текста.
- Voice - голос.
- Emotion - эмоциональная окраска голоса.
Параметры синтеза текста с использованием сервиса Yandex API v1
- Service - сервис синтеза Google (Service=Yandex;).
- lang - язык (список языков).
- speed - скорость произнесения текста.
- voice - голос.
- emotion - эмоциональная окраска голоса.
Описание параметров на сайте Яндекс.
Если синтезируемый текст находится внутри тегов <speak>, текст передается в формате SSML, иначе текст воспринимается как текст в TTS-разметке.
Различия в синтезе голоса между версиями API v1 и v3.
Параметры синтеза текста с использованием сервиса Yandex API v3
- Service - сервис синтеза Yandex (Service=Yandex;API=v3;).
- Model - модель распознавания (пока не используется).
- Voice - голос (список голосов).
- Speed - скорость произнесения текста.
- Volume - громкость.
- Role - амплуа/эмоциональная окраска голоса/характер произношения. Допустимые параметры зависят от голоса (список голосов и амплуа).
- Pitch - смена высоты звука в Гц. Значения от -1000 до 1000 (по умолчанию 0).
- LoudnessNormalizationType - тип нормализации громкости:
- MAX_PEAK - пиковая нормализация, при которой уровень звукового сигнала поднимается до максимально возможного значения для цифрового звука без появления искажений.
- LUFS - взвешенная нормализация на основе стандарта EBU R128, в соответствии с которым нормализация громкости производится относительно цифровой полной шкалы (по умолчанию).
- IsUnsafeMode - позволяет использовать синтез текста более 250 символов за раз. Возможно некоторое снижение качества синтеза.
Описание параметров на сайте Яндекса. Текст воспринимается как текст в TTS-разметке.
Различия в синтезе голоса между версиями API v1 и v3.
Параметры синтеза текста с использованием сервиса Tinkoff
- Service - сервис синтеза Google (Service=Tinkoff;).
- Voice - голос (список голосов).
- Speed - cкорость произношения. Задаётся в долях от естественной скорости произношения для конкретного голоса. Например, значение 0.5 - замедляет речь в два раза, 2 - ускоряет речь в 2 раза. Поддерживаются значения от 0.33 до 3 (по умолчанию - 1.0).
- Pitch - высота речи. Задаётся в долях от естественной высоты конкретного голоса. Например, значение 0.5 - понижает высоту голоса в 2 раза, 2 - повышает высоту голоса в 2 раза. Поддерживаются значения от 0.33 до 3 (по умолчанию - 1.0).
Описание параметров на сайте Tinkoff. Если синтезируемый текст находится внутри тегов <speak>, текст передается в формате SSML, иначе текст воспринимается как текст без SSML-разметки, допускается пунктуация.
Синтез с использованием COSpeech
COSpeech - локальный речевой сервер Call Office: синтез речи (Text To Speech) и распознавание (Speech To Text) работают на том же компьютере, где стоит телефония, без обращения к внешним сервисам. Синтез отвечает по HTTP на порту 6002 (порт меняется в окне «Настройки» → «Синтез»).
В отличие от параметров Service, описанных выше, здесь нет объекта Sound и выбора облачного сервиса: клиент получает готовый звук прямо в ответе на HTTP-запрос к локальному серверу.
Синтаксис
GET http://127.0.0.1:6002/?speak=<текст>&voice=<голос>&rate=<темп>&sample_rate=<частота>&format=<формат>&stream=1&rw=on POST http://127.0.0.1:6002/ (тело: JSON или application/x-www-form-urlencoded, поле text)
Ответ - аудио (PCM16 или контейнер WAV) либо текст ошибки. Параметры можно передавать и в GET-запросе, и в теле POST; в POST строка запроса не читается.
Параметры
| Параметр | Допустимые значения | По умолчанию | Описание |
|---|---|---|---|
| speak (GET), text (POST) | любой текст в UTF-8 | - | Синтезируемый текст. Обязателен: без него GET отвечает редиректом 301. |
| voice | имя из списка голосов, номер 1..N или прежний идентификатор | голос по умолчанию из настроек | Голос синтеза. Неизвестное значение не считается ошибкой - берётся голос по умолчанию. |
| rate | x-slow, slow, medium, fast, x-fast | автоматически по длине текста | Темп речи. Другие значения - ошибка 400. |
| sample_rate | 8000, 24000, 48000 | 48000 | Частота ответа. Любое другое значение (в том числе 44100 и пустое) даёт 48000. |
| format | wav (регистр не важен) | не указан - сырой PCM16 | Формат ответа: контейнер RIFF/WAVE или сырой поток. |
| stream | 1 | не указан | Потоковая отдача: кадр на каждое предложение, ответ приходит по мере синтеза. Значение читается строго как строка «1». |
| rw | on/off (также 1/0, true/false, yes/no) | off | Синтез в обход кэша: фраза заново попадает в кэш. Нужен, когда кэш прогревают заранее. |
| abr | on/off (также 1/0, true/false, yes/no) | on | Принимается для совместимости с прежним контрактом. На результат сейчас не влияет: сокращения раскрываются всегда. |
Имена параметров регистронезависимы; если параметр передан несколько раз, берётся последнее значение.
Голос (voice)
Список голосов машины отдаёт запрос GET /?voices - JSON-массив подписей на языке, выбранном в настройках, в том порядке, в котором они идут в интерфейсе. Для русского языка это 20 имён: Айгуль, Александр, Альбина, Альфия, Богдан, Галина, Дмитрий, Екатерина, Жанна, Зара, Зинаида, Зоя, Игорь, Ксения, Марат, Марина, Оксана, Роман, Саида, Эдуард.
Параметр voice принимает:
- имя из этого списка -
voice=Зинаида(регистр не важен); - номер по порядку -
voice=11(нумерация с 1); - прежний идентификатор -
voice=ru_zinaida(совместимость с клиентами, которые сохранили список до переименования голосов).
Если голос не указан, написан с ошибкой или снят с публикации приёмкой качества, синтез идёт голосом по умолчанию - ошибки не будет. После смены языка в настройках список меняется, поэтому клиенту нужно обновлять его запросом /?voices, а не хранить копию: ответ отдаётся с заголовком Cache-Control: no-store именно для этого.
Темп речи (rate)
| Значение | Множитель |
|---|---|
| x-slow | 0,85 |
| slow | 1,0 |
| medium | 1,25 |
| fast | 1,5 |
| x-fast | 1,75 |
Если параметр не указан, темп выбирается по длине текста: до 90 символов - 1,05, от 90 символов - 1,2. Для коротких фраз явный темп выше 1,25 ограничивается значением 1,25 (на высокой скорости у коротких реплик смазывается конец).
Частота (sample_rate)
Модель синтеза считает звук на частоте, заданной в настройках сервера («Настройки» → «Синтез» → «Частота»: 8000, 24000 или 48000 Гц). Параметр sample_rate задаёт частоту ответа: если она отличается от частоты модели, звук пересэмплируется. Для телефонии достаточно 8000, для записи и прослушивания лучше 48000.
Важно: если сервер настроен на 8000 Гц (типичная настройка для телефонии), ответ с sample_rate=48000 будет растянутым с 8 кГц - чище он не станет. Качество определяется настройкой сервера, а не параметром запроса.
Формат ответа (format)
Без параметра ответ - сырой PCM16 little-endian, моно, тип содержимого audio/L16;rate=<частота>;channels=1. С параметром format=wav тот же звук приходит в контейнере RIFF/WAVE, тип audio/wav - такой ответ открывается любым плеером.
В потоковом режиме (stream=1) вместе с format=wav первый кадр несёт WAV-заголовок с длиной 0xFFFFFFFF (размер заранее неизвестен): при сохранении файла длину нужно поправить или писать поток как есть и не проверять заголовок.
Кэш и параметр rw
Сервер кэширует готовый звук по ключу «текст + голос + темп + частота». Повторная фраза (типовой скрипт обзвона) отдаётся из кэша почти мгновенно и не занимает процессор. Параметр rw=on синтезирует фразу заново и обновляет запись в кэше - используется, когда текст мог измениться или нужно прогреть кэш перед нагрузкой.
Служебные запросы
| Запрос | Ответ |
|---|---|
GET /?voices |
JSON-массив подписей голосов выбранного языка, Cache-Control: no-store
|
GET /health |
{"status":"ok","name":"COSpeech","version":"1.03"}
|
GET /?health=1 |
ok <мс> - проверка живости настоящим синтезом короткой фразы в обход кэша
|
Результат
- Успех: аудио в теле ответа. Синхронный режим - весь текст одним куском,
stream=1- отдельными кадрами по мере синтеза (по кадру на предложение). - Заголовки:
audio/L16;rate=8000;channels=1для PCM16 илиaudio/wavдля WAV. Длина ответа в синхронном режиме известна, в потоковом - нет (chunked).
Ошибки
| Код | Текст | Когда |
|---|---|---|
| 301 | (редирект на /) |
GET без текста: не передан speak и text
|
| 400 | empty text |
после нормализации не осталось текста (пробелы, только знаки) |
| 400 | rate должен быть одним из ('x-slow', 'slow', 'medium', 'fast', 'x-fast') |
неизвестное значение rate
|
| 404 | not found |
запрос на неизвестный путь |
| 500 | ошибка синтеза |
внутренняя ошибка, подробности в журнале сервера |
| 503 | queue is full |
очередь переполнена: занято больше, чем «потоков + 2 × потоков» |
| 503 | тестовый период истёк 31.12.2026 - нужна новая версия COSpeech (www.calloffice.ru) |
закончился срок тестовой сборки |
Тело ошибки - обычный текст в кодировке UTF-8. Клиенту стоит трактовать любой ответ, кроме 200, как «сервис недоступен» и уходить на резервный адрес.
Описание
Сервер принимает текст, приводит его к виду, пригодному для произнесения, и возвращает звук:
- нормализация - числа, суммы, даты, время, адреса, единицы измерения читаются словами («05.09» → «пятого сентября», «18:30» → «восемнадцати часов тридцати минут», «12 500 рублей» → «двенадцать тысяч пятьсот рублей»);
- раскрытие сокращений (
abr) и словарь замен; - расстановка ударений - служебные слова (предлоги, союзы, местоимения) читаются без ударения, словарные формы - по словарю;
- синтез моделью и, при необходимости, пересэмплирование под запрошенную частоту.
SSML-теги вырезаются из текста и на произношение не влияют; исключение - <prosody rate="...">: его темп применяется, если параметр rate не задан. Параметры облачных сервисов (Service, Emotion, Volume, Pitch) в COSpeech не действуют - попытка их передать будет просто проигнорирована.
Производительность: один поток синтеза в реальном времени занимает примерно 2,5-3 ядра процессора; число одновременных потоков задаётся в настройках (1-16, значение 0 в файле настроек - без ограничения). Запросы сверх «потоки + 2 × потоки» получают 503.
Примеры
curl (Windows 10/11, встроенный curl.exe):
:: синтез в WAV-файл curl.exe -s -o hello.wav "http://127.0.0.1:6002/?speak=Здравствуйте&voice=Зинаида&sample_rate=8000&format=wav" :: сырой PCM16 в файл (8 кГц, моно) curl.exe -s -o hello.pcm "http://127.0.0.1:6002/?speak=Проверка&sample_rate=8000"
JavaScript (XMLHttpRequest; подходит для HTA и страниц Call Office):
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://127.0.0.1:6002/?speak=" + encodeURIComponent("Здравствуйте, это программа Call Office") +
"&voice=Зинаида&rate=slow&sample_rate=8000&format=wav", true);
xhr.responseType = "arraybuffer"; // в старых IE/HTA - xhr.responseBody
xhr.onload = function () {
if (xhr.status === 200) {
var blob = new Blob([xhr.response], { type: xhr.getResponseHeader("Content-Type") });
new Audio(URL.createObjectURL(blob)).play();
} else {
// 400/503 - текст ошибки в xhr.responseText
}
};
xhr.send();
C# (HttpClient):
using var http = new HttpClient { Timeout = TimeSpan.FromMinutes(2) };
string url = "http://127.0.0.1:6002/?speak=" + Uri.EscapeDataString("Здравствуйте!") +
"&voice=Зинаида&sample_rate=8000&format=wav";
byte[] wav = await http.GetByteArrayAsync(url);
await File.WriteAllBytesAsync("hello.wav", wav);
POST с JSON (длинные тексты не упираются в длину URL):
POST http://127.0.0.1:6002/
Content-Type: application/json; charset=utf-8
{"text":"Здравствуйте! Это городская служба водоснабжения.","voice":"Зинаида","rate":"slow","sample_rate":"8000","format":"wav"}
Результат
- Объект Sound, содержащий синтезированное сообщение.
Описание
- Метод выполняет синтез текста в голосовое сообщения используя технологию Text To Speech (TTS). Голосовая машина используемая для синтеза определяется свойством TTSEngine.
Примеры
- Пример с использованием Yandex на JavaScript
var Device = new ActiveXObject ("CallOffice.Device");
var NumberPhone = prompt ("Введите номер телефона",'');
Device.Open ();
var Sound = Device.TextToSound ("Привет, это программа CallOffice", "Service=Yandex; lang=ru-RU; speed=1; voice=zahar; emotion=neutral;"); // Синтезируем голос
var Result = Device.Dial (NumberPhone, 40);
if (Result == 0) {
Device.Say (Sound); // Произносим синтезированное сообщение
}
Device.HangUp ();
Device.Close ();- Пример на JavaScript
var Device = new ActiveXObject ("CallOffice.Device");
var NumberPhone = prompt ("Введите номер телефона",'');
Device.Open ();
Device.TTSEngine = "Microsoft Anna - English (United States)"; // Устанавливаем голосовую машину
var Sound = Device.TextToSound ("Hello, this is the program CallOffice!"); // Синтезируем сообщение
var Result = Device.Dial (NumberPhone, 40);
if (Result == 0) {
Device.Say (Sound); // Произносим синтезированное сообщение
}
Device.HangUp ();
Device.Close ();- Пример с использованием Yandex на VBScript
Dim Device
Dim Sound
Set Device = CreateObject ("CallOffice.Device")
NumberPhone = prompt ("Введите номер телефона","")
Device.Open
Set Sound = Device.TextToSound ("Привет, это программа CallOffice", "Service=Yandex; lang=ru-RU; speed=1; voice=zahar; emotion=neutral;"); // Синтезируем голос
Result = Device.Dial (NumberPhone, 40)
if Result = 1 then
Device.Say Sound ' Произносим синтезированное сообщение
end if
Device.HangUp
Device.Close- Пример на VBScript
Dim Device
Dim Sound
Set Device = CreateObject ("CallOffice.Device")
NumberPhone = prompt ("Введите номер телефона","")
Device.Open
Device.TTSEngine = "Microsoft Anna - English (United States)" ' Устанавливаем голосовую машину
Set Sound = Device.TextToSound ("Hello, this is the program CallOffice!") ' Синтезируем сообщение
Result = Device.Dial (NumberPhone, 40)
if Result = 1 then
Device.Say Sound ' Произносим синтезированное сообщение
end if
Device.HangUp
Device.Close