|
document.addEventListener("DOMContentLoaded", () => {
|
|
|
|
let mediaRecorder;
|
|
let audioChunks = [];
|
|
let audioStream;
|
|
|
|
|
|
const recordBtn = document.getElementById("record-btn");
|
|
const stopBtn = document.getElementById("stop-btn");
|
|
const sendBtn = document.getElementById("send-btn");
|
|
const uploadBtn = document.getElementById("upload-btn");
|
|
const userInput = document.getElementById("user-input");
|
|
const chatBox = document.getElementById("chat-box");
|
|
const audioFileInput = document.getElementById("audio-file");
|
|
|
|
|
|
sendBtn.addEventListener("click", async () => {
|
|
const text = userInput.value.trim();
|
|
if (!text) return;
|
|
|
|
appendMessage("user", text);
|
|
userInput.value = "";
|
|
|
|
try {
|
|
const response = await fetch("/analyze", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ text })
|
|
});
|
|
|
|
if (!response.ok) throw new Error("Ошибка сервера");
|
|
|
|
const data = await response.json();
|
|
appendMessage("bot", `Эмоция: ${data.emotion} (${(data.confidence * 100).toFixed(1)}%)`);
|
|
} catch (error) {
|
|
console.error("Ошибка:", error);
|
|
appendMessage("bot", `❌ Ошибка: ${error.message}`);
|
|
}
|
|
});
|
|
|
|
|
|
uploadBtn.addEventListener("click", async () => {
|
|
const file = audioFileInput.files[0];
|
|
if (!file) return;
|
|
|
|
appendMessage("user", "Загружен аудиофайл...");
|
|
|
|
try {
|
|
const formData = new FormData();
|
|
formData.append("audio", file);
|
|
|
|
const response = await fetch("/analyze_audio", {
|
|
method: "POST",
|
|
body: formData
|
|
});
|
|
|
|
if (!response.ok) throw new Error("Ошибка сервера");
|
|
|
|
const data = await response.json();
|
|
appendMessage("bot", `Эмоция: ${data.emotion} (${(data.confidence * 100).toFixed(1)}%)`);
|
|
} catch (error) {
|
|
console.error("Ошибка:", error);
|
|
appendMessage("bot", `❌ Ошибка: ${error.message}`);
|
|
}
|
|
});
|
|
|
|
|
|
recordBtn.addEventListener("click", async () => {
|
|
try {
|
|
|
|
audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
|
|
|
|
mediaRecorder = new MediaRecorder(audioStream);
|
|
audioChunks = [];
|
|
|
|
|
|
mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);
|
|
|
|
mediaRecorder.onstop = async () => {
|
|
try {
|
|
const audioBlob = new Blob(audioChunks, { type: "audio/wav" });
|
|
appendMessage("user", "Отправлено голосовое сообщение...");
|
|
|
|
const formData = new FormData();
|
|
formData.append("audio", audioBlob, "recording.wav");
|
|
|
|
const response = await fetch("/analyze_audio", {
|
|
method: "POST",
|
|
body: formData
|
|
});
|
|
|
|
if (!response.ok) throw new Error("Ошибка сервера");
|
|
|
|
const data = await response.json();
|
|
appendMessage("bot", `Эмоция: ${data.emotion} (${(data.confidence * 100).toFixed(1)}%)`);
|
|
} catch (error) {
|
|
console.error("Ошибка:", error);
|
|
appendMessage("bot", `❌ Ошибка: ${error.message}`);
|
|
} finally {
|
|
|
|
audioStream.getTracks().forEach(track => track.stop());
|
|
}
|
|
};
|
|
|
|
mediaRecorder.start();
|
|
recordBtn.disabled = true;
|
|
stopBtn.disabled = false;
|
|
|
|
} catch (error) {
|
|
console.error("Ошибка записи:", error);
|
|
appendMessage("bot", "❌ Не удалось получить доступ к микрофону");
|
|
}
|
|
});
|
|
|
|
|
|
stopBtn.addEventListener("click", () => {
|
|
if (mediaRecorder && mediaRecorder.state === "recording") {
|
|
mediaRecorder.stop();
|
|
recordBtn.disabled = false;
|
|
stopBtn.disabled = true;
|
|
}
|
|
});
|
|
|
|
|
|
function appendMessage(sender, text) {
|
|
const message = document.createElement("div");
|
|
message.classList.add("message", sender === "user" ? "user-message" : "bot-message");
|
|
message.innerHTML = text;
|
|
chatBox.appendChild(message);
|
|
chatBox.scrollTop = chatBox.scrollHeight;
|
|
}
|
|
}); |