Большой текст (статью, главу, целую книгу) разбейте на части и озвучивайте по очереди. Чтобы интонация на стыках не «прыгала», передавайте соседние куски в 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-режим.