Большой текст (статью, главу, целую книгу) разбейте на части и озвучивайте по
очереди. Чтобы интонация на стыках не «прыгала», передавайте соседние куски в
previous_text и next_text. Модель использует их как контекст, но озвучивает
(и тарифицирует) только поле text.
async function synthesizeChunk(chunk, prev, next) {
const res = await fetch("https://tryaxolotl.ru/v1/speech", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AXOLOTL_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
text: chunk,
voice: "axolotl",
previous_text: prev, // хвост предыдущего куска
next_text: next, // начало следующего куска
}),
});
if (!res.ok) throw new Error(`Ошибка ${res.status}: ${await res.text()}`);
return Buffer.from(await res.arrayBuffer());
}
// `chunks` — массив строк, например разбитый по предложениям.
const parts = [];
for (let i = 0; i < chunks.length; i++) {
parts.push(
await synthesizeChunk(chunks[i], chunks[i - 1] ?? "", chunks[i + 1] ?? ""),
);
}
const fullAudio = Buffer.concat(parts); // склеиваем mp3-куски
Советы
- Режьте по границам предложений, а не посреди слова.
- Держите куски в районе 1–2 тысяч символов.
- В
previous_text / next_text достаточно пары соседних предложений.
previous_text и next_text не тарифицируются — в счёт идёт только text.
Этот приём работает с моделью flash. Для модели expressive поля
previous_text / next_text пока не поддерживаются — плавная сшивка появится
позже через WebSocket-режим.