Сверточные нейронные сети (CNN) являются одной из наиболее эффективных сетевых моделей, используемых для классификации изображений, учитывая способность алгоритма обрабатывать входные нейроны окнами, улучшая время обучения и точность. Эти преимущества можно использовать для разработки надежной модели классификации с надлежащей предварительной обработкой данных.

Проделанная здесь работа сильно повлияла на следующий алгоритм:

https://www.youtube.com/watch?v=Z7YM-HAz-IY&list=PLhA3b2k8R3t2Ng1WW_7MiXeh1pfQJQi_P

В этом примере мы построим модель, которая попытается классифицировать двухсекундный звуковой фрагмент как одну из трех категорий:

  1. Шум в микрофоне
  2. Помехи ветра
  3. Тишина

Во-первых, нам нужно собрать набор данных. Используя библиотеку python pyaudio, мы создадим короткий скрипт для захвата звукового фрагмента, который будет использоваться для обучающего набора.

 pip install pyaudio

Собрав каждую категорию отдельно и начав с ветровойклассификации, следующий скрипт возьмет двухсекундный фрагмент, назначит имя файла, а затем сохранит его в аудиокаталоге. Когда скрипт запущен, для ветра попробуйте подуть на микрофон компьютера. В случае шума проведите пальцем по микрофону, чтобы создать шумный отклик. Для эмбиента просто позвольте сценарию работать без вмешательства микрофона.

Измените переменную cat_str для каждого условия категории, запустив всего три раза, чтобы получить набор данных.

После того, как все файлы .wav будут собраны, необходимо создать CSV-файл метаданных. Конфигурацию можно найти ниже:

index,slice_file_name,class_name
1    ,noise_0.wav    ,noise
          ...
25   ,wind_0.wav     ,wind
          ...
50   ,ambient_0.wav  ,ambient

Конечно, существует питонический способ создания этого файла, однако, поскольку мой набор данных невелик, я просто использовал Excel.

Теперь рабочий каталог должен быть настроен, как показано ниже:

Sound classification:
    |_ audio_capture.py
    |_ office_sounds.csv
    |_ audio
        |_ wind_0.wav
           ...
        |_ wind_25.wav
        |_ ambient_0.wav
           ...
        |_ ambient_25.wav
        |_ noise_0.wav  
           ...
        |_ noise_25.wav

Давайте немного изучим данные.

Обратите внимание на импорт. Наиболее важной используемой библиотекой является python_speech_features.

pip install python_speech_features

https://github.com/jameslyons/python_speech_features

Это преобразует звуковые данные из временной области в частотную область с акцентом на низкочастотную слышимую полосу.

Изображение, которое мы будем подавать в классификатор CNN, генерируется из Мел частотных кепстровых коэффициентов (MFCC) сигнала.

Давайте очистим данные, удалив мертвое пространство (см.: конверт) и сбросим их в чистый каталог файлов.

Новая структура каталогов:

Sound classification:
    |_ clean.py
    |_ explore.py
    |_ audio_capture.py
    |_ office_sounds.csv
    |_ audio
        |_ wind_0.wav
           ...
        |_ wind_25.wav
        |_ ambient_0.wav
           ...
        |_ ambient_25.wav
        |_ noise_0.wav  
           ...
        |_ noise_25.wav
    |_ clean
        |_ wind_0.wav
           ...
        |_ wind_25.wav
        |_ ambient_0.wav
           ...
        |_ ambient_25.wav
        |_ noise_0.wav  
           ...
        |_ noise_25.wav

Чтобы построить модель, создайте два новых файла Python: cfg.py и model_implement.py.

cfg.py будет хранить основную информацию о модели. Это разделение станет полезным, если мы захотим поэкспериментировать с дополнительными нейронными сетями.

model_implement.py вызывает cfg для создания CNN с четырьмя слоями, три из которых скрыты.

build_rand_feat()выполнит черновую работу для каждого файла. Это более или менее повторяет то, что было выполнено в explore.py, однако теперь мы строим случайные функции на основе скользящего окна через наш звуковой фрагмент.

Это сохранит обученную модель в каталоге «models», а данные конфигурации — в каталоге «pickles». Обновленный каталог показан здесь:

Sound classification:
    |_ clean.py
    |_ explore.py
    |_ audio_capture.py
    |_ office_sounds.csv
    |_ models 
        |_ conv.model    
    |_ pickels
        |_ conv.model
    |_ audio
        |_ conv.p
           ...
        |_ wind_25.wav
        |_ ambient_0.wav
           ...
        |_ ambient_25.wav
        |_ noise_0.wav  
           ...
        |_ noise_25.wav
    |_ clean
        |_ wind_0.wav
           ...
        |_ wind_25.wav
        |_ ambient_0.wav
           ...
        |_ ambient_25.wav
        |_ noise_0.wav  
           ...
        |_ noise_25.wav

Наконец, добавьте скрипт predict.py, чтобы проверить производительность нашей модели.

Следует отметить, что это чисто экспериментальные данные с довольно небольшим набором данных. Такой высокой точности не следует ожидать в реальном сценарии.

Это пример использования сверточной нейронной сети для классификации фрагментов звуковых данных. Ключевым компонентом успешного внедрения CNN в звуковую классификацию является способность преобразовывать данные из временной области в частотную область с использованием коэффициентов частотного кепстра Мела. В explore.py ясно, что сгенерированные MFCC уникальны для каждой классификации, в то время как отображение сигнала во временной области поддерживает уровень неоднозначности, который в противном случае мог бы помешать алгоритму.