В этой статье представлена схема реализации для классификации аудио (включая типы, сцены и т. д.) с использованием TensorFlow, включая подробное руководство по альтернативным моделям, альтернативным наборам данных, подготовке набора данных, обучению модели и извлечению результатов. интерфейсы и интегрировать IoT.
Введение
Существует множество различных проектов и сервисов, распознающих человеческую речь, например, Pocketsphinx, Google Speech API и другие. Эти приложения и службы могут распознавать человеческую речь в текст с приличной производительностью, но ни одно из них не может сказать, какой звук улавливает микрофон: человеческий голос, голос животного или играющая музыка.
Когда мы столкнулись с этой задачей, мы решили исследовать и разработать пример проекта, который использует алгоритмы машинного обучения для различения звуков. В этом посте конкретно описывается, какой инструмент мы выбрали, с какими проблемами мы столкнулись, как мы обучали модели с помощью TensorFlow и как мы запускали наш проект с открытым исходным кодом. Чтобы использовать их в облачных сервисах, предоставляемых сторонним приложениям, мы также предоставляем результаты идентификации на платформах DeviceHive и IoT.
Инструменты выбора и модели классификации
Сначала нам нужно выбрать программное обеспечение, способное запускать нейронную сеть. Первым подходящим решением, которое мы нашли, был Python Audio Analysis.
Основная проблема в машинном обучении — иметь хороший набор обучающих данных. Существует много наборов данных для классификации музыки и распознавания речи, но не так много для классификации случайных звуков. После исследования мы нашли набор данных о городских звуках (https://serv.cusp.nyu.edu/projects/urbansounddataset/).
После некоторого тестирования мы столкнулись со следующей проблемой:
- pyAudioAnalysis недостаточно гибок. В нем слишком мало видов параметров, а расчет некоторых параметров выходит из-под контроля, например, количество обучающих экспериментов основано на количестве семплов, через pyAudioAnalysis это изменить нельзя.
- В этом наборе данных всего 10 категорий, и все они относятся к «городским» типам.
Еще одно решение, которое мы нашли, — это Google AudioSet, который основан на тегированных клипах YouTube и может быть загружен в двух форматах:
- Каждый видеоклип имеет описание файла CSV, включая идентификатор видео YouTube, время начала и окончания, а также один или несколько тегов.
- Извлеченные аудиофункции сохраняются в виде файлов TensorFlow Record.
Эти функции совместимы с моделью YouTube-8M. Это решение также предоставляет модели TensorFlow VGGish в качестве средств извлечения признаков. Он удовлетворяет большинство наших потребностей и поэтому является лучшим выбором для нас.
Обучите модель
Следующая задача — понять, как работает интерфейс YouTube-8M. Он предназначен для обработки видео, но, к счастью, он также может обрабатывать звук. Эта библиотека довольно удобна, но имеет фиксированное количество примеров классов. Поэтому мы немного изменили его, чтобы передать количество категорий в качестве параметра.
YouTube-8M может обрабатывать два типа данных: общие характеристики и характеристики кадра. Google AudioSet может использовать данные, о которых мы упоминали ранее, в качестве функций. После исследования мы обнаружили, что эти функции представлены в формате кадра. Далее нам нужно выбрать модель для обучения.
Ресурсы, время и точность
GPU лучше подходят для машинного обучения, чем CPU. Подробнее об этом можно узнать здесь (https://docs.devicehive.com/blog/using-gpus-for-training-tensorflow-models). Поэтому мы пропускаем этот процесс и запускаем экспериментальную установку напрямую. Для наших экспериментов мы использовали ПК NVIDIA GTX 970 с 4 ГБ видеопамяти.
В нашем случае время обучения не имеет большого значения. Принятие первоначального решения о выборе модели и точности занимает всего 1–2 часа.
Конечно, мы хотим получить максимальную точность. Однако для обучения более сложной модели (с потенциалом достижения более высокой точности) требуется больше оперативной памяти (в случае GPU, конечно, видеопамяти).
Выберите модель
Вот полный список моделей YouTube-8M с подробным описанием (https://github.com/google/youtube-8m#overview-of-models). Поскольку наши обучающие данные представлены в формате кадра, необходимо использовать модель на уровне кадра. Данные, предоставленные нам набором данных Google AudioSet, разделены на три части: сбалансированный обучающий набор, несбалансированный обучающий набор и набор для оценки.
Существует также пересмотренная модель YouTube-8M для обучения и оценки. Доступно здесь: (https://github.com/igor-panteleev/youtube-8m)
Сбалансированный тренировочный набор
Тренировочная команда выглядит следующим образом:
python train.py –train_data_pattern=/path_to_data/audioset_v1_embeddings/bal_train/*.tfrecord –num_epochs=100 –learning_rate_decay_examples=400000 –feature_names=audio_embedding –feature_sizes=128 –frame_features –batch_size=512 –num_classes=527 –train_dir=/path_to_logs –model=ModelName
Как предлагается в документации, мы изменили базовую скорость обучения модели LSTM на 0,001. Кроме того, мы изменили размер ячеек LSTM по умолчанию на 256, потому что у нас не хватало оперативной памяти.
Теперь давайте посмотрим на результаты обучения:
Как показано выше, мы получаем лучшие результаты во время обучения, но это не значит, что мы получаем такие же хорошие результаты во время тестирования.
Несбалансированная тренировка
Давайте попробуем несбалансированный набор данных. В нем больше выборок, поэтому мы изменили количество эпох на 10 (минимум должно быть 5, т.к. обучение займет много времени).
журнал тренировок
Если вы хотите проверить наши журналы тренировок, вы можете скачать их здесь (https://s3.amazonaws.com/audioanalysis/train_logs.tar.gz) и запустить:
tensorboard –logdir /path_to_train_logs/
Затем откройте порт хоста 6006 в браузере, чтобы увидеть его.
Подробнее об обучении
YouTube-8M использует множество параметров, большинство из которых влияет на тренировочный процесс. Например: вы можете настроить скорость обучения или количество эпох, эти два параметра могут существенно изменить процесс обучения. Также есть 3 функции для расчета убытка и множество других полезных переменных, которые можно изменить для улучшения результатов.
Теперь, когда у нас есть несколько обученных моделей, пришло время добавить код для взаимодействия с ними. Нам нужно захватить звук с микрофона. Здесь мы используем PyAudio, который предоставляет простой интерфейс, который может работать на многих платформах.
Аудио подготовка
Как мы упоминали ранее, мы собираемся использовать модель TensorFlow VGGish в качестве экстрактора признаков. Вот краткое объяснение процесса преобразования:
Используйте образец звука «лай» из набора данных UrbanSound в качестве примера визуализации.
Передискретизируйте звук в моно 16 кГц.
Речь кадрируется с использованием длины кадра 25 мс, сдвига кадра 10 мс и периодического окна Ханна, для каждого кадра выполняется кратковременное преобразование Фурье, а спектрограмма рассчитывается с использованием амплитуды сигнала.
Спектр mel вычисляется путем сопоставления спектра с набором фильтров mel 64-го порядка.
Рассчитайте log(mel-spectrum + 0,01), чтобы получить стабильный спектр mel, с добавлением смещения 0,01, чтобы избежать логарифмирования 0.
Затем эти особенности кадрируются длительностью 0,96с (общая продолжительность этого "лающего" звука), без перекрытия кадров, каждый кадр содержит 64 мел-полосы длительностью 10мс (то есть всего 96 кадров) .
Затем эти образцы передаются в модель VGGish для извлечения векторов признаков.
Классификация
Наконец, нам нужен интерфейс, который может передавать данные в нейронную сеть для получения результатов классификации.
Мы используем YouTube-8M в качестве примера, но с некоторыми изменениями, чтобы удалить этапы сериализации/десериализации.
Наши результаты можно увидеть здесь (https://github.com/devicehive/devicehive-audio-analysis).
Установить
PyAudio использует libportaudio2 и portaudio19-dev, поэтому вам необходимо установить эти два инструмента перед установкой PyAudio.
Также требуются некоторые библиотеки Python, для их установки можно использовать pip.
pip install -r requirements.txt
Вам также потребуется скачать и извлечь основной каталог проекта с сохраненными моделями, который можно найти здесь (https://s3.amazonaws.com/audioanalysis/models.tar.gz).
бегать
Наш проект предоставляет 3 интерфейса, которые можно использовать.
1. Обработайте записанные аудиофайлы
Просто запустите следующую команду:
python parse_file.py path_to_your_file.wav
Тогда в терминале вы увидите следующую информацию: Голос: 0,75 Музыка: 0,12 В холле: 0,03.
Результат определяется входным файлом. Эти значения являются прогнозами, сделанными нейронной сетью. Чем больше значение, тем выше вероятность того, что звук во входном файле относится к этой категории.
2. Захват и обработка данных с микрофона
Запустите python capture.py, чтобы начать захват данных с микрофона без ограничений. По умолчанию он передает данные в нейронную сеть каждые 5-7 секунд. Здесь вы можете увидеть результаты предыдущего примера.
В этом случае вы можете запустить приведенную выше команду с параметром --save_path=/path_to_samples_dir/, и все собранные данные будут сохранены по указанному вами пути в виде файла wav. Эта функция полезна, когда вы хотите попробовать разные модели с одними и теми же образцами. Вы можете использовать -help для получения дополнительной информации.
3. веб-интерфейс
python daemon.py реализует простой веб-интерфейс, который по умолчанию настроен локально на порт 8000 (http://127.0.0.1:8000/). Затем мы используем тот же код, что и в предыдущем примере. Вы можете увидеть последние 10 прогнозов времени звука (http://127.0.0.1:8000/events):
Интеграция с услугами Интернета вещей
И последнее, но не менее важное: интеграция в инфраструктуру IoT. Если вы запустите веб-интерфейс, о котором мы упоминали ранее, вы можете увидеть состояние и конфигурацию клиента DeviceHive на странице индекса. Пока клиент успешно подключился, результат прогноза будет отправлен на конкретное устройство в виде уведомления.
в заключении
Как видите, TensorFlow — очень гибкий инструмент, который полезен во многих приложениях машинного обучения, таких как обработка изображений и распознавание речи. Сочетание этого подхода с платформой IoT позволяет создавать интеллектуальные решения во многих областях.
Умные города могут использовать это решение в целях безопасности, постоянно прислушиваясь к битому стеклу, выстрелам и другим звукам, связанным с преступностью. Даже в тропических лесах с помощью этого метода можно отслеживать животных и птиц, анализируя их звуки.
Устройства IoT могут получать все эти уведомления. Это решение можно установить на локальное устройство, чтобы свести к минимуму затраты на связь и облачные услуги (хотя его также можно развернуть в облаке в качестве облачной службы), и его можно настроить для получения только информации, не содержащей необработанного звука. Не забывайте, что это проект с открытым исходным кодом, не стесняйтесь его использовать.
Оригинальный адрес: https://medium.com/iotforall/sound-classification-with-tensorflow-8209bdb03dfb