主要内容

classifySound

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

描述

例子

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

例子

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

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

例子

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

例子

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

例子

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

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

例子

全部折叠

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

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

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

downloadFolder = fullfile (tempdir,“YAMNetDownload”);loc = websave (downloadFolder,“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 (“multipleSounds-16-16-mono-18secs.wav”);(声音、时间戳)= 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), 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与音频信号和采样率。

(声音,~,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动物所以这个函数只保留了动物检测到声音类。

(声音、时间戳、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

来研究支持哪些声音类金宝appclassifySound,使用yamnetGraph

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

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

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

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

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

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

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

听起来= classifySound (audioIn fs,“ExcludedSounds”“国内的动物,宠物”
听起来=1×5弦“流水”“机关枪”“打呼噜”“动物”“动物”

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

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

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

(~、类)= yamnetGraph;classesToInclude = setxor(类,“喵喵”“猫”“国内的动物,宠物”“动物”]);听起来= 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,…,的家

例子:“阈值”,0.1

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

数据类型:|

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

数据类型:|

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

数据类型:|

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

该选项不能与ExcludedSounds选择。

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

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

该选项不能与IncludedSounds选择。

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

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

数据类型:字符|字符串

输出参数

全部折叠

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

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

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

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

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

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

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

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

算法

全部折叠

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

进行预处理

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

  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. 丢弃任何短于MinimumSoundDuration

  5. 合并距离小于MinimumSoundSeparation

巩固重叠声区

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

选择声音组的特异性

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

  • - - -0.82817

  • - - -0.81266

  • 细流,运球- - -0.23102

  • - - -0.20732

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

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

类中的声音组返回声音类听起来的输出参数SpecificityLevel

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

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

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

参考文献

[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