Шаблоны обязательны для TTS
Голос живёт в шаблоне, а не в заказе. Как собрать config, чем отклониться от него на один заказ и почему один флаг решает больше, чем кажется.
Первое, обо что спотыкается интеграция озвучки: поля orders.voice_id не существует.
Голос, модель, формат вывода и тонкие настройки живут в шаблоне; в заказе остаётся текст.
Заказ TTS без template_id не создать — task_type: "tts" пройдёт валидацию и упадёт на
резолве сервиса.
Порядок из двух шагов
BASE=https://api.lumean.app/api/public
# 1. Шаблон: сервис, модель, голос, настройки — один раз
curl -s -X POST "$BASE/templates" -H "X-API-KEY: $KEY" -d '{
"service_key": "elevenlabs",
"name": "My TTS",
"config": {
"tts_settings": {
"mode": "mode_v1",
"model_id": "eleven_multilingual_v2",
"voice_id": "<VOICE_ID>",
"advanced_voice_settings": true,
"voice_settings": { "stability": 0.5, "similarity_boost": 0.75, "use_speaker_boost": true, "speed": 1.0 }
}
}
}'
# → data.id = <TEMPLATE_UUID>
# 2. Заказ: текст — в top-level input_text, НЕ в task_data
curl -s -X POST "$BASE/orders" -H "X-API-KEY: $KEY" -H "Content-Type: application/json" \
-d '{ "template_id": "<TEMPLATE_UUID>", "input_text": "Привет! Это тестовая озвучка." }'task_data — форма для заказов без шаблона (sfx, music, voice_search): там лежит промпт.
Штатные каналы текста TTS — input_text и .txt в input_files[], см.
Текст озвучки.
Ловушка
Пресет прав automation не включает templates.write — только templates.read. Сценарий
«создать шаблон → заказать TTS» на нём не проходится целиком: шаг 1 вернёт 403. Берите пресет
full или добавьте право вручную. См. Аутентификацию.
Шаблон принадлежит аккаунту, а не ключу
Шаблон, созданный в веб-кабинете, годится для API, и наоборот: владелец — аккаунт, а не ключ.
GET /templates по ключу видит те же шаблоны, что и кабинет. Чужой шаблон не откроется никаким
ключом — 403 с reason: "template_access_denied".
- Что произошло
- Доменный отказ создания заказа: HTTP 403, тело `{"success": false, "message": "…", "reason": "template_access_denied"}`. Заказ не создан.
- Что сделать прямо сейчас
- Проверить, что шаблон виден ключу. Владелец шаблона — аккаунт, а не конкретный ключ: шаблон, созданный в вебе, годится для API и наоборот, а вот чужой шаблон не откроется никаким ключом. Если шаблон свой — дело в правах: `automation` не включает `templates.write`, но `templates.read` в нём есть.
Что кладётся в config
Структуру config задаёт сервис из service_key, и угадывать её не нужно: справочник
конфигурации отдаёт по каждому полю type, default, nullable и, по типу, options либо
min/max/step.
Get Template Config Options
Ответ сгруппирован по секциям, но секция не всегда является путём в конфиге:
| Сервис | Показано в справочнике | Что принимают config / task_data |
|---|---|---|
elevenlabs, heygen, lumimg | tts_settings → model_id | {"tts_settings": {"model_id": …}} |
sfx, music, voice_search | sfx_settings → text | {"text": …} — обёртка отбрасывается |
Секция conditional_overrides описывает сужения по выбору: у не-v3 моделей ElevenLabs список
языков режется с 73 значений до 29, а на v3-семействе stability принимает только 0.0, 0.5
и 1.0. Значение вне схемы → 422 при создании шаблона.
Флаг, без которого три настройки молча не работают
similarity_boost, style и use_speaker_boost действуют только при
tts_settings.advanced_voice_settings: true. По умолчанию флаг false, и до движка озвучки
доезжают лишь stability и speed.
Осторожно
Ошибки не будет. Три параметра сохранятся в шаблоне и пройдут валидацию (exclude_when снимает
с них правила, а не значения), но на звук не повлияют: со стороны это выглядит как «настройка
не работает». Ставьте флаг в том же объекте tts_settings.
Разовое отклонение — config_override
config_override в POST /orders — единственный способ поменять параметры под конкретный заказ,
не создавая новый шаблон. Форма — тот же объект, что и config; применяется поверх
template.config только к этому заказу.
{
"template_id": "<TEMPLATE_UUID>",
"input_text": "Тот же текст, другой голос.",
"config_override": { "tts_settings": { "voice_id": "<OTHER_VOICE_ID>" } }
}Три правила, которые стоят отладочного вечера:
- Пути вне схемы сервиса отбрасываются молча — опечатка в ключе неотличима от «настройка не
применилась»: ни
422, ни предупреждения. - Явный
nullстирает, а не значит «оставить как есть»: мерж идётarray_replace_recursive. Сказать «не трогать» можно только отсутствием ключа. - Работает только вместе с
template_id— у template-lesssfx/musicпараметры и так вtask_data.
Правильно
Прислать только меняемые ключи: {"tts_settings": {"speed": 1.1}} — остальной конфиг шаблона
сохранится.
Неправильно
Прислать всю форму целиком с null в незаполненных полях: voice_id и language_code будут
стёрты для этого заказа.
Ключ generation_mode (абзацный режим) лежит не внутри tts_settings, а рядом, в корне:
{"generation_mode": "paragraph"}. В справочнике его нет — тот описывает настройки сервиса.
Режим влияет на цену: минимальный тарифицируемый объём считается по каждому абзацу.
Правка шаблона: config сливается, а не заменяется
Ловушка
Описание операции PUT/PATCH в OpenAPI утверждает, что «config заменяется целиком».
Это неверно: конфиг сливается с текущим вглубь. Прямо противоположное сказано в описании
тела того же запроса, и ему же соответствуют пример и ответ 200. Практическое следствие:
ключ, который вы не прислали, останется прежним — вернуть его к значению по умолчанию правкой
шаблона нельзя, только пересозданием.
Вторая ловушка того же запроса: service_key и config ходят парой. Одно без другого
валидация не принимает — даже когда сервис вы не меняете, код придётся продублировать. PUT и
PATCH ведут себя одинаково, а правка не затрагивает уже созданные заказы.
Update Template
Если заказ TTS не создаётся
| Симптом | Причина |
|---|---|
422, reason: "service_not_found" | Отправлен task_type: "tts" вместо template_id |
422 с полем в errors | Шаблон удалён (удаление необратимо) либо config не прошёл схему |
| Настройки применились не все | advanced_voice_settings: false или опечатка в config_override |
Create Order
Скормить страницу ИИ
Обновлено 04.09.2026 · спека 0.0.1