| 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;
|
| }
|
| }); |