classifySound
对音频信号中的声音进行分类
语法
描述
[
还返回一个包含结果详细信息的表。听起来
,时间戳
,resultsTable
= classifySound(___)
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”))
及时识别和定位声音
读入音频信号。调用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弦“溪流”“机关枪”“鼾声”“吠声”
生成Word云
读入一个音频信号,然后听它。
[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);
输入参数
audioIn
- - - - - -音频输入
列向量
音频输入,指定为单通道信号(列向量)。
数据类型:单
|双
fs
- - - - - -采样率(Hz)
积极的标量
采样率(以Hz为单位),指定为正标量。
数据类型:单
|双
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
在R2021a之前,使用逗号分隔每个名称和值,并将其括起来名字
在报价。
例子:“阈值”,0.1
阈值
- - - - - -报告声音的置信阈值
0.35
(默认)|在(0,1)范围内的标量
报告声音的置信阈值,指定为由逗号分隔的对组成“阈值”
和范围(0,1)中的标量。
数据类型:单
|双
MinimumSoundSeparation
- - - - - -探测到的声音区域之间的最小间隔(s)
0.25
(默认)|积极的标量
相同检测到的声音的连续区域之间的最小间隔,以秒为单位,指定为逗号分隔的对,由“MinimumSoundSeparation”
一个正标量。小于最小声音间隔的区域被合并。
数据类型:单
|双
MinimumSoundDuration
- - - - - -检测到的声音区域最短持续时间(秒)
0.5
(默认)|积极的标量
检测到的声音区域的最小持续时间(以秒为单位),指定为逗号分隔的对,由“MinimumSoundDuration”
一个正标量。小于最小声音持续时间的区域将被丢弃。
数据类型:单
|双
IncludedSounds
- - - - - -在结果中包含声音
特征向量|字符向量的单元格数组|字符串标量|字符串数组
要包含在结果中的声音,指定为逗号分隔的对,由“IncludedSounds”
字符向量,字符向量的单元格数组,字符串标量,或者字符串数组。使用yamnetGraph
检查和分析所支持的声音万博1manbetxclassifySound
.默认情况下,包括所有支持的声音。万博1manbetx
选项不能与'
选择。ExcludedSounds
'
数据类型:字符
|字符串
|细胞
ExcludedSounds
- - - - - -从结果中排除声音
特征向量|字符向量的单元格数组|字符串标量|字符串数组
要从结果中排除的声音,指定为逗号分隔的对,由“ExcludedSounds”
字符向量,字符向量的单元格数组,字符串标量,或者字符串数组。当指定一个排除音时,该排除音的任何后继音也将被排除。使用yamnetGraph
根据AudioSet本体检查有效的声音类及其前身和后继类。默认情况下,不排除任何声音。
选项不能与'
选择。IncludedSounds
'
数据类型:字符
|字符串
|细胞
SpecificityLevel
- - - - - -报告声音的特异性
“高”
(默认)|“低”
|“没有”
所报告声音的特异性,由逗号分隔的一对组成“SpecificityLevel”
而且“高”
,“低”
,或“没有”
.集SpecificityLevel
来“高”
使函数强调特定的声音类别,而不是一般的类别。集SpecificityLevel
来“低”
使函数返回最一般的声音类别,而不是特定的声音类别。集SpecificityLevel
来“没有”
使函数返回最可能的声音,而不考虑其特异性。
数据类型:字符
|字符串
输出参数
听起来
-音频输入中随时间推移检测到的声音
字符串数组
音频输入中随时间推移检测到的声音,以包含按时间顺序检测到的声音的字符串数组返回。
时间戳
-与检测到的声音相关的时间戳
N2矩阵
与检测到的声音相关的时间戳,以秒为单位返回N2矩阵。N是检测到的声音的数量。每行时间戳
包含被检测声音区域的开始和结束时间。
resultsTable
-声音分类的详细结果
表格
声音分类的详细结果,以表格形式返回。表中的行数等于检测到的声音区域的数量。各列如下。
时间戳
——每个分析区域对应的时间戳。结果
——有三个变量的表:听起来
——每个区域都检测到声音。AverageScores
-与该地区检测到的每个声音类别对应的平均网络分数。MaxScores
—区域内每个检测到的声音类别对应的最大网络分数。
算法
的classifySound
函数使用YAMNet将音频片段分类为AudioSet本体描述的声音类。的classifySound
函数对音频进行预处理,使其符合YAMNet所要求的格式,并使用常见任务对YAMNet的预测进行后处理,使结果更具可解释性。
进行预处理
重新取样
audioIn
到16千赫,并铸造到单一精度。缓冲到l重叠的部分。每个片段为0.98秒,片段重叠0.8575秒。
通过使用25 ms周期Hann窗口(具有10 ms跃点和512点DFT)对每个片段进行单边短时傅里叶变换。音频现在由257 × 96 × -表示l数组,其中257是单侧光谱中的箱数,96是谱图中的光谱数。
将复杂光谱值转换为幅度并丢弃相位信息。
将单侧的幅度谱通过64带梅尔间隔滤波器组,然后将每个波段的幅度相加。音频现在由96 × 64 × 1 × -表示l数组,其中96是mel谱图中的光谱数量,64是mel波段的数量,频谱图现在沿着第四维间隔,以便与YAMNet模型兼容。
将mel谱图转换为对数刻度。
预测
传递96 × 64 × 1 × -l阵列的mel谱图通过YAMNet返回一个l521年——矩阵。YAMNet的输出与521种声音类别随时间变化的可信度分数相对应。
后处理
将521个置信度信号中的每一个都通过一个窗口长度为7的移动均值滤波器。
将每个信号通过窗口长度为3的移动中值滤波器。
参数将置信信号转换为二进制掩码
阈值
.丢弃任何短于的声音
MinimumSoundDuration
.合并比更近的区域
MinimumSoundSeparation
.
将已识别的重叠50%或以上的声音区域合并为单个区域。区域开始时间是组中所有声音中最小的开始时间。区域结束时间是组中所有声音的最大结束时间。函数返回时间戳、声音类以及区域内声音类的平均值和最大置信度resultsTable
.
属性设置声音分类的特异性级别SpecificityLevel
选择。例如,假设在一个声音组中有四个声音类别,它们在声音区域内的平均得分如下:
水
- - -0.82817
流
- - -0.81266
细流,运球
- - -0.23102
倒
- - -0.20732
声音类,水
,流
,细流,运球
,倒
都位于AudioSet本体中,如图所示:
类中的声音组的声音类听起来
参数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。
扩展功能
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
本功能完全支持GPU阵列。万博1manbetx有关更多信息,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).
版本历史
R2020b中介绍
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。万博1manbetx
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。