const chat = document.getElementById("chat");
const bg = document.getElementById("bg");
const messages = [
{ name: "Suren", side: "left", avatar: "https://i.pravatar.cc/30?img=5", voice: "Rachel", text: "Are you ready to launch?" },
{ name: "Elon", side: "right", avatar: "https://i.pravatar.cc/30?img=9", voice: "Adam", text: "Always ready. 3...2...1..." },
{ name: "Suren", side: "left", avatar: "https://i.pravatar.cc/30?img=5", voice: "Rachel", text: "We’re live on TikTok now!" }
];
const voiceMap = {
Rachel: "21m00Tcm4TlvDq8ikWAM",
Adam: "pNInz6obpgDQGcFmaJgB",
Bella: "EXAVITQu4vr4xnSDxMaL"
};
const apiKey = "sk_4e67c39c0e9cbc87462cd2643e1f4d1d9959d7d81203adc2";
function loadBackground(e) {
const file = e.target.files[0];
const url = URL.createObjectURL(file);
bg.src = url;
bg.play();
}
async function getVoiceBlob(text, voice) {
const voiceId = voiceMap[voice] || voiceMap.Rachel;
const res = await fetch("https://api.elevenlabs.io/v1/text-to-speech/" + voiceId, {
method: "POST",
headers: {
"Content-Type": "application/json",
"xi-api-key": apiKey
},
body: JSON.stringify({ text, model_id: "eleven_monolingual_v1", voice_settings: { stability: 0.4, similarity_boost: 0.75 } })
});
return await res.blob();
}
async function start() {
chat.innerHTML = "";
bg.currentTime = 0;
const stream = document.querySelector(".phone-frame").captureStream(30);
const recorder = new MediaRecorder(stream);
const chunks = [];
recorder.ondataavailable = e => chunks.push(e.data);
recorder.onstop = () => {
const blob = new Blob(chunks, { type: "video/webm" });
const a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = "chat_tiktok_ready.mp4";
a.click();
};
recorder.start();
bg.play();
for (const msg of messages) {
const typing = document.createElement("div");
typing.className = "typing";
typing.innerHTML = "";
chat.appendChild(typing);
chat.scrollTop = chat.scrollHeight;
await new Promise(r => setTimeout(r, 1200));
chat.removeChild(typing);
const wrap = document.createElement("div");
wrap.className = "message " + msg.side;
const avatar = document.createElement("img");
avatar.src = msg.avatar;
avatar.className = "avatar";
const bubble = document.createElement("div");
bubble.className = "bubble";
bubble.textContent = msg.text;
wrap.appendChild(avatar);
wrap.appendChild(bubble);
chat.appendChild(wrap);
chat.scrollTop = chat.scrollHeight;
const blob = await getVoiceBlob(msg.text, msg.voice);
const audio = new Audio(URL.createObjectURL(blob));
await new Promise(r => {
audio.onended = r;
audio.play();
});
}
recorder.stop();
}