File size: 5,411 Bytes
9b6a9d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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");

    // ===== 1. Отправка текста =====
    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}`);
        }
    });

    // ===== 2. Загрузка аудиофайла =====
    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}`);
        }
    });

    // ===== 3. Запись аудио =====
    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; // Используем innerHTML для поддержки эмодзи
        chatBox.appendChild(message);
        chatBox.scrollTop = chatBox.scrollHeight;
    }
});