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(___) без выходных аргументов создает облако слова идентифицированных звуков в звуковом сигнале.

Эта функция требует и Audio 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));
звук (isolatedSoundEvent, фс);
отображение'Detected Sound = ' + звуки (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, фс, ...
    '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. Передайте каждый сегмент через одностороннее кратковременное преобразование Фурье с помощью периодического окна Hann на 25 мс с транзитным участком на 10 мс и ДПФ с 512 точками. Аудио теперь представлено 257 96 L массивом, где 257 количество интервалов в односторонних спектрах, и 96 количество спектров в спектрограммах.

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

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

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

Предсказание

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

Постобработать

Звуковое обнаружение области события
  1. Передайте каждый из 521 сигнала доверия через фильтр скользящего среднего значения с длиной окна 7.

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

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

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

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

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

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

Выберите Specificity of Sound Group

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

  • Water–– 0.82817

  • Stream–– 0.81266

  • Trickle, dribble–– 0.23102

  • Pour–– 0.20732

Звуковые классы, Waterпоток , 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 в sounds выведите для области.

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

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

Ссылки

[1] Gemmeke, Джорт Ф., и др. “Аудио Набор: Онтология и Помеченный Человеком Набор данных для Аудио Событий”. 2 017 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), IEEE, 2017, стр 776–80. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952261.

[2] Херши, Шон, и др. “Архитектуры CNN для Крупномасштабной Аудио Классификации”. 2 017 Международных конференций IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP), IEEE, 2017, стр 131–35. DOI.org (Crossref), doi:10.1109/ICASSP.2017.7952132.

Смотрите также

| | | |

Введенный в R2020b