主要内容

classifySound

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

描述

例子

听起来= classifySound (audioInfs返回音频输入中随时间推移检测到的声音类,audioIn,样本率fs

例子

听起来= classifySound (audioInfs名称,值使用一个或多个选项指定选项名称,值对参数。

例子:sounds = classifySound(audioIn,fs,' specificlevel ','low')使用低特异性对声音进行分类。

例子

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

例子

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

例子

classifySound (___在没有输出参数的情况下,创建音频信号中已识别声音的词云。

此功能需要音频工具箱™和深度学习工具箱™。

例子

全部折叠

下载并解压缩音频工具箱™YAMNet支持。万博1manbetx

如果没有安装音频工具箱对YAMNet的支持万博1manbetx,则第一次调用该函数将提供到下载位置的链接。要下载模型,请单击链接。将文件解压缩到MATLAB路径上的某个位置。

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

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

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

Fs = 16e3;X = pinknoise(fs);

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

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

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

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

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

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

选择区域,只收听所选区域。

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

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

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

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

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

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

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

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

soundTable
soundTable =5×2表时间戳的结果  ________________ ___________ 0 3.92}{4×3表4.0425 - 6.0025}{3×3表10.658 - 12.373 6.86 - 9.1875{表2×3}}{4×3表12.985 - 16.66{4×3表}

查看最近检测到的区域。

soundTable。结果{end}
ans =4×3表听起来AverageScores MaxScores  ________________________ _____________ _________ " 动物“0.79514 - 0.99941”家畜、宠物“0.80243 - 0.99831”猫喵“0.8048 - 0.99046 0.6342 - 0.90177

调用classifySound再一次。这一次,设置IncludedSounds动物这样函数只保留动物检测到声音类。

[sounds,timeStamps,soundTable] = classifySound(audioIn,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表听起来AverageScores MaxScores  ________________________ _____________ _________ " 动物“0.79514 - 0.99941”家畜、宠物“0.80243 - 0.99831”猫喵“0.8048 - 0.99046 0.6342 - 0.90177

以探索支持哪些声音类万博1manbetxclassifySound,使用yamnetGraph

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

[audioIn,fs] = audioread(“multipleSounds-16-16-mono-18secs.wav”);sounds = classifySound(audioIn,fs)
听起来=1×5弦“流”“机关枪”“打鼾”“吠”“喵”

调用classifySound再次设置ExcludedSounds猫叫为了排除声音猫叫从结果来看。以前分类为猫叫现在被归类为,这是它在AudioSet本体中的直接前身。

sounds = classifySound(audioIn,fs,“ExcludedSounds”“喵喵”
听起来=1×5弦“流”“机关枪”“打鼾”“吠叫”“猫”

调用classifySound再次,设置ExcludedSounds.当你排除一个声音时,所有后继声音也会被排除。这意味着排除声音也排除了声音猫叫.这段最初被分类为猫叫现在被归类为家养动物、宠物的直接前身在AudioSet本体中。

sounds = classifySound(audioIn,fs,“ExcludedSounds”“猫”
听起来=1×5弦“溪流”“机关枪”“打鼾”“吠叫”“家畜,宠物”

调用classifySound再次设置ExcludedSounds家养动物、宠物.声音类,家养动物、宠物是两者的前身吗树皮而且猫叫,所以通过排除它,以前识别的声音树皮而且猫叫现在都被认定为的前身家养动物、宠物,即动物

sounds = classifySound(audioIn,fs,“ExcludedSounds”“家畜、宠物”
听起来=1×5弦“溪流”“机枪”“鼾声”“动物”“动物”

调用classifySound再次设置ExcludedSounds动物.声音类动物没有前人。

sounds = classifySound(audioIn,fs,“ExcludedSounds”“动物”
听起来=1×3的字符串“溪流”“机关枪”“鼾声”

如果你不想被发现猫叫和它的前身,但继续检测在相同的前身下的后继,使用IncludedSounds选择。调用yamnetGraph获取所有受支持类的列表。万博1manbetx删除猫叫并从其前辈数组中取出所有类,然后调用classifySound再一次。

[~,classes] = yamnetGraph;classesToInclude = setxor(类,[“喵喵”“猫”“家畜、宠物”“动物”]);sounds = classifySound(audioIn,fs,“IncludedSounds”classesToInclude)
听起来=1×4弦“溪流”“机关枪”“鼾声”“吠声”

读入一个音频信号,然后听它。

[audioIn,fs] = audioread(“multipleSounds-16-16-mono-18secs.wav”);声音(audioIn fs)

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

classifySound (audioIn fs);

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

阈值=0.1;minimumSoundSeparation =0.92;minimumSoundDuration =1.02;classifySound (audioIn fs,...“阈值”阈值,...“MinimumSoundSeparation”minimumSoundSeparation,...“MinimumSoundDuration”, minimumSoundDuration);

输入参数

全部折叠

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

数据类型:|

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

数据类型:|

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来名字在报价。

例子:“阈值”,0.1

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

数据类型:|

相同检测到的声音的连续区域之间的最小间隔,以秒为单位,指定为逗号分隔的对,由“MinimumSoundSeparation”一个正标量。小于最小声音间隔的区域被合并。

数据类型:|

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

数据类型:|

要包含在结果中的声音,指定为逗号分隔的对,由“IncludedSounds”字符向量,字符向量的单元格数组,字符串标量,或者字符串数组。使用yamnetGraph检查和分析所支持的声音万博1manbetxclassifySound.默认情况下,包括所有支持的声音。万博1manbetx

选项不能与ExcludedSounds选择。

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

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

选项不能与IncludedSounds选择。

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

所报告声音的特异性,由逗号分隔的一对组成“SpecificityLevel”而且“高”“低”,或“没有”.集SpecificityLevel“高”使函数强调特定的声音类别,而不是一般的类别。集SpecificityLevel“低”使函数返回最一般的声音类别,而不是特定的声音类别。集SpecificityLevel“没有”使函数返回最可能的声音,而不考虑其特异性。

数据类型:字符|字符串

输出参数

全部折叠

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

与检测到的声音相关的时间戳,以秒为单位返回N2矩阵。N是检测到的声音的数量。每行时间戳包含被检测声音区域的开始和结束时间。

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

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

  • 结果——有三个变量的表:

    • 听起来——每个区域都检测到声音。

    • AverageScores-与该地区检测到的每个声音类别对应的平均网络分数。

    • MaxScores—区域内每个检测到的声音类别对应的最大网络分数。

算法

全部折叠

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

进行预处理

  1. 重新取样audioIn到16千赫,并铸造到单一精度。

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

  3. 通过使用25 ms周期Hann窗口(具有10 ms跃点和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阵列的mel谱图通过YAMNet返回一个l521年——矩阵。YAMNet的输出与521种声音类别随时间变化的可信度分数相对应。

后处理

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

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

  3. 参数将置信信号转换为二进制掩码阈值

  4. 丢弃任何短于的声音MinimumSoundDuration

  5. 合并比更近的区域MinimumSoundSeparation

巩固重叠的声音区域

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

选择声音组的特异性

属性设置声音分类的特异性级别SpecificityLevel选择。例如,假设在一个声音组中有四个声音类别,它们在声音区域内的平均得分如下:

  • - - -0.82817

  • - - -0.81266

  • 细流,运球- - -0.23102

  • - - -0.20732

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

Water, Stream, Pour和Trickle, dribble的AudioSet本体图。溪流是水的继承者,水是自然声音的继承者。Trickle, dribble是Pour的继承者,Pour是Liquid的继承者,Liquid是Sounds of things的继承者。

类中的声音组的声音类听起来参数SpecificityLevel

  • “高”(默认值)——在此模式下,优先于,细流,运球优先于在这个区域上有更高的平均分,所以函数返回听起来区域的输出。

  • “低”——在此模式下,返回对该区域具有最高平均置信度的声音类的最一般本体论类别。为细流,运球而且,最一般的类别是事物的声音.为而且,最一般的类别是自然的声音.因为有最高的平均置信度在声音区域,函数返回自然的声音

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

参考文献

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

[2] Hershey, Shawn等,“用于大规模音频分类的CNN架构。”2017 IEEE声学、语音和信号处理国际会议(ICASSP)《电子工程学报》,2017,pp. 131-35。DOI.org (Crossref), doi: 10.1109 / ICASSP.2017.7952132。

扩展功能

版本历史

R2020b中介绍