Объект Device/Методы/TextToSound

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску

Синтаксис

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

Назад к методам объекта Device.