Домашнее задание по курсу My First Data Project.
Основная цель представленного проекта - решить задачу очистки речи от фоновых шумов, используя технологии машинного обучения.
В описании ниже представлено обоснование выбранной архитектуры, приведены результаты экспериментов по подбору оптимальных гиперпараметров, описан процесс обучения нейронной сети.
Работу нейронки можно оценить тут: тык
Проект очень интересный, обязательно вернусь к доработке когда подучусь.
- Добавлена новая модель - CRNN. Все еще экспериментирую с ее архитектурой и параметрами. Постараюсь в кратчайшие сроки доработать текст с приведением результатов и полного сравнения
- Поменял структуру проекта, по совету ментора.
- Добавил полный список библиотек.
- librosa
- numpy
- tensorflow
Подробнее в файлике requirements.txt
В репозитории находится три отдельных модуля:
- cnn_denoising - CNN (baseline) для обработки аудио.
- crnn_denoising - CRNN для обработки аудио.
- dataset_creation - скрипт для наложения записей речи на различные шумы. Показалось, что логически верным будет вынести его в отдельный модуль и отдельным этапом.
Машинное обучение начинается с данных. Итоговый датасет для задачи был сгенерирован на основе следующих наборов:
- Common Voice (https://commonvoice.mozilla.org/ru/datasets). Имеет большое число проверенных аудиозаписей - зачитанных спикерами текстов.
- UrbanSound8K (https://www.kaggle.com/datasets/chrisfilo/urbansound8k). Большой объем разнотипных городских шумов.
- Microsoft Scalable Noisy Speech dataset (https://github.com/microsoft/MS-SNSD). Большой объем разных звуков, записей речи. Есть разбивка на тестовые и тренировочные данные. Изначально брал для тестирования модели, но позже включил в основной датасет.
Из каждой аудиозаписи отсекается тихий участок (в начале и конце аудиозаписи). Далее, на записи голоса (1 и 3 датасеты) накладываются выбранные случайным образом (из 2 и 3 датасета) шумы, с параметром SNR в диапазоне от 0 до 40 db. Все эти шаги выполняются скриптом из dataset_creation. Дальше, при запуске обучения одной из моделей загружаются уже обработанные аудио и с преобразованием Фурье конвертируются в STFT magnitude vectors, которые, после некоторых дополнительных шагов, подаются в сеть (детали описаны в статье, и откомментируются в коде).
*SNR (Signal-to-Distortion) - отношение мощности полезного сигнала к мощности шума.
Детали описаны в статье [1][2], ссылки в конце документа.
Сперва стоит отметить, что автор работы столкнулся с техническими ограничениями и не смог организовать обучение моделей с большей вариативностью в значениях гиперпараметров. Эксперименты будут продолжены.
В качестве основного инструмента версионирования экспериментов была взята платформа Weights and Biases. Процесс подбора гиперпараметров проводился с использованием ее особенностей sweeps и метода баесовской оптимизации. Все эксперименты доступны к просмотру в проекте speech_denoising и crnn_denoising (можно найти в профиле - ссылка).
Поговорим о самом процессе:
Пара слов об архитектуре, поскольку она имеет прямое влияние на гиперпараметры.
Архитектура заимствована из уже упомянутой выше статьи [1] (следующие снимки оттуда) по нескольким причинам:
- Исследование, описанное в работе, проводилось с целью найти оптимальное с точки зрения числа параметров и качества решение, которое бы функционировало в условиях серьезных аппаратных ограничений (в статье - на слуховом аппарате).
- В исследовании проведено сравнение нескольких архитектур нейронных сетей, выбор был сделан по его итогам.
- CNN демонстрирует высокую производительность в том числе на задачах связанных с обработкой речи, что полезно при размещении модели на смартфоне и обучении модели.
- Уровень сложности реализации.
- Автор данной статьи проявляет интерес к computer vision и обработке изображений.
*Сравнение работы разных архитектур нейронных сетей в статье:
Выбрана CR-CED (skip), т.к. модель демонстрирует неплохие результаты, имея при этом наименьшее число параметров.
Таким образом, число нейронов и число слоев, metric - rmse (широко распространенная для задач регресии, к слову), activation - adam, loss - mse взяты из статьи.
![](https://private-user-images.githubusercontent.com/63301430/238759396-9b62055c-67d1-46d3-8845-2ec5ef564401.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYwNDg3MzksIm5iZiI6MTcyNjA0ODQzOSwicGF0aCI6Ii82MzMwMTQzMC8yMzg3NTkzOTYtOWI2MjA1NWMtNjdkMS00NmQzLTg4NDUtMmVjNWVmNTY0NDAxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA5MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwOTExVDA5NTM1OVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI5MjU2YjJkZWJhZTNiNWVkZmVjYWUwMjU0N2UxNWNhMjRjMzdjNzFlZjE5YmFhZTQzYTRkNGQxN2VmZjY5ZmImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.7pBglzbbq_JphvPnwfakjU31r01cXYH5rLv3dToN1eE)
Вдохновлением при проектировании данной н.с. послужило другое исследование [2]. Там не так подробно расписано о ее устройстве, поэтому есть очень много пространства для творчества. Причины, по которым я взял эту архитектуру:
- Опять же, возможность разместить ее на мобильном устройстве.
- Не изученные мной до этого момента слои LSTM, мне было интересно с ними поработать.
- Улучшенное качество обработанных файлов, что неудивительно, если сравнить число параметров: 2,5М vs 35k.
Ожидаемое значение метрик качества обработанной аудио:
*PESQ and STOI
Metric и loss функция взята из статьи, как и функция активации.
Ориентируюсь на 5000 аудио в обоих Н.С. Датасет разбит на чанки по 512 файлов + тестовые и валидационные.
Взял 64. Таким образом, и модель учится быстрее и памяти при обучении кушается не так много.
Одно из самых важных открытий в этой части: я научился понижать значения learning rate в процессе обучения модели, после заданного числа эпох.
Выглядит это так:
Но это не отменяет понижение стартового значения lr по мере "скармливания" чанков в н.с.
Взял по 10 эпох на каждый чанк в обоих моделях. Не увидел никаких проблем с этим значением. Вот график с CRNN
Видим, что ошибка плавно снижается по мере скармливания датасета. Похожая картина и с CNN.
CRNN: средние STOI: 0.9146879230592444 и PESQ: 1.3276347517967224
CNN: средние STOI: 0.8152701249957266 и PESQ: 1.212430715560913
Таким образом, четко видна разница между CNN и CRNN, в пользу последней.
- https://paperswithcode.com/paper/a-fully-convolutional-neural-network-for
- https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8064406/
- https://habr.com/ru/post/668518/
- https://habr.com/ru/companies/antiplagiat/articles/528384/
- https://www.youtube.com/watch?v=ZqpSb5p1xQo&list=WL&index=8&t=1072s
- https://www.mathworks.com/help/deeplearning/ug/denoise-speech-using-deep-learning-networks.html
- https://www.kaggle.com/code/danielgraham1997/speech-denoising-analysis#Metrics-Analysis
- https://www.kaggle.com/code/carlolepelaars/bidirectional-lstm-for-audio-labeling-with-keras/notebook