import fs from "fs";
const EL_KEY = process.env.ELEVENLABS_API_KEY;
const EL_BASE = "https://api.elevenlabs.io/v1";
const MV = process.env.MAVERA_API_KEY;
const MV_BASE = "https://app.mavera.io/api/v1";
const MV_H = { Authorization: `Bearer ${MV}`, "Content-Type": "application/json" };
fs.mkdirSync("localized_audio", { recursive: true });
const LANGS = ["es", "fr", "de", "ja", "pt"];
const gen = await fetch(`${MV_BASE}/generations`, { method: "POST", headers: MV_H,
body: JSON.stringify({ prompt: "Write a 45-second marketing video script. Energetic. Hook, 3 benefits, CTA." }),
}).then(r => r.json());
const tts = await fetch(`${EL_BASE}/text-to-speech/21m00Tcm4TlvDq8ikWAM`, { method: "POST",
headers: { "xi-api-key": EL_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ text: gen.output || gen.content || "", model_id: "eleven_multilingual_v2",
voice_settings: { stability: 0.5, similarity_boost: 0.75 } }),
});
fs.writeFileSync("localized_audio/source_en.mp3", Buffer.from(await tts.arrayBuffer()));
await new Promise(r => setTimeout(r, 2000));
for (const lang of LANGS) {
const form = new FormData();
form.append("file", new Blob([fs.readFileSync("localized_audio/source_en.mp3")]), "source.mp3");
form.append("target_lang", lang); form.append("source_lang", "en");
form.append("num_speakers", "1"); form.append("watermark", "false");
const dub = await fetch(`${EL_BASE}/dubbing`, {
method: "POST", headers: { "xi-api-key": EL_KEY }, body: form,
}).then(r => r.json());
for (let i = 0; i < 60; i++) {
await new Promise(r => setTimeout(r, 5000));
const st = await fetch(`${EL_BASE}/dubbing/${dub.dubbing_id}`,
{ headers: { "xi-api-key": EL_KEY } }).then(r => r.json());
if (st.status === "dubbed") {
const audio = await fetch(`${EL_BASE}/dubbing/${dub.dubbing_id}/audio/${lang}`,
{ headers: { "xi-api-key": EL_KEY } });
fs.writeFileSync(`localized_audio/script_${lang}.mp3`, Buffer.from(await audio.arrayBuffer()));
console.log(`[${lang}] → script_${lang}.mp3`); break;
}
if (st.status === "failed") { console.log(`[${lang}] Failed`); break; }
}
await new Promise(r => setTimeout(r, 3000));
}