- BrainTools - https://www.braintools.ru -
“Я создавал не просто дипломную работу. Я создавал задумку для будущего, которое наступит, когда понадобятся подобные технологии.”
Дорогие читатели!
Перед вами первая из 7 статей о моём дипломном проекте «Голосовое управление Умным домом», который я защищал в 2021 году.
Этот проект стал для меня не просто работой для получения диплома, а настоящей возможностью погрузиться в мир науки и технологий. Стать самому тем, кто творит будущее, создавая технологии, и развивая то, что будет создавать будущее.
|
Часть |
Тема |
Краткое содержание |
|---|---|---|
|
1 |
Что я хотел видеть дома в 2021 |
Концепция проекта, видение «Дом который тебя понимает», цели и задачи |
|
2 |
Как я проектировал опыт [1] пользователя |
Проектирование пользовательского интерфейса, разделение полномочий, контекстное понимание |
|
3 |
Архитектура нейросети |
Многослойная обработка звуковых данных, выбор архитектуры, технические детали |
|
4 |
Обучение [2] и валидация модели |
Сбор данных, извлечение признаков, процесс обучения, результаты |
|
5 |
Интеграция с устройствами «Умного дома» |
Протоколы связи, сценарии управления, адаптивность к новым устройствам |
|
6 |
Система безопасности и приватности |
Защита личных данных, механизмы приватности, контроль доступа |
|
7 |
Расширенные возможности и перспективы |
Наблюдение за здоровьем, безопасность детей, прогнозирование потребностей [3] |
В 2021 году я защищал дипломный проект, получая второе высшее образование по специальности Data Science и нейронные сети. До этого у меня уже был солидный багаж:
5 лет системного администрирования — понимание инфраструктуры и ограничений
Стратегический маркетинг — понимание пользователя и вовлечения
Руководство отделом продаж — управление командой и процессами
Этот бэкграунд сформировал моё видение: я создаю продукты, которые будут удобны людям, и чтобы люди могли настраивать вариативность этих продуктов для себя.
В презентации к диплому я написал:
“Вы просто подаёте голосовую команду на выполнение действия, система определяет её и исполняет. Без дополнительных приспособлений для подачи команд.”
Это было ключевым принципом — создать систему, которая понимает, а не просто слышит. Не нужно говорить «Алиса, включи свет» или «Окей, Гугл, открой дверь». Просто скажите «включи свет» в разговоре, и система поймёт, что это команда.
Почему именно голосовое управление?
На тот момент (2021) существовали системы голосового управления, но они требовали:
Специальных триггерных слов («Алиса», «Окей, Гугл»)
Чёткого произношения
Отсутствия фонового шума
Отдельных устройств (колонок, смартфонов)
Я хотел создать систему, которая:
✅ Работает в обычном диалоге — команды распознаются среди обычной речи
✅ Не требует дополнительных устройств — работает на обычном компьютере или сервере
✅ Адаптируется под пользователя — учитывает возраст, пол, особенности речи
✅ Понимает контекст — знает, кто говорит и в какой ситуации
Я понимал, что технологии, которые я запланировал, требуют много работы и много навыков в различных отраслях. Это не просто нейросеть, которая распознаёт команды — это целая экосистема взаимодействующих систем.
“Чтобы управление от устройства понимания, в котором расположены веса модели и алгоритм отправки команды, имело механическое действие — необходимо согласование этих механизмов.”
Примеры интеграции:
GSM-звонок и шлагбаум:
Система распознаёт голосовую команду «Открой ворота»
Проверяется авторизация пользователя
Если пользователь имеет право — система инициирует GSM-звонок оператору
Оператор получает команду и включает механизм открывания шлагбаума
Шлагбаум открывается
Детекция госномера:
Камера фиксирует автомобиль на подъезде
Система детектирует госномер на номерном знаке
Распознаёт цифры и буквы госномера
Проверяет номер по базе данных на наличие полномочий
Если номер авторизован — открывает ворота
Почему это важно для архитектуры?
Понимание этой сложности помогло мне спроектировать модульную архитектуру, где:
Каждый компонент отвечает за свою задачу
Компоненты могут работать независимо друг от друга
Можно легко добавлять новые функции без переписывания всей системы
Система масштабируется по мере добавления новых устройств
Это и есть микросервисный подход, который я интуитивно применял ещё в 2021 году, хотя тогда это ещё не было таким распространённым в ИИ-проектах.
|
Тогда (2021) |
Сейчас (2026) |
|---|---|
|
Пользователь говорит в разговоре: «Здесь темновато» |
Это стало стандартом в умных домах |
|
Система распознаёт это как команду на увеличение яркости |
Но многие системы всё ещё требуют триггерных слов |
|
Освещение автоматически регулируется |
|
|
Тогда (2021) |
Сейчас (2026) |
|---|---|
|
Пользователь говорит: «Открой дверь» |
Умные замки стали популярными |
|
Система проверяет права доступа |
Но интеграция с голосовыми системами всё ещё не идеальна |
|
Если пользователь имеет право — дверь открывается |
|
|
Тогда (2021) |
Сейчас (2026) |
|---|---|
|
Пользователь говорит: «Покажи, что происходит на кухне» |
Умные камеры с голосовым управлением существуют |
|
Система включает камеру и показывает изображение на экране |
Но интеграция с другими системами дома часто сложна |
|
Параметр |
Значение |
|---|---|
|
Объём базы |
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
Это позволяет наглядно понять что имеем от каждого файла, в каком объёме и диапазоне. По результатам принимаем решение как можем использовать эти данные для достижения результата.
┌─────────────────────────────────────────────────────────────────┐
│ АРХИТЕКТУРА 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'])
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')
“Не просто ‘включи свет’, а ‘сделай уютно’. Система должна понимать намерение, а не только команду.”
Моя философия:
“Значит система хранит в себе паттерны каждого человека, понимая его, как личный помощник с разными ролями. И просьба ‘сделай уютно’ — воспринимается так, что человеку, сказавшему это словосочетание, делает приглушенный свет, легкую музыку, нагрев пола и вода в ванной.”
Это и есть то, что я называю объектно-ориентированным программированием в продуктах — каждый модуль можно оптимизировать и улучшать независимо друг от друга.
Я не исключительно на ООП опираюсь при создании проекта. Мне больше нравится микросервисная архитектура. Также я интуитивно делаю всё по Agile.
Благодаря применению микросервисной архитектуры я могу использовать разные нейросети для одного проекта и разные проекты для одних нейросетей. Тем самым хорошо экономя на вычислительных ресурсах.
То есть я понимаю, что можно мониторить систему и видеть, что нагрузка у нас на нейросеть, которая занимается компьютерным зрением [5], в большей степени происходит с 10:00 до 22:00 по московскому времени. При этом есть задача компьютерного зрения схожая, которая не требует срочной обработки, поэтому мы откладываем на потом. И во время того, как освобождаются вычислительные мощности, происходит передача по стеку накопленных данных для обработки того, что необходимо обработать не в срочном порядке.
✅ Multi-input архитектура для обработки разных типов признаков
✅ Модульная система, позволяющая легко добавлять новые команды
✅ Точность валидации ~94.55% на небольшом датасете
✅ Возможность масштабирования архитектуры
Использовать предобученные модели — Wav2Vec 2.0, HuBERT или RuBERT вместо обучения с нуля
Применить трансформеры — для лучшего понимания контекста
Data Augmentation — шум, питч, скорость для увеличения датасета
Квантование — для deployment на edge-устройства
Микросервисная архитектура — для масштабируемости и оптимизации ресурсов
Мониторинг и планирование — для оптимизации вычислительных мощностей
Темы следующей статьи:
📋 Проектирование пользовательских сценариев
🔐 Разделение полномочий (дети/взрослые)
🧠 Контекстное понимание команд
🔒 Безопасность и приватность данных
|
Файл |
Описание |
Ссылка |
|---|---|---|
|
Презентация |
Презентация дипломного проекта |
Скачать PDF [6] |
|
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 # Разделение данных
Автор: AlekseiVB
Источник [7]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/26099
URLs in this post:
[1] опыт: http://www.braintools.ru/article/6952
[2] Обучение: http://www.braintools.ru/article/5125
[3] потребностей: http://www.braintools.ru/article/9534
[4] Image: https://sourcecraft.dev/
[5] зрением: http://www.braintools.ru/article/6238
[6] Скачать PDF: #
[7] Источник: https://habr.com/ru/articles/1001512/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1001512
Нажмите здесь для печати.