Использование нейросетей для анализа звуковой информации


Работа со звуком на платформе Windows


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

Запись и воспроизведение звука в компьютере осуществляется посредством звуковой карты – платы, вставляющейся в стандартный слот ISA или PCI, на которой имеется несколько аудио входов/выходов, АЦП, ЦАП, предварительные/буферные усилители, цифровые микшеры, фильтры и, возможно, процессор цифровой обработки сигнала.  Стандартные частоты дискретизации – 11025, 22050, 44100 и 48000 Гц, разрядность данных 4, 8, 16 бит на отсчет, один или два канала. В системе может быть установлено несколько устройств записи звука, можно использовать каждое в отдельности или устройство по умолчанию.

Процесс ввода звука в компьютер представлен таблицей 1:

Таблица 1

Ввод звука в компьютер при помощи Multimedia API в Windows



Действие

Функция Windows

Открытие устройства записи с заданными параметрами

waveInOpen

Подготовка блоков памяти для записи

(выделение памяти и создание заголовков)

waveInPrepareHeader

Добавление всех блоков в очередь записи

waveInAddBuffer

Начало записи

waveInStart

…………..

Обработка события окончания записи очередного блока и добавление в очередь нового

…………….

Реакция на сообщение, функция обратного вызова, сброс объекта-события

Окончание записи

waveInStop,

waveInReset

Освобождение заголовков блоков и освобождение памяти

waveInUnprepareHeader

Закрытие устройства

waveInClose


При открытии устройства и начале записи создается непрерывный процесс, который записывает вводимые звуковые данные в находящиеся в очереди записи блоки памяти. При записи очередного блока он удаляется из очереди и приложение информируется об окончании записи блока. Можно задать несколько способов:  посредством сообщений некоторому окну или процессу, функцией обратного вызова (callback), через объект-событие. Приложение обрабатывает записанный блок и добавляет в очередь новый. При отсутствии блоков в очереди ошибки не выдается, просто теряются поступающие данные, поэтому всегда надо следить, чтобы в очереди был пустой блок. Наиболее простая схема записи без потери данных – запись с двумя блоками.

Проблема синхронизации процессов записи, обработки и визуализации.

В разрабатываемой мной системе осуществляется как обработка и визуализация звука в реальном времени, так и сохранение записываемых данных в файл. В первом случае важна синхронизация процесса обработки сообщений главным окном приложения и процесса записи. Если процесс записи непрерывный, то процесс главного окна помимо сообщений от звукозаписи обрабатывает ещё множество сообщений графического интерфейса Windows (например, перемещение курсора или нажатие кнопок). Во втором случае наоборот важна независимость процесса записи от процесса главного окна, чтобы исключить потерю данных. Очевидно, что использование механизма обработки сообщений о записи блоков главным окном невозможно как в первом, так и во втором случае (что и показал опыт разработки первой версии программы).  В первом случае если время обработки блока аудиоданных будет меньше времени его записи (что вполне возможно в связи со сложностью вычислений и визуализации), то очередь сообщений главного окна очень быстро переполнится и приложение “зависнет”, т.е. перестанет реагировать на действия пользователя. Во втором случае будет происходить потеря данных, т.к. приложение помимо сообщений звукозаписи будет обрабатывать сообщения Windows (например, при перемещении окна обработка очереди сообщений прекращается).

Проблема решается созданием ещё одного процесса, независимого от процесса главного окна. Он обрабатывает сообщения от звукозаписи и может при помощи  механизма синхронизации передавать блоки на для обработки окну приложения.

Применительно к конкретной среде C++ Builder мной создан класс TWaveRecorder, унаследованный от класса TThread, в котором полностью реализуется описанный выше механизм. Схема процессов и взаимодействия между ними изображена на рис. 1

Взаимодействие процессов при вводе звука



Рис. 1

Запись начинается сразу после создания экземпляра класса TWaveRecorder. Конструктору передается формат аудиоданных, размер блоков, адрес функции-обработчика записанных блоков и необходимость синхронизации с окном приложения. Завершается запись функцией TWaveRecorder::Stop() или удалением объекта.


Содержание раздела