18 KiB
Техническое задание на разработку фронтенда My Speaker
1. Общая информация и структура проекта
webapp/ ├── index.html # Основная страница приложения (SPA) ├── style.css # Основные стили в ретро-стилистике ├── api.js # Модуль для работы с API (уже существует) ├── app.js # Точка входа: инициализация приложения и маршрутизация ├── modules/ # Папка для модулей приложения │ ├── router.js # Модуль маршрутизации (загрузка страниц) │ ├── login.js # Логика для страницы авторизации │ ├── dashboard.js # Логика для панели мониторинга │ ├── settings.js # Логика для страницы настроек │ ├── commands.js # Логика для страницы команд (зарезервировано на будущее) │ ├── header.js # Логика для верхней панели (имя пользователя, выход) │ ├── nav.js # Логика для навигационной панели │ └── utils.js # Общие утилиты (например, обработка ошибок, форматирование) ├── pages/ # Папка для HTML-страниц │ ├── dashboard.html # Разметка для панели мониторинга │ ├── settings.html # Разметка для настроек │ ├── commands.html # Разметка для команд │ └── login.html # Разметка для авторизации └── components/ # Папка для общих компонентов ├── header.html # Разметка верхней панели └── nav.html # Разметка навигационной панели
1.1. Цель проекта
Разработка веб-интерфейса для системы распознавания речи My Speaker, позволяющего управлять настройками системы, отслеживать состояние распознавания речи и просматривать историю распознанных фраз.
1.2. Технологический стек
- HTML5
- CSS3
- JavaScript (ES6+)
- графики chart.js
- Без использования фреймворков (чистый JavaScript)
2. Функциональные требования
2.1. Авторизация
- Кнопка "шестеренка" для настройки основного цвета интерфейса (по умолчанию #0f0) и поле для ввода адреса бекенда (по умолчанию http://localhost:8000)
- Форма входа с полями для ввода логина и пароля
- Сохранение токена авторизации в localStorage
- Автоматический выход при истечении срока действия токена
- Кнопка выхода из системы, которая удаляет токен из localStorage
2.2. Панель мониторинга (Dashboard) не обновляется пока нет авторизации
- Отображение текущего состояния системы распознавания речи
- Визуализация уровня речи и энергии звука в реальном времени
- Два ползунка громкости для микрофона и колонок (набудущее)
- График изменения вероятности речи ("speech_prob" и "speech_threshold") и энергии звука ("energy" и "energy_threshold")
- Данные обновляются с частотой из настроек системы (polling_interval_ms)
- Отображение системной информации (загрузка CPU, память, температура)
- Список последних распознанных фраз с выделением команд
- Индикация состояния системы (прослушивание, запись, обработка)
2.3. Настройки системы
- Формы должны быть свернуты и при развертывании новой, старая сворачивается.
- Формы должны быть заполнены согласно описанию config.yaml.md (использоватся выпадающие списки для выбора определенных значений, кнопки больше и меньше должны иметь нужный шаг)
- Кнопка сохранения для каждой формы, которая сохраняет введенные пользователем данные на сервер.
- Форма для настройки параметров VAD (Voice Activity Detection)
- Форма для настройки системных параметров
- Форма для настройки параметров STT (Speech-to-Text)
- Форма для настройки параметров команд
- Форма для изменения учетных данных
- Кнопка для перезапуска VAD и STT
3. Требования к интерфейсу
3.1. Общие требования
- Адаптивный дизайн (поддержка мобильных устройств)
- Максимальное использование пространства экрана без прокрутки как по вертикали, так и по горизонтали (в десктоп версии)
- Темная цветовая схема в стиле ретро-игр (8-bit)
- Использование шрифта "Press Start 2P" для создания пиксельной эстетики
- Зеленая цветовая гамма на темном фоне (основной цвет текста #0f0)
- Пиксельные элементы интерфейса (кнопки, индикаторы, рамки)
- Интуитивно понятный интерфейс с игровой стилистикой
3.2. Структура интерфейса
- Экран авторизации в стиле игрового меню
- Основной экран с двумя основными панелями (информационная и контентная)
- Верхняя панель с именем пользователя и кнопкой выхода
- Навигационная панель для переключения между разделами (графики/настройки/команды)
- Пиксельные рамки вокруг всех блоков и элементов интерфейса
3.3. Разделы интерфейса
-
Авторизация
- Форма входа в стиле игрового меню с пиксельной рамкой
- Поля для ввода логина (PLAYER NAME) и пароля (SECRET CODE)
- Кнопка "START" в пиксельном стиле
- Сообщение об ошибке в красном цвете
- Подсказка с дефолтными учетными данными
-
Панель мониторинга
- Информационная панель с основными параметрами (MAIN PARAMETERS)
- Индикатор состояния системы с цветовой индикацией
- Метрики с процентом речи и уровнем энергии с визуальными индикаторами
- Системная статистика (CPU, MEM, TEMP) с графическими индикаторами
- Игровая статистика (UPTIME, VAD, STT, AVG)
- Окно лога с последними распознанными фразами
- Графики активности речи и энергии звука
-
Настройки
- Кнопка "REBOOT" для перезапуска системы
- Раскрывающиеся группы настроек (details/summary)
- Формы с полями ввода для каждого параметра в стиле ретро-игры
- Выпадающие списки и числовые поля с пиксельными рамками
4. Взаимодействие с API
4.1. Авторизация
POST /api/auth/login- авторизация пользователяGET /api/auth/me- получение информации о текущем пользователеPOST /api/auth/logout- выход из системы
4.2. Панель мониторинга
GET /api/dashboard/speech-data- получение данных о речиGET /api/dashboard/sys-monitor- получение данных о нагрузке системыGET /api/dashboard/recent-phrases- получение последних распознанных фразGET /api/dashboard/stats- получение статистики работы системы
4.3. Настройки
GET /api/settings- получение всех настроекPUT /api/settings/vad- обновление настроек VADPUT /api/settings/system- обновление системных настроекPUT /api/settings/stt- обновление настроек STTPUT /api/settings/commands- обновление настроек командPUT /api/settings/auth- обновление настроек авторизацииPOST /api/settings/restart- перезапуск VAD и STT
5. Описание ключевых параметров настройки
5.1. Параметры VAD (Voice Activity Detection)
| Параметр | Описание | Тип элемента управления |
|---|---|---|
| mode | Режим работы VAD (агрессивность фильтрации) от 0 до 3 | Выпадающий список |
| speech_threshold | Порог вероятности речи (0.0 - 1.0) | Ползунок |
| energy_threshold | Порог энергии звука | Числовое поле |
| min_speech_duration_ms | Минимальная длительность речи в мс | Числовое поле |
| record_stop_delay_sec | Задержка остановки записи после окончания речи в сек | Числовое поле |
| adaptive_energy | Использовать ли адаптивный порог энергии | Переключатель |
| noise_reduction_enabled | Включить подавление шума | Переключатель |
| auto_gain_enabled | Включить автоматическую регулировку усиления | Переключатель |
5.2. Системные параметры
| Параметр | Описание | Тип элемента управления |
|---|---|---|
| history_maxlen | Максимальное количество записей в истории распознавания | Числовое поле |
| polling_interval_ms | Интервал опроса состояния системы в миллисекундах | Числовое поле |
| logging_level | Уровень логирования | Выпадающий список |
| log_save_file | Сохранять ли логи в файл | Переключатель |
6. Требования к реализации
6.1. Структура проекта
webapp/
├── index.html # Единая страница приложения (SPA)
├── style.css # Основные стили в ретро-стилистике
├── api.js # Модуль для работы с API
└── app.js # Основной модуль приложения с логикой
6.2. Требования к коду
- Модульная структура JavaScript-кода
- Использование современных возможностей JavaScript (ES6+)
- Комментирование кода
- Обработка ошибок и исключений
- Валидация вводимых данных на стороне клиента
6.3. Требования к производительности
- Быстрая загрузка страниц (оптимизация размера файлов)
- Эффективное обновление данных без перезагрузки страницы
- Оптимизация для работы на устройствах с ограниченными ресурсами
7. Примеры реализации ключевых компонентов
7.1. Авторизация
// Пример функции авторизации
async function login(username, password) {
try {
const response = await fetch("/api/auth/login", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username, password }),
});
if (!response.ok) {
throw new Error("Ошибка авторизации");
}
const data = await response.json();
localStorage.setItem("token", data.access_token);
window.location.href = "index.html";
} catch (error) {
showError(error.message);
}
}
7.2. Получение данных о речи
// Пример функции получения данных о речи
async function getSpeechData() {
try {
const token = localStorage.getItem("token");
if (!token) {
window.location.href = "login.html";
return;
}
const response = await fetch("/api/dashboard/speech-data", {
headers: {
Authorization: `Bearer ${token}`,
},
});
if (!response.ok) {
if (response.status === 401) {
localStorage.removeItem("token");
window.location.href = "login.html";
return;
}
throw new Error("Ошибка получения данных");
}
const data = await response.json();
updateSpeechDataUI(data);
} catch (error) {
showError(error.message);
}
}
// Обновление интерфейса с полученными данными
function updateSpeechDataUI(data) {
document.getElementById("speech-prob").textContent =
(data.speech_prob * 100).toFixed(1) + "%";
document.getElementById("energy-level").textContent = data.energy;
// Обновление индикаторов
const speechIndicator = document.getElementById("speech-indicator");
speechIndicator.style.width = data.speech_prob * 100 + "%";
speechIndicator.classList.toggle("active", data.speech_detected);
const energyIndicator = document.getElementById("energy-indicator");
const energyPercent = Math.min(
100,
(data.energy / data.energy_threshold) * 100
);
energyIndicator.style.width = energyPercent + "%";
// Добавление данных в график
addDataToChart(speechChart, data.speech_prob, data.energy);
}
7.3. Обновление настроек
// Пример функции обновления настроек VAD
async function updateVADSettings(settings) {
try {
const token = localStorage.getItem("token");
if (!token) {
window.location.href = "login.html";
return;
}
const response = await fetch("/api/settings/vad", {
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(settings),
});
if (!response.ok) {
if (response.status === 401) {
localStorage.removeItem("token");
window.location.href = "login.html";
return;
}
throw new Error("Ошибка обновления настроек");
}
const data = await response.json();
showSuccess("Настройки успешно обновлены");
return data;
} catch (error) {
showError(error.message);
return null;
}
}
8. Сроки и этапы разработки
8.1. Этапы разработки
- Разработка структуры и базовых компонентов (3 дня)
- Реализация авторизации (2 дня)
- Разработка панели мониторинга (5 дней)
- Разработка страницы настроек (4 дня)
- Тестирование и отладка (3 дня)
- Оптимизация и финальные доработки (2 дня)
8.2. Общий срок разработки
19 рабочих дней
9. Критерии приемки
- Корректная работа всех функциональных элементов
- Соответствие дизайна требованиям
- Корректное отображение на различных устройствах
- Отсутствие критических ошибок
- Соответствие требованиям производительности