Библиографическое описание:

Тютин С. В. Программная реализация анализатора аудиофайлов // Молодой ученый. — 2015. — №12. — С. 42-48.

Звук — это крайне сложный комплекс частот, обладающий изменяющейся интенсивностью. Быстрый и точный анализ звука — весьма сложный процесс. Непосредственно под анализом звука мы подразумеваем разложение любого сложного звука на ряд простых составляющих.

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

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

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

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

-          кроссплатформенное приложение;

-          возможность работы с любыми аудио-картами и графическими ускорителями.

На основе вышеупомянутых требований была разработана следующая схема взаимодействия пользователя и системы:

Рис. 1. Диаграмма вариантов использования

 

Роль «Пользователь» подразумевает следующую схему взаимодействия с приложением: пользователь загружает в приложение аудиофайл, а затем, в ходе выполнения анализа, пользователь получает конечные результаты в графическом виде.

Рис. 2. Схема входных и выходных данных

 

Схема входных и выходных данных показывает, какие данные необходимы для функционирования приложения. От пользователя требуется только аудиофайл.

Интерфейс приложения построен на технологии WinForms и OpenGL. Это обеспечивает высокую совместимость и скорость работы интерфейса на различных компьютерах.

Рис. 3. Интерфейс программы

 

Рис. 4. Подсветка участков тишины

 

В качестве средств реализации приложения были выбраны следующие программные продукты и технологии:

-          Язык разработки: С#

-          Расширение OpenTK (OpenGL для.NET)

-          Расширение NAudio (Работа со звуковой картой)

-          Среда разработки: MS Visual Studio 2012

-          Платформа:.NET 4.5

-          Система контроля версий: Mercurial

-          Сервис хостинга репозиториев: Bitbucket

-          Issue tracker: Bitbucket

-          Разработка диаграмм: Draw.io

-          Автоматизация сборки: NAnt 0.9.2

Данный набор средств хорошо зарекомендовал себя в разработке проектов различной сложности. Многие из инструментов, по сути, являются стандартом де-факто в своей области.

C# выбран в качестве основного языка разработки, потому что он обеспечивает легкую интеграцию с внешними библиотеками и быструю разработку интерфейса ПО.

IDE — на данный момент последняя версия среды разработки от Microsoft, в которой были исправлены некоторые недочеты предыдущих версий.

Mercurial, в качестве VCS, выбран из-за подробной документации и обширного коммьюнити пользователей, а Bitbucket — из-за наличия встроенного issue tracker-а.

Для разработки диаграмм и интерфейса использовался онлайн-ресурс http://draw.io, плюсами которого являются дружественный интерфейс, бесплатность и обширный банк шаблонов проектирования.

В качестве инструмента для автоматизации сборки выступает NAnt из-за открытости кода, кроссплатформенности и ориентированности на платформу.NET (в отличии от того же Apache Ant).

Минимальные аппаратные требования:

-          512Mb RAM

-          Intel Pentium IV или совместимый

-          Звуковая карта

-          Видеоускоритель Intel GMA 950 или лучше

-          Программные требования

-          .NET Framework 4.5 или Mono и набор совместимых библиотек

Представленная диаграмма классов демонстрирует классы разработанной системы, их атрибуты, методы и взаимосвязи между ними.

Рис. 5. Диаграмма классов

 

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

Рис. 6. Диаграмма состояний

 

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

Взаимодействие объектов (обмен между ними сигналами и сообщениями), упорядоченное по времени, с отражением продолжительности обработки и последовательности их проявления отражено на диаграмме последовательностей.

Рис. 7. Диаграмма последовательностей

 

На диаграмме представлена практически полная схема работы системы: пользователь указывает имя файла, программа загружает этот файл, в процессе воспроизведения на интерфейсе программы изображается график громкости. По окончании воспроизведения пользователь может получить все данные сразу.

Далее представлен фрагмент программы, реализующий анализатор.

using System;

using System.Collections.Generic;

using System.Text;

using System.Diagnostics;

using NAudio.Dsp;

using NAudio.Wave;

 

namespace AudioAnalizer.Core

{

    public class SampleAggregator : ISampleProvider

    {

        // volume

        public event EventHandler<MaxSampleEventArgs> MaximumCalculated;

        private float maxValue;

        private float minValue;

        public int NotificationCount { get; set; }

        int count;

 

        // FFT

        public event EventHandler<FftEventArgs> FftCalculated;

        public bool PerformFFT { get; set; }

        private readonly Complex[] fftBuffer;

        private readonly FftEventArgs fftArgs;

        private int fftPos;

        private readonly int fftLength;

        private int m;

        private readonly ISampleProvider source;

 

        private readonly int channels;

 

        public SampleAggregator(ISampleProvider source, int fftLength = 1024)

        {

            channels = source.WaveFormat.Channels;

            if (!IsPowerOfTwo(fftLength))

            {

                throw new ArgumentException("FFT Length must be a power of two");

            }

            this.m = (int)Math.Log(fftLength, 2.0);

            this.fftLength = fftLength;

            this.fftBuffer = new Complex[fftLength];

            this.fftArgs = new FftEventArgs(fftBuffer);

            this.source = source;

        }

 

        bool IsPowerOfTwo(int x)

        {

            return (x & (x - 1)) == 0;

        }

 

 

        public void Reset()

        {

            count = 0;

            maxValue = minValue = 0;

        }

 

        private void Add(float value)

        {

            if (PerformFFT && FftCalculated != null)

            {

                fftBuffer[fftPos].X = (float)(value * FastFourierTransform.HammingWindow(fftPos, fftLength));

                fftBuffer[fftPos].Y = 0;

                fftPos++;

                if (fftPos >= fftBuffer.Length)

                {

                    fftPos = 0;

                    // 1024 = 2^10

                    FastFourierTransform.FFT(true, m, fftBuffer);

                    FftCalculated(this, fftArgs);

                }

            }

 

            maxValue = Math.Max(maxValue, value);

            minValue = Math.Min(minValue, value);

            count++;

            if (count >= NotificationCount && NotificationCount > 0)

            {

                if (MaximumCalculated != null)

                {

                    MaximumCalculated(this, new MaxSampleEventArgs(minValue, maxValue));

                }

                Reset();

            }

        }

 

        public WaveFormat WaveFormat { get { return source.WaveFormat; } }

 

        public int Read(float[] buffer, int offset, int count)

        {

            var samplesRead = source.Read(buffer, offset, count);

 

            for (int n = 0; n < samplesRead; n += channels)

            {

                Add(buffer[n + offset]);

            }

            return samplesRead;

        }

    }

 

    public class MaxSampleEventArgs : EventArgs

    {

        [DebuggerStepThrough]

        public MaxSampleEventArgs(float minValue, float maxValue)

        {

            this.MaxSample = maxValue;

            this.MinSample = minValue;

        }

        public float MaxSample { get; private set; }

        public float MinSample { get; private set; }

    }

 

    public class FftEventArgs : EventArgs

    {

        [DebuggerStepThrough]

        public FftEventArgs(Complex[] result)

        {

            this.Result = result;

        }

        public Complex[] Result { get; private set; }

    }

}

Тестирование показало продуктивность системы, т. е. соответствие поставленным функциональным требованиям.

Программа достаточно хорошо оптимизирована для работы с различными процессорами и объёмами памяти и позволяет работать с весьма продолжительными фрагментами аудио.

 

Литература:

 

1.         Шаров В. Компьютерный анализ звука, BYTE Россия 13.04.2005 (http://www.bytemag.ru/articles/detail.php?ID=6719)

2.         Кристиан Нейгел и др. C# 5.0 и платформа.NET 4.5 для профессионалов (Professional C# 5.0 and.NET 4.5.) — «Диалектика», 2013. — 1440 с. — ISBN 978–5-8459–1850–5

3.         Эндрю Троелсен. Язык программирования C# 5.0 и платформа.NET 4.5, 6-е издание = Pro C# 5.0 and the.NET 4.5 Framework, 6th edition. — «Вильямс», 2013. — 1312 с. — ISBN 978–5-8459–1814–7

Обсуждение

Социальные комментарии Cackle