使用深度学习对声音进行分类
这个例子展示了如何使用深度学习过程对声音进行分类。
创建一个数据集
生成1000个白噪声信号,1000个棕色噪声信号,1000个粉色噪声信号。每个信号代表0.5秒的持续时间,假设44.1 kHz的采样率。
fs = 44.1 e3;时间= 0.5;N = * fs持续时间;wNoise = 2*rand([N,1000]) - 1;wLabels = repelem(分类(“白色”), 1000, (1);bNoise =过滤器(1 [-0.999]wNoise);bNoise = bNoise. / max (abs (bNoise), [],“所有”);bLabels = repelem(分类(“棕色”), 1000, (1);pNoise = pinknoise ([N, 1000]);pLabels = repelem(分类(“粉红色”), 1000, (1);
探索数据集
听一个白噪声信号,并将其可视化使用melSpectrogram
函数
。
声音(wNoise (: 1), fs) melSpectrogram (wNoise (: 1), fs)标题(“白噪音”)
检查一个棕色噪声信号。
声音(bNoise (: 1), fs) melSpectrogram (bNoise (: 1), fs)标题(“布朗噪音”)
检查一个粉色噪声信号。
声音(pNoise (: 1), fs) melSpectrogram (pNoise (: 1), fs)标题(“粉红噪声”)
将数据集分为训练集和验证集
创建一个由800个白噪声信号、800个棕色噪声信号和800个粉色噪声信号组成的训练集。
audioTrain = [wNoise (:, 1:800), bNoise (:, 1:800) pNoise (:, 1:800)];labelsTrain = [wLabels (1:800); bLabels (1:800); pLabels (1:800)];
使用剩下的200个白噪声信号、200个棕色噪声信号和200个粉色噪声信号创建一个验证集。
audioValidation = [wNoise(:, 801:结束),bNoise(:, 801:结束),pNoise(:, 801:结束)];labelsValidation = [wLabels(801:结束);bLabels(801:结束);pLabels(801:结束)];
提取的特征
音频数据是高度维数的,通常包含冗余信息。你可以通过先提取特征,然后用提取出来的特征训练你的模型来降低维数。创建一个audioFeatureExtractor
对象提取MEL谱随时间变化的质心和斜率。
aFE = audioFeatureExtractor (“SampleRate”fs,…“SpectralDescriptorInput”,“melSpectrum”,…“spectralCentroid”,真的,…“spectralSlope”,真正的);
呼叫extract,从音频训练数据中提取特征。
audioTrain featuresTrain =提取(aFE);[numHopsPerSequence, numFeatures numSignals] =大小(featuresTrain)
numHopsPerSequence = 42
numFeatures = 2
numSignals = 2400
在下一步,你将把提取的特征作为序列,并使用sequenceInputLayer
作为深度学习模型的第一层。当你使用sequenceInputLayer
作为网络的第一层,trainNetwork
期望训练和验证数据被格式化为序列的单元格数组,其中每个序列由随时间变化的特征向量组成。sequenceInputLayer
要求时间维度沿着二次元。
featuresTrain =排列(featuresTrain (2, 1, 3));featuresTrain =挤压(num2cell (featuresTrain [1, 2]));numSignals =元素个数(featuresTrain)
numSignals = 2400
[numFeatures, numHopsPerSequence] =大小(featuresTrain {1})
numFeatures = 2
numHopsPerSequence = 42
提取验证特征。
audioValidation featuresValidation =提取(aFE);featuresValidation =排列(featuresValidation (2, 1, 3));featuresValidation =挤压(num2cell (featuresValidation [1, 2]));
,定义和训练网络
定义网络架构。看到深度学习层列表(深度学习工具箱)为更多的信息。
层= […sequenceInputLayer numFeatures lstmLayer (50,“OutputMode”,“最后一次”) fullyConnectedLayer(numel(unique(labelsTrain))) softmaxLayer classificationLayer];
要定义培训选项,请使用trainingOptions
(深度学习工具箱)。
选择= trainingOptions (“亚当”,…“洗牌”,“every-epoch”,…“ValidationData”{featuresValidation, labelsValidation},…“阴谋”,“训练进步”,…“详细”、假);
训练网络,使用trainNetwork
(深度学习工具箱)。
网= trainNetwork (featuresTrain、labelsTrain层,选择);
测试网络
使用训练过的网络对新的白噪声、棕噪声、粉噪声信号进行分类。
wNoiseTest = 2*rand([N,1]) - 1;分类(净,提取(aFE wNoiseTest) ')
ans =分类白色
bNoiseTest =过滤器(1 [-0.999]wNoiseTest);bNoiseTest = bNoiseTest. / max (abs (bNoiseTest), [],“所有”);分类(净,提取(aFE bNoiseTest) ')
ans =分类棕色(的)
pNoiseTest = pinknoise (N);分类(净,提取(aFE pNoiseTest) ')
ans =分类粉红色的
另请参阅
audioFeatureExtractor
|audioDataAugmenter
|audioDatastore
|信号贴标签机