主要内容

classifySound

对音频信号中的声音进行分类

描述

例子

听起来=分类声音(音频素fs返回音频输入中随时间检测到的声音等级,音频素,以抽样率fs

例子

听起来=分类声音(音频素fs名称,值指定使用一个或多个选项的选项名称,值对参数。

例子:听起来= classifySound (audioIn、fs“SpecificityLevel”,“低”)使用低特异性对声音进行分类。

例子

听起来时间戳) = classifySound (___还返回与每个检测到的声音相关联的时间戳。

例子

听起来时间戳结果表) = classifySound (___还返回一个包含结果详细信息的表。

例子

分类声音(___如果没有输出参数,则在音频信号中创建一个识别声音的词云。

此函数需要音频和音频™ 深度学习工具箱™.

例子

全部折叠

下载并解压缩音频工具箱™对YAMNet的支持。金宝app

如果没有安装对YAMNet的Audio T金宝appoolbox支持,那么对该函数的第一次调用将提供到下载位置的链接。要下载模型,请单击链接。解压文件到MATLAB路径上的一个位置。

或者,执行以下命令将YAMNet模型下载并解压缩到临时目录。

downloadFolder = fullfile (tempdir,“YAMNetDownload”); loc=websave(下载文件夹,“https://ssd.mathworks.com/金宝appsupportfiles/audio/yamnet.zip”);YAMNetLocation = tempdir;YAMNetLocation解压(loc)目录(fullfile (YAMNetLocation,“yamnet”))

假设采样率为16khz,生成1秒的粉色噪声。

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

调用classifySound用粉色噪声信号和采样率。

identifiedSound = classifySound (x, fs)
identifiedSound = "粉红噪音"

读入音频信号。调用classifySound返回检测到的声音和相应的时间戳。

[audioIn, fs] = audioread (“多路音频-16-16-mono-18秒波形”);(声音、时间戳)= classifySound (audioIn fs);

绘制音频信号并标记检测到的声音区域。

t =(0:元素个数(audioIn) 1) / fs;情节(t, audioIn)包含(“时间(s)”)轴([t(1),t(end),-1,1]) textHeight = 1.1;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);文本(时间戳(idx,1),文本高度+0.05*(-1)^idx,声音(idx))结束

选择一个区域并仅收听所选区域。

sampleStamps =地板(时间戳* fs) + 1;soundEvent =3.;isolatedSoundEvent = audioIn (sampleStamps (soundEvent 1): sampleStamps (soundEvent 2));声音(isolatedSoundEvent, fs);显示器('检测到的声音= '+声音(soundEvent))
“检测到的声音=打鼾”

读入包含多个不同声音事件的音频信号。

[audioIn, fs] = audioread (“多路音频-16-16-mono-18秒波形”);

调用classifySound与音频信号和采样率。

(声音,~,soundTable) = classifySound (audioIn fs);

听起来字符串数组包含每个区域中最可能的声音事件。

听起来
听起来=1×5弦“流”“机枪”“打鼾”“吠叫”“喵喵”

soundTable包含关于在每个区域检测到的声音的详细信息,包括分析信号的得分均值和最大值。

soundTable
soundTable =5×2表时间戳结果{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu0 3.92{4×3表}4.0425 6.0025{3×3表}6.86 9.1875{2×3表}10.65812.373{4×3表}12.98516.66{4×3表}

查看上次检测到的区域。

soundTable。结果{end}
ans=4×3表声音平均得分最高0.79514 0.99941“家畜、宠物”0.80243 0.99831“猫”0.8048 0.99046“喵喵”0.639042

调用classifySound一次。这一次,IncludedSounds动物所以这个函数只保留了动物检测到声音类。

[声音,时间戳,声音表]=classifySound(音频输入,fs,...“IncludedSounds”“动物”);

声音数组仅返回指定为包含的声音听起来数组现在包含两个实例动物对应于声明为吠叫猫叫之前。

听起来
听起来=1×2字符串“动物”“动物”

声音表仅包括检测到指定声音类别的区域。

soundTable
soundTable =2×2表时间戳的结果  ________________ ___________ 12.985 - 16.66 10.658 - 12.373{4×3桌}{4×3表}

中最后检测到的区域soundTable.结果表仍然包含该区域中所有检测到的声音的统计数据。

soundTable。结果{end}
ans=4×3表声音平均得分最高0.79514 0.99941“家畜、宠物”0.80243 0.99831“猫”0.8048 0.99046“喵喵”0.639042

探索受支持的声音类金宝appclassifySound,使用yamnetGraph

读入音频信号并呼叫classifySound检查按探测时间顺序排列的最可能的声音。

[audioIn, fs] = audioread (“多路音频-16-16-mono-18秒波形”);听起来= classifySound (audioIn fs)
听起来=1×5弦“流”“机枪”“打鼾”“吠叫”“喵喵”

调用classifySound再接再厉ExcludedSounds猫叫排除声音猫叫从结果。之前分类为猫叫现在被归类为,这是它在AudioSet本体中的直接前身。

听起来= classifySound (audioIn fs,“排除声音”“喵喵”
听起来=1×5弦“流”“机枪”“打鼾”“吠叫”“猫”

调用classifySound再次,ExcludedSounds.当您排除一个声音时,所有后继者也将被排除。这意味着排除声音也不包括声音猫叫.原分类为猫叫现在被归类为家畜、宠物的直接前身在AudioSet本体中。

听起来= classifySound (audioIn fs,“排除声音”“猫”
听起来=1×5弦“流水”“机关枪”“打呼”“吠叫”“家畜、宠物”

调用classifySound再接再厉ExcludedSounds家畜、宠物.声音课,家畜、宠物是两者的前身吗吠叫猫叫,所以通过排除它,之前被识别为吠叫猫叫现在都被认为是家畜、宠物,即动物

听起来= classifySound (audioIn fs,“排除声音”“国内的动物,宠物”
听起来=1×5弦“流”“机枪”“打鼾”“动物”“动物”

调用classifySound再接再厉ExcludedSounds动物.声音类动物没有前辈。

听起来= classifySound (audioIn fs,“排除声音”“动物”
听起来=1×3的字符串“流水”“机关枪”“鼾声”

如果你想避免被发现猫叫和它的前辈,但继续检测相同前辈下的后辈,使用IncludedSounds选择权yamnetGraph获取所有受支持类的列表。金宝app删除猫叫和它的前任类数组中的所有类,然后调用classifySound一次。

(~、类)= yamnetGraph;classesToInclude = setxor(类,“喵喵”“猫”“国内的动物,宠物”“动物”]);听起来= classifySound (audioIn fs,“IncludedSounds”classesToInclude)
听起来=1×4串“流水”“机关枪”“打鼾”“吠叫”

读入音频信号并收听。

[audioIn, fs] = audioread (“多路音频-16-16-mono-18秒波形”); 声音(音频输入,fs)

调用classifySound没有输出参数来生成检测到的声音的字云。

classifySound (audioIn fs);

修改的默认参数classifySound探究对词云的影响。

门槛=0.1;minimumSoundSeparation =0.92;minimumSoundDuration =1.02;classifySound (audioIn fs,...“门槛”阈值,...“最小声音间隔”minimumSoundSeparation,...“MinimumSoundDuration”, minimumSoundDuration);

输入参数

全部折叠

音频输入,指定为单通道信号(列向量)。

数据类型:单一的|双重的

采样率(Hz),指定为正标量。

数据类型:单一的|双重的

名称-值对的观点

指定可选的逗号分隔的对名称,值参数。名称参数名和价值为对应值。名称必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:“阈值”,0.1

报告声音的置信阈值,指定为逗号分隔对,由“门槛”和(0,1)范围内的标量。

数据类型:单一的|双重的

同一探测声音的连续区域之间以秒为单位的最小间隔,指定为逗号分隔的对“最小声音间隔”和一个正标量。比最小声音间隔更近的区域被合并。

数据类型:单一的|双重的

检测到的声音区域的最小持续时间(秒),指定为逗号分隔对,由“MinimumSoundDuration”一个正标量。小于最小持续时间的区域将被丢弃。

数据类型:单一的|双重的

要包含在结果中的声音,指定为逗号分隔对,由“IncludedSounds”以及字符向量、字符向量的单元数组、字符串标量或字符串数组。使用yamnetGraph检查和分析所支持的声音金宝appclassifySound.默认情况下,包括所有支持的声音。金宝app

该选项不能与ExcludedSounds选择。

数据类型:字符|一串|细胞

要从结果中排除的声音,指定为逗号分隔的对,由“ExcludedSounds”和字符向量、字符向量的单元格数组、字符串标量或字符串数组。指定排除的声音时,排除声音的任何后续声音也被排除。使用yamnetGraph根据AudioSet本体检查有效的声音类及其前辈和后辈。默认情况下,不排除任何声音。

该选项不能与IncludedSounds选择。

数据类型:字符|一串|细胞

报告声音的特异性,指定为逗号分隔对,包括“SpecificityLevel”“高”“低”“没有”.集具体水平“高”使功能强调特定的声音类而不是一般的类别。集具体水平“低”使函数返回最一般的声音类别,而不是特定的声音类。集具体水平“没有”使函数返回最可能的声音,而不考虑其特殊性。

数据类型:字符|一串

输出参数

全部折叠

在音频输入中随时间检测到的声音,以字符串数组的形式返回,该字符串数组按时间顺序包含检测到的声音。

与检测到的声音相关联的时间戳(以秒为单位),以N-by-2矩阵。N是检测到的声音数。每行时间戳包含检测到的声音区域的开始和结束时间。

声音分类的详细结果,以表格的形式返回。表中的行数等于检测到的声音区域的数量。列如下所示。

  • 时间戳–对应于每个分析区域的时间戳。

  • 结果–包含三个变量的表格:

    • 声音–在每个区域检测到声音。

    • AverageScores—区域内每个检测到的声音类对应的平均网络分数。

    • 马克斯考尔斯—区域中每个检测到的声音类对应的最大网络分数。

算法

全部折叠

classifySound函数使用YAMNet将音频片段分类为AudioSet本体所描述的声音类。的classifySound函数对音频进行预处理,使其符合YAMNet要求的格式,并使用使结果更易于解释的常见任务对YAMNet的预测进行后处理。

进行预处理

  1. 重采样音频素至16 kHz,并转换为单精度。

  2. 缓冲到l重叠的部分。每个片段为0.98秒,片段重叠0.8575秒。

  3. 通过一个单边短时间傅里叶变换每个片段使用一个25毫秒周期Hann窗口10毫秒跳和512点DFT。音频现在由257 × 96 × -表示l其中257为单侧光谱中的箱数,96为谱图中的光谱数。

  4. 将复光谱值转换为幅值并丢弃相位信息。

  5. 将单边幅度谱通过一个64波段的熔体间隔滤波器组,然后对每个波段的幅度求和。音频现在用96 × 64 × 1 ×l其中96是mel谱图中的光谱数目,64是mel波段的数目,为了与YAMNet模型兼容,这些谱图现在沿着第四维进行间隔。

  6. 将mel光谱图转换为对数刻度。

预测

通过96 - 64 - 1 - - - - - - -l通过YAMNet的mel光谱图数组返回l521年——矩阵。YAMNet的输出对应于每个521个声音类随时间变化的置信度得分。

后处理

声音事件区域检测
  1. 将521个置信度信号中的每一个通过窗长为7的移动平均滤波器。

  2. 将每个信号通过窗长为3的移动中值滤波器。

  3. 使用指定的参数将置信度信号转换为二进制掩码门槛

  4. 丢弃任何短于最小持续时间

  5. 合并距离小于最小声分离

合并重叠的声音区域

将已识别的重叠50%或更多的声音区域合并为单个区域。区域开始时间是组内所有声音中最小的开始时间。区域结束时间是组内所有声音中最大的结束时间。函数返回时间戳、声音类以及区域内声音类的平均置信度和最大置信度结果表

选择声音组的特异性

属性可以设置声音分类的特异性级别具体水平选择。例如,假设在一个声音组中有四个声音类,它们在声音区域的平均分数如下:

  • ––0.82817

  • ––0.81266

  • 细流,运球––0.23102

  • ––0.20732

声音类,细流,运球,位于AudioSet本体中,如图所示:

水、流、倒和滴流、滴流的AudioSet本体图。小溪是水的继承者,水是自然声音的继承者。涓涓细流是Pour的继承者,Pour是Liquid的继承者,Liquid是Sounds of things的继承者。

类中的声音组返回声音类听起来的输出参数具体水平

  • “高”(默认)——在此模式下,是首选,细流,运球是首选在区域上的平均分数更高,那么函数返回听起来该区域的产出。

  • “低”—在此模式中,返回对区域具有最高平均置信度的声音类的最一般的本体论类别。为细流,运球,最普遍的类别是声音的东西对于,最普遍的类别是自然的声音.因为在声音区域上具有最高的平均置信度,则函数返回自然的声音

  • “没有”——在此模式下,函数返回具有最高平均置信度的声音类,在本例中为

参考文献

[1] Gemmeke, Jort F., et al. <音频集:用于音频事件的本体和人类标记数据集>。2017 IEEE声学、语音和信号处理国际会议(ICASSP), IEEE, 2017, pp. 776-80。DOI.org (Crossref), doi: 10.1109 / ICASSP.2017.7952261。

Hershey, Shawn, et al. < CNN大规模音频分类架构>。2017 IEEE声学、语音和信号处理国际会议(ICASSP), IEEE, 2017,第131-35页。DOI.org (Crossref), doi: 10.1109 / ICASSP.2017.7952132。

介绍了R2020b