Часть 1: Что я хотел видеть дома в 2021
"Я создавал не просто дипломную работу. Я создавал задумку для будущего, которое наступит, когда понадобятся подобные технологии."
Дорогие читатели!
Перед вами первая из 7 статей о моём дипломном проекте «Голосовое управление Умным домом», который я защищал в 2021 году.
Этот проект стал для меня не просто работой для получения диплома, а настоящей возможностью погрузиться в мир науки и технологий. Стать самому тем, кто творит будущее, создавая технологии, и развивая то, что будет создавать будущее.
📋 Содержание серии из 7 частей
Часть | Тема | Краткое содержание |
|---|---|---|
1 | Что я хотел видеть дома в 2021 | Концепция проекта, видение «Дом который тебя понимает», цели и задачи |
2 | Как я проектировал опыт пользователя | Проектирование пользовательского интерфейса, разделение полномочий, контекстное понимание |
3 | Архитектура нейросети | Многослойная обработка звуковых данных, выбор архитектуры, технические детали |
4 | Обучение и валидация модели | Сбор данных, извлечение признаков, процесс обучения, результаты |
5 | Интеграция с устройствами «Умного дома» | Протоколы связи, сценарии управления, адаптивность к новым устройствам |
6 | Система безопасности и приватности | Защита личных данных, механизмы приватности, контроль доступа |
7 | Расширенные возможности и перспективы | Наблюдение за здоровьем, безопасность детей, прогнозирование потребностей |
🎯 Глава 1: От идеи к диплому
Контекст создания проекта
В 2021 году я защищал дипломный проект, получая второе высшее образование по специальности Data Science и нейронные сети. До этого у меня уже был солидный багаж:
5 лет системного администрирования — понимание инфраструктуры и ограничений
Стратегический маркетинг — понимание пользователя и вовлечения
Руководство отделом продаж — управление командой и процессами
Этот бэкграунд сформировал моё видение: я создаю продукты, которые будут удобны людям, и чтобы люди могли настраивать вариативность этих продуктов для себя.
Философия проекта: «Дом который тебя понимает»
В презентации к диплому я написал:
"Вы просто подаёте голосовую команду на выполнение действия, система определяет её и исполняет. Без дополнительных приспособлений для подачи команд."
Это было ключевым принципом — создать систему, которая понимает, а не просто слышит. Не нужно говорить «Алиса, включи свет» или «Окей, Гугл, открой дверь». Просто скажите «включи свет» в разговоре, и система поймёт, что это команда.
Почему именно голосовое управление?
На тот момент (2021) существовали системы голосового управления, но они требовали:
Специальных триггерных слов («Алиса», «Окей, Гугл»)
Чёткого произношения
Отсутствия фонового шума
Отдельных устройств (колонок, смартфонов)
Я хотел создать систему, которая:
✅ Работает в обычном диалоге — команды распознаются среди обычной речи
✅ Не требует дополнительных устройств — работает на обычном компьютере или сервере
✅ Адаптируется под пользователя — учитывает возраст, пол, особенности речи
✅ Понимает контекст — знает, кто говорит и в какой ситуации
Понимание сложности интеграции
Я понимал, что технологии, которые я запланировал, требуют много работы и много навыков в различных отраслях. Это не просто нейросеть, которая распознаёт команды — это целая экосистема взаимодействующих систем.
"Чтобы управление от устройства понимания, в котором расположены веса модели и алгоритм отправки команды, имело механическое действие — необходимо согласование этих механизмов."
Примеры интеграции:
GSM-звонок и шлагбаум:
Система распознаёт голосовую команду «Открой ворота»
Проверяется авторизация пользователя
Если пользователь имеет право — система инициирует GSM-звонок оператору
Оператор получает команду и включает механизм открывания шлагбаума
Шлагбаум открывается
Детекция госномера:
Камера фиксирует автомобиль на подъезде
Система детектирует госномер на номерном знаке
Распознаёт цифры и буквы госномера
Проверяет номер по базе данных на наличие полномочий
Если номер авторизован — открывает ворота
Почему это важно для архитектуры?
Понимание этой сложности помогло мне спроектировать модульную архитектуру, где:
Каждый компонент отвечает за свою задачу
Компоненты могут работа��ь независимо друг от друга
Можно легко добавлять новые функции без переписывания всей системы
Система масштабируется по мере добавления новых устройств
Это и есть микросервисный подход, который я интуитивно применял ещё в 2021 году, хотя тогда это ещё не было таким распространённым в ИИ-проектах.
🏠 Глава 2: Что я хотел видеть дома?
Сценарии использования
Сценарий 1: Управление освещением
Тогда (2021) | Сейчас (2026) |
|---|---|
Пользователь говорит в разговоре: «Здесь темновато» | Это стало стандартом в умных домах |
Система распознаёт это как команду на увеличение яркости | Но многие системы всё ещё требуют триггерных слов |
Освещение автоматически регулируется |
Сценарий 2: Управление дверью
Тогда (2021) | Сейчас (2026) |
|---|---|
Пользователь говорит: «Открой дверь» | Умные замки стали популярными |
Система проверяет права доступа | Но интеграция с голосовыми системами всё ещё не идеальна |
Если пользователь имеет право — дверь открывается |
Сценарий 3: Управление камерой наблюдения
Тогда (2021) | Сейчас (2026) |
|---|---|
Пользователь говорит: «Покажи, что происходит на кухне» | Умные камеры с голосовым упра��лением существуют |
Система включает камеру и показывает изображение на экране | Но интеграция с другими системами дома часто сложна |
📊 Глава 3: Технические характеристики проекта
Обучающая база
Параметр | Значение |
|---|---|
Объём базы | 620 звуковых файлов (изначально), 273 файла в финальной версии |
Классы команд | 4 класса: «Комната», «Дверь», «Камера», «Фон» |
Архитектура | Multi-input CNN (3 входа) |
Параметры модели | ~50,480 параметров |
Точность (train) | ~99.66% |
Точность (val) | ~94.55% |
Инструменты | Python, TensorFlow/Keras, Librosa, Google Colab |
Извлечение признаков
Для получения большего количества параметров я выхватывал из данных среднее, минимальное и максимальное значения из 7 групп признаков:
Chroma STFT — Частота цветности
RMSE — Среднеквадратичные колебания
Zero Crossing Rate — Пересечения нуля
Spectral Centroid — Центр масс звука
Spectral Bandwidth — Ширина полосы частот
Spectral Rolloff — Спектральный спад частоты
MFCC — Значимые для обработки частоты
def get_featur_mean(y, sr): # Получаем различные параметры аудио которые в сумме дадут уникальный набор признаков chst1 = np.mean(librosa.feature.chroma_stft(y=y, sr=sr)) chst2 = np.max(librosa.feature.chroma_stft(y=y, sr=sr)) chst3 = np.min(librosa.feature.chroma_stft(y=y, sr=sr)) rmse1 = np.mean(librosa.feature.rms(y=y)) rmse2 = np.max(librosa.feature.rms(y=y)) rmse3 = np.min(librosa.feature.rms(y=y)) # ... и так далее для всех 7 групп признаков return ssr, crz, mfc
Визуализация данных
Это позволяет наглядно понять что имеем от каждого файла, в каком объёме и диапазоне. По результатам принимаем решение как можем использовать эти данные для достижения результата.
🧠 Глава 4: Архитектура нейросети
Математическое отображение модели
┌─────────────────────────────────────────────────────────────────┐ │ АРХИТЕКТУРА NEURAL NETWORK v4.6 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ВХОД 1: SSR (9 признаков) ВХОД 2: CHZ (9 признаков) │ │ Conv1D → BatchNorm → Dropout Conv1D → BatchNorm → Dropout │ │ Conv1D → Flatten → Dense Conv1D → Flatten → Dense │ │ │ │ ВХОД 3: MFC (3 признака) Dense → Dense (вторая группа)│ │ Conv1D → BatchNorm → Dropout │ │ Conv1D → Flatten → Dense │ │ │ │ CONCATENATE [x1, x3, x4] → Dense → BatchNorm → Dropout │ │ Dense → CONCATENATE [x, x4] │ │ Dense (len(labels), activation='softmax') │ │ │ │ Всего параметров: 50,480 │ │ Обучаемых параметров: 50,200 │ │ Не обучаемых параметров: 280 │ │ │ └─────────────────────────────────────────────────────────────────┘
Сборка модели
model = Sequential() input1 = Input(xTrainSSR.shape[1:]) # Входные данные, это первое число размерности оцифрованых данных input2 = Input(xTrainCHZ.shape[1:]) input3 = Input(xTrainMFC.shape[1:]) # На первую группу подаём тренировочные данные x1 = Conv1D(4, 2, activation="tanh")(input1) x1 = BatchNormalization()(x1) # Нормализация данных для исключения резких разниц в расчётах x1 = Dropout(0.2)(x1) # Во избежании "заучивания" произвольное отключение нейронов x1 = Conv1D(8, 2, activation="tanh")(x1) # Одномерный свёрточный слой x1 = Flatten()(x1) # Функция - перевод данных в вектор x1 = Dense(64, activation='tanh')(x1) # На вторую группу подаём тренировочные данные x2 = Conv1D(4, 2, activation="linear")(input2) x2 = BatchNormalization()(x2) x2 = Dropout(0.2)(x2) x2 = Conv1D(8, 2, activation="linear")(x2) x2 = Flatten()(x2) x2 = Dense(64, activation='linear')(x2) # На третью группу подаём тренировочные данные x3 = Conv1D(4, 2, activation="relu")(input3) x3 = BatchNormalization()(x3) x3 = Dropout(0.2)(x3) x3 = Conv1D(8, 2, activation="relu")(x3) x3 = Flatten()(x3) x3 = Dense(64, activation='relu')(x3) # Здесь данные из второй группы обрабатываем полносвязным слоем Dense на 64 нейрона x4 = Dense(64, activation='tanh')(x2) x4 = Dense(64, activation='tanh')(x4) # Обрабатываем меньшим количеством нейронов # Соединяем данные из групп 1, 3, 4 в группу x x = concatenate([x1, x3, x4]) x = Flatten()(x) x = Dense(128, activation='elu')(x) x = BatchNormalization()(x) x = Dropout(0.3)(x) x = Dense(128, activation='elu')(x) x = concatenate([x, x4]) # На выходе нейронов равное количеству групп len(labels) x = Dense(len(labels), activation='softmax')(x) model = Model([input1, input2, input3], x) model.compile(optimizer=Adam(1e-4), loss='categorical_crossentropy', metrics=['accuracy'])
📈 Глава 5: Обучение модели
Процесс обучения (250 эпох)
Epoch 1/250 22/22 [==============================] - 3s 33ms/step - loss: 1.8197 - accuracy: 0.2110 - val_loss: 1.2615 - val_accuracy: 0.9455 ... Epoch 247/250 22/22 [==============================] - 0s 16ms/step - loss: 0.1618 - accuracy: 0.9404 - val_loss: 0.9144 - val_accuracy: 0.9455
Результаты обучения
Параметр | Значение |
|---|---|
Точность обучения | ~94.04% |
Точность валидации | ~94.55% |
Эпох обучения | 250 |
Размер батча | 10 |
Оптимизатор | Adam (lr=1e-4) |
Функция потерь | categorical_crossentropy |
Сохранение модели
# Сохраняем модель model.save_weights(WAY_NP+'Model_weight.h5') model.save(WAY_NP+'Model_Input3_v4.h5') # Загружаем модель # model.load_weights(WAY_NP+'Model_Input3_v4.h5')
💡 Глава 6: Моя философия проектирования
Интеллектуальное управление
"Не просто 'включи свет', а 'сделай уютно'. Система должна понимать намерение, а не только команду."
Моя философия:
"Значит система хранит в себе паттерны каждого человека, понимая его, как личный помощник с разными ролями. И просьба 'сделай уютно' — воспринимается так, что человеку, сказавшему это словосочетание, делает приглушенный свет, легкую музыку, нагрев пола и вода в ванной."
Это и есть то, что я называю объектно-ориентированным программированием в продуктах — каждый модуль можно оптимизировать и улучшать независимо друг от друга.
Микросервисная архитектура
Я не исключительно на ООП опираюсь при создании проекта. Мне больше нравится микросервисная архитектура. Также я интуитивно делаю всё по Agile.
Благодаря применению микросервисной архитектуры я могу использовать разные нейросети для одного проекта и разные проекты для одних нейросетей. Тем самым хорошо экономя на вычислительных ресурсах.
То есть я понимаю, что можно мониторить систему и видеть, что нагрузка у нас на нейросеть, которая занимается компьютерным зрением, в большей степени происходит с 10:00 до 22:00 по московскому времени. При этом есть задача компьютерного зрения схожая, которая не требует срочной обработки, поэтому мы откладываем на потом. И во время того, как освобождаются вычислительные мощности, происходит передача по стеку накопленных данных для обработки того, что необходимо обработать не в срочном порядке.
🎯 Глава 7: Уроки и выводы
Что получилось
✅ Multi-input архитектура для обработки разных типов признаков
✅ Модульная система, позволяющая легко добавлять новые команды
✅ Точность валидации ~94.55% на небольшом датасете
✅ Возможность масштабирования архитектуры
Что можно улучшить (2026 perspective)
Использовать предобученные модели — Wav2Vec 2.0, HuBERT или RuBERT вместо обучения с нуля
Применить трансформеры — для лучшего понимания контекста
Data Augmentation — шум, питч, скорость для увеличения датасета
Квантование — для deployment на edge-устройства
Микросервисная архитектура — для масштабируемости и оптимизации ресурсов
Мониторинг и планирование — для оптимизации вычислительных мощностей
🔜 Что будет в следующей части?
Часть 2: Как я проектировал опыт пользователя
Темы следующей статьи:
📋 Проектирование пользовательских сценариев
🔐 Разделение полномочий (дети/взрослые)
🧠 Контекстное понимание команд
🔒 Безопасность и приватность данных
📚 Источники и ресурсы
Исходные материалы проекта
Файл | Описание | Ссылка |
|---|---|---|
Презентация | Презентация дипломного проекта | |
Jupyter Notebook | Код модели и обучение | |
GitHub | Репозиторий проекта |
Библиотеки и инструменты
# Основные библиотеки для работы с аудио import librosa # Обработка аудио import librosa.display # Визуализация аудио import numpy as np # Математические операции import matplotlib.pyplot as plt # Визуализация # Библиотеки для нейросетей import tensorflow as tf # Фреймворк для глубокого обучения from tensorflow.keras import layers, models # Слои и модели from tensorflow.keras.optimizers import Adam # Оптимизатор # Утилиты from sklearn.preprocessing import StandardScaler # Нормализация from sklearn.model_selection import train_test_split # Разделение данных
