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