exponenta event banner

classifySound

Классификация звуков в звуковом сигнале

Описание

пример

sounds = classifySound(audioIn,fs) возвращает классы звука, обнаруженные с течением времени во входном звуковом сигнале, audioIn, с частотой выборки fs.

пример

sounds = classifySound(audioIn,fs,Name,Value) указывает параметры, использующие один или несколько Name,Value аргументы пары.

Пример: sounds = classifySound(audioIn,fs,'SpecificityLevel','low') классифицирует звуки, используя низкую специфичность.

пример

[sounds,timestamps] = classifySound(___) также возвращает временные метки, связанные с каждым обнаруженным звуком.

пример

[sounds,timestamps,resultsTable] = classifySound(___) также возвращает таблицу, содержащую сведения о результатах.

пример

classifySound(___) без выходных аргументов создает облако слов идентифицированных звуков в звуковом сигнале.

Эта функция требует как Toolbox™ аудио, так и Deep Learning Toolbox™.

Примеры

свернуть все

Загрузите и распакуйте поддержку Audio Toolbox™ для YAMNet.

Если поддержка Audio Toolbox для YAMNet не установлена, то первый вызов функции предоставляет ссылку на место загрузки. Чтобы загрузить модель, щелкните ссылку. Распакуйте файл в папку по пути MATLAB.

Либо выполните следующие команды для загрузки и распаковки модели YAMNet во временную папку.

downloadFolder = fullfile(tempdir,'YAMNetDownload');
loc = websave(downloadFolder,'https://ssd.mathworks.com/supportfiles/audio/yamnet.zip');
YAMNetLocation = tempdir;
unzip(loc,YAMNetLocation)
addpath(fullfile(YAMNetLocation,'yamnet'))

Создайте 1 секунду розового шума, предполагая частоту дискретизации 16 кГц.

fs = 16e3;
x = pinknoise(fs);

Звонить classifySound с сигналом розового шума и частотой дискретизации.

identifiedSound = classifySound(x,fs)
identifiedSound = 
"Pink noise"

Считывание звукового сигнала. Звонить classifySound для возврата обнаруженных звуков и соответствующих временных отметок.

[audioIn,fs] = audioread('multipleSounds-16-16-mono-18secs.wav');
[sounds,timeStamps] = classifySound(audioIn,fs);

Постройте график звукового сигнала и пометьте обнаруженные звуковые области.

t = (0:numel(audioIn)-1)/fs;
plot(t,audioIn)
xlabel('Time (s)')
axis([t(1),t(end),-1,1])

textHeight = 1.1;
for idx = 1:numel(sounds)
    patch([timeStamps(idx,1),timeStamps(idx,1),timeStamps(idx,2),timeStamps(idx,2)], ...
        [-1,1,1,-1], ...
        [0.3010 0.7450 0.9330], ...
        'FaceAlpha',0.2);
    text(timeStamps(idx,1),textHeight+0.05*(-1)^idx,sounds(idx))
end

Выберите область и прослушивайте только выбранную область.

sampleStamps = floor(timeStamps*fs)+1;
soundEvent = 3;

isolatedSoundEvent = audioIn(sampleStamps(soundEvent,1):sampleStamps(soundEvent,2));
sound(isolatedSoundEvent,fs);
display('Detected Sound = ' + sounds(soundEvent))
    "Detected Sound = Snoring"

Считывание звукового сигнала, содержащего несколько различных звуковых событий.

[audioIn,fs] = audioread('multipleSounds-16-16-mono-18secs.wav');

Звонить classifySound с аудиосигналом и частотой дискретизации.

[sounds,~,soundTable] = classifySound(audioIn,fs);

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

sounds
sounds = 1×5 string
    "Stream"    "Machine gun"    "Snoring"    "Bark"    "Meow"

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

soundTable
soundTable=5×2 table
       TimeStamps         Results  
    ________________    ___________

         0      3.92    {4×3 table}
    4.0425    6.0025    {3×3 table}
      6.86    9.1875    {2×3 table}
    10.658    12.373    {4×3 table}
    12.985     16.66    {4×3 table}

Просмотр последней обнаруженной области.

soundTable.Results{end}
ans=4×3 table
             Sounds             AverageScores    MaxScores
    ________________________    _____________    _________

    "Animal"                       0.79514        0.99941 
    "Domestic animals, pets"       0.80243        0.99831 
    "Cat"                           0.8048        0.99046 
    "Meow"                          0.6342        0.90177 

Звонить classifySound снова. На этот раз, набор IncludedSounds кому Animal чтобы функция сохраняла только области, в которых Animal обнаружен класс звука.

[sounds,timeStamps,soundTable] = classifySound(audioIn,fs, ...
    'IncludedSounds','Animal');

Массив звуков возвращает только звуки, указанные как включенные звуки. sounds теперь массив содержит два экземпляра Animal которые соответствуют регионам, объявленным как Bark и Meow ранее.

sounds
sounds = 1×2 string
    "Animal"    "Animal"

Таблица звука включает только области, в которых были обнаружены указанные классы звука.

soundTable
soundTable=2×2 table
       TimeStamps         Results  
    ________________    ___________

    10.658    12.373    {4×3 table}
    12.985     16.66    {4×3 table}

Просмотр последней обнаруженной области в soundTable. Таблица результатов по-прежнему включает статистику по всем обнаруженным звукам в регионе.

soundTable.Results{end}
ans=4×3 table
             Sounds             AverageScores    MaxScores
    ________________________    _____________    _________

    "Animal"                       0.79514        0.99941 
    "Domestic animals, pets"       0.80243        0.99831 
    "Cat"                           0.8048        0.99046 
    "Meow"                          0.6342        0.90177 

Чтобы изучить, какие классы звука поддерживаются classifySound, использовать yamnetGraph.

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

[audioIn,fs] = audioread("multipleSounds-16-16-mono-18secs.wav");
sounds = classifySound(audioIn,fs)
sounds = 1×5 string
    "Stream"    "Machine gun"    "Snoring"    "Bark"    "Meow"

Звонить classifySound снова и установить ExcludedSounds кому Meow чтобы исключить звук Meow по результатам. Сегмент, ранее классифицированный как Meow теперь классифицируется как Cat, который является его непосредственным предшественником в онтологии AudioSet.

sounds = classifySound(audioIn,fs,"ExcludedSounds","Meow")
sounds = 1×5 string
    "Stream"    "Machine gun"    "Snoring"    "Bark"    "Cat"

Звонить classifySound снова и установить ExcludedSounds кому Cat. При исключении звука также исключаются все преемники. Это означает, что исключение звука Cat также исключает звук Meow. Сегмент, первоначально классифицированный как Meow теперь классифицируется как Domestic animals, pets, который является непосредственным предшественником Cat в онтологии AudioSet.

sounds = classifySound(audioIn,fs,"ExcludedSounds","Cat")
sounds = 1×5 string
    "Stream"    "Machine gun"    "Snoring"    "Bark"    "Domestic animals, pets"

Звонить classifySound снова и установить ExcludedSounds кому Domestic animals, pets. Класс звука, Domestic animals, pets является предшественником обоих Bark и Meow, поэтому, исключив его, звуки, ранее идентифицированные как Bark и Meow теперь оба идентифицированы как предшественник Domestic animals, pets, что является Animal.

sounds = classifySound(audioIn,fs,"ExcludedSounds","Domestic animals, pets")
sounds = 1×5 string
    "Stream"    "Machine gun"    "Snoring"    "Animal"    "Animal"

Звонить classifySound снова и установить ExcludedSounds кому Animal. Класс звука Animal не имеет предшественников.

sounds = classifySound(audioIn,fs,"ExcludedSounds","Animal")
sounds = 1×3 string
    "Stream"    "Machine gun"    "Snoring"

Если вы хотите избежать обнаружения Meow и его предшественники, но продолжайте обнаруживать преемников при тех же предшественниках, используйте IncludedSounds вариант. Звонить yamnetGraph для получения списка всех поддерживаемых классов. Удалить Meow и его предшественники из массива всех классов, а затем вызвать classifySound снова.

[~,classes] = yamnetGraph;
classesToInclude = setxor(classes,["Meow","Cat","Domestic animals, pets","Animal"]);
sounds = classifySound(audioIn,fs,"IncludedSounds",classesToInclude)
sounds = 1×4 string
    "Stream"    "Machine gun"    "Snoring"    "Bark"

Считывайте звуковой сигнал и слушайте его.

[audioIn,fs] = audioread('multipleSounds-16-16-mono-18secs.wav');
sound(audioIn,fs)

Звонить classifySound без выходных аргументов для создания облака слов обнаруженных звуков.

classifySound(audioIn,fs);

Изменение параметров по умолчанию classifySound для изучения влияния на облако слов.

threshold = 0.1;
minimumSoundSeparation = 0.92;
minimumSoundDuration = 1.02;

classifySound(audioIn,fs, ...
    'Threshold',threshold, ...
    'MinimumSoundSeparation',minimumSoundSeparation, ...
    'MinimumSoundDuration',minimumSoundDuration);

Входные аргументы

свернуть все

Звуковой вход, определяемый как одноканальный сигнал (вектор столбца).

Типы данных: single | double

Частота дискретизации в Гц, заданная как положительный скаляр.

Типы данных: single | double

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'Threshold',0.1

Порог достоверности для передачи звуков, указанный как пара, разделенная запятыми, состоящая из 'Threshold' и скаляр в диапазоне (0,1).

Типы данных: single | double

Минимальное разделение между последовательными областями одного и того же обнаруженного звука в секундах, указанное как пара, разделенная запятыми, состоящая из 'MinimumSoundSeparation' и положительный скаляр. Области, близкие к минимальному разделению звука, объединяются.

Типы данных: single | double

Минимальная продолжительность обнаруженных областей звука в секундах, указанная как пара, разделенная запятыми, состоящая из 'MinimumSoundDuration' и положительный скаляр. Области короче минимальной длительности звука отбрасываются.

Типы данных: single | double

Звуки для включения в результаты, указанные как разделенная запятыми пара, состоящая из 'IncludedSounds' и символьный вектор, массив ячеек символьных векторов, строковый скаляр или строковый массив. Использовать yamnetGraph для проверки и анализа звуков, поддерживаемых classifySound. По умолчанию включаются все поддерживаемые звуки.

Этот параметр нельзя использовать с 'ExcludedSounds' вариант.

Типы данных: char | string | cell

Звуки для исключения из результатов, указанные как разделенная запятыми пара, состоящая из 'ExcludedSounds' и символьный вектор, массив ячеек символьных векторов, строковый скаляр или строковый массив. При указании исключенного звука исключаются также все его преемники. Использовать yamnetGraph для проверки действительных классов звука и их предшественников и преемников в соответствии с онтологией AudioSet. По умолчанию звуки не исключаются.

Этот параметр нельзя использовать с 'IncludedSounds' вариант.

Типы данных: char | string | cell

Специфичность сообщаемых звуков, определяемая как пара, разделенная запятыми, состоящая из 'SpecificityLevel' и 'high', 'low', или 'none'. Набор SpecificityLevel кому 'high' чтобы функция подчеркивала конкретные классы звука вместо общих категорий. Набор SpecificityLevel кому 'low' чтобы функция возвращала наиболее общие категории звука вместо определенных классов звука. Набор SpecificityLevel кому 'none' чтобы функция возвращала наиболее вероятный звук, независимо от его специфичности.

Типы данных: char | string

Выходные аргументы

свернуть все

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

Метки времени, связанные с обнаруженными звуками в секундах, возвращаются в виде матрицы N-by-2. N - количество обнаруженных звуков. Каждая строка timestamps содержит время начала и окончания обнаруженной звуковой области.

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

  • TimeStamps -- Временные метки, соответствующие каждой анализируемой области.

  • Results -- Таблица с тремя переменными:

    • Sounds - Звуки, обнаруженные в каждом регионе.

    • AverageScores - Средние оценки сети, соответствующие каждому обнаруженному классу звука в регионе.

    • MaxScores - Максимальные оценки сети, соответствующие каждому обнаруженному классу звука в регионе.

Алгоритмы

свернуть все

classifySound функция использует YAMNet для классификации аудиосегментов в классы звука, описанные в онтологии AudioSet. classifySound функция предварительно обрабатывает звук так, чтобы он был в формате, требуемом для YAMNet, и выполняет постобработку прогнозов YAMNet общими задачами, которые делают результаты более интерпретируемыми.

Предварительно обработать

  1. Передискретизировать audioIn до 16 кГц и отливка с единственной точностью.

  2. Буферизация в L перекрывающихся сегментов. Каждый сегмент составляет 0,98 секунды, и сегменты перекрываются на 0,8575 секунды.

  3. Прохождение каждого сегмента через одностороннее короткое преобразование Фурье с использованием 25-миллисекундного периодического окна Ханна с 10-миллисекундным прыжком и 512-точечным DFT. Аудиосигнал теперь представлен 257-by-96-by-L матрицей, где 257 - количество элементов в односторонних спектрах, а 96 - количество элементов в спектрограммах.

  4. Преобразуйте комплексные спектральные значения в величину и отбрасывайте информацию о фазе.

  5. Пропускают односторонний спектр амплитуд через 64-полосный блок фильтров с промежутками, а затем суммируют величины в каждой полосе. Звук теперь представлен 96-by-64-by-1-by-L матрицей, где 96 - количество спектров в спектрограмме mel, 64 - количество полос mel, и теперь спектрограммы разнесены вдоль четвертого размера для совместимости с моделью YAMNet.

  6. Преобразование спектрограмм в логарифмическую шкалу.

Прогноз

Пропустите 96-by-64-by-1-by-L массив спектрограмм mel через YAMNet, чтобы вернуть L-by-521 матрицу. Выходной сигнал от YAMNet соответствует доверительным оценкам для каждого из 521 классов звука с течением времени.

Постпроцесс

Обнаружение области звуковых событий
  1. Пропускают каждый из 521 доверительных сигналов через подвижный средний фильтр с длиной окна 7.

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

  3. Преобразование доверительных сигналов в двоичные маски с использованием указанного Threshold.

  4. Отбрасывать любой звук короче, чем MinimumSoundDuration.

  5. Объединить области, которые ближе, чем MinimumSoundSeparation.

Консолидация перекрывающихся областей звука

Консолидация выявленных звуковых областей, перекрывающихся на 50% или более, в отдельные области. Время начала региона - наименьшее время начала всех звуков в группе. Время окончания области - наибольшее время окончания всех звуков в группе. Функция возвращает временные метки, классы звуков и среднее и максимальное доверие классов звука в пределах области в resultsTable.

Выбор специфичности звуковой группы

Уровень специфичности классификации звука можно задать с помощью SpecificityLevel вариант. Например, предположим, что есть четыре класса звука в звуковой группе со следующими соответствующими средними баллами по звуковой области:

  • Water –– 0.82817

  • Stream –– 0.81266

  • Trickle, dribble –– 0.23102

  • Pour –– 0.20732

Классы звука, Water, Stream, Trickle, dribble, и Pour расположены в онтологии AudioSet, как показано графиком:

Diagram of AudioSet ontology for Water, Stream, Pour, and Trickle, dribble. Stream is a successor of Water which is a successor of Natural sounds. Trickle, dribble is a successor of Pour which is a successor of Liquid which is a successor of Sounds of things.

Функции возвращают класс звука для группы звука в sounds выходной аргумент в зависимости от SpecificityLevel:

  • "high" (по умолчанию) - В этом режиме Stream является предпочтительным для Water, и Trickle, dribble является предпочтительным для Pour. Stream имеет более высокий средний балл по региону, поэтому функция возвращается Stream в sounds выходные данные для региона.

  • "low" - В этом режиме возвращается самая общая онтологическая категория для класса звука с самой высокой средней уверенностью по региону. Для Trickle, dribble и Pour, наиболее общей категорией является Sounds of things. Для Stream и Water, наиболее общей категорией является Natural sounds. Поскольку Water имеет самую высокую среднюю достоверность по звуковой области, функция возвращается Natural sounds.

  • "none" - В этом режиме функция возвращает класс звука с наивысшим средним показателем достоверности, который в данном примере Water.

Ссылки

[1] Gemmeke, Джорт Ф., и др. 2017 IEEE Международная конференция по акустике, обработке речи и сигналов (ICASSP), IEEE, 2017, стр. 776-80. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952261.

[2] Херши, Шон и др. Международная конференция IEEE 2017 по акустике, обработке речи и сигналов (ICASSP), IEEE, 2017, стр. 131-35. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952132.

Представлен в R2020b