主要内容

深層学習を使用した音声コマンド認識モデルの学習

この例では,オ,ディオに存在する音声コマンドを検出する深層学習モデルに学習させる方法を説明します。この例では,语音命令数据集[1]を使用して,一連のコマンドを認識する畳み込みニュ,ラルネットワ,クに学習させます。

事前学習済みの音声コマンド認識システムを使用する方法にいては,基于深度学习的语音指令识别(音频工具箱)を参照してください。

この例を短時間で実行するには,speedupExample真正的に設定します。公開されている例をすべて実行するには,speedupExampleに設定します。

speedupExample =

正確に再現できるように,乱数シ,ドを設定します。

rng默认的

デ,タの読み込み

この例では,谷歌语音命令数据库[1]を使用します。デ,タセットをダウンロ,ドして解凍します。

downloadFolder = matlab.internal.examples.download金宝appSupportFile(“音频”“google_speech.zip”);dataFolder = tempdir;unzip(下载文件夹,数据文件夹)dataset = fullfile(数据文件夹,数据文件夹)“google_speech”);

デ,タの拡張

このネットワークは,発声されたさまざまな単語を認識できるだけでなく,オーディオ入力が無音部分またはバックグラウンドノイズであるかどうかを検出できなければなりません。

サポ,ト関数augmentDatasetは,谷歌语音命令データセットの背景フォルダーにある長時間のオーディオファイルを使用して,バックグラウンドノイズから成る1秒間のセグメントを作成します。この関数は,各バックグラウンドノイズファイルから同じ数のバックグラウンドセグメントを作成し,それらのセグメントを学習フォルダーと検証フォルダーに分割して格納します。

augmentDataset(数据集)
Progress = 17 (%) Progress = 33 (%) Progress = 50 (%) Progress = 67 (%) Progress = 83 (%) Progress = 100 (%)

学習デ,タストアの作成

学習デ,タセットを指すaudioDatastore(音频工具箱)を作成します。

ads = audioDatastore(fullfile(dataset,“训练”),...IncludeSubfolders = true,...FileExtensions =“wav”...LabelSource =“foldernames”);

モデルにコマンドとして認識させる単語を指定します。コマンドまたはバックグラウンドノ▪▪ズではないすべてのファ▪▪ルに未知的とラベル付けします。コマンドではない単語に未知的とラベル付けすることで,コマンド以外のすべての単語の分布に近い単語のグル,プが作成されます。ネットワ,クは,このグル,プを使用して,コマンドと他のすべての単語の違いを学習します。

既知の単語と未知の単語の間でクラスの不均衡を減らし,処理を高速化するために,未知の単語の一部のみを学習セットに含めます。

子集(音频工具箱)を使用して,コマンド,バックグラウンドノイズ,および不明な単語のサブセットのみが含まれるデータストアを作成します。各カテゴリに属している例の数をカウントします。

命令= category ([“是的”“不”《飞屋环游记》“向下”“左”“正确”“上”“关闭”“停止”“走”]);背景=分类的(“背景”);isCommand = ismember(ads.Labels,commands);isBackground = ismember(ads.Labels,background);isUnknown = ~(isCommand|isBackground);includeffraction = 0.2;%要包含的未知数的百分比。idx = find(isUnknown);idx = idx(randperm(数字(idx),round((1- includeffraction)*sum(isUnknown))));isUnknown(idx) = false;ads.Labels(isUnknown) =分类的(“未知”);adsTrain =子集(ads,isCommand|isUnknown|isBackground);adsTrain。标签= remove (adsTrain.Labels);

検証デ,タストアの作成

検証デ,タセットを指すaudioDatastore(音频工具箱)を作成します。学習デ,タストアの作成に用いたのと同じ手順に従います。

ads = audioDatastore(fullfile(dataset,“确认”),...IncludeSubfolders = true,...FileExtensions =“wav”...LabelSource =“foldernames”);isCommand = ismember(ads.Labels,commands);isBackground = ismember(ads.Labels,background);isUnknown = ~(isCommand|isBackground);includeffraction = 0.2;%要包含的未知数的百分比。idx = find(isUnknown);idx = idx(randperm(数字(idx),round((1- includeffraction)*sum(isUnknown))));isUnknown(idx) = false;ads.Labels(isUnknown) =分类的(“未知”);adsValidation =子集(ads,isCommand|isUnknown|isBackground);adsValidation。标签= removecats(adsValidation.Labels);

学習ラベルと検証ラベルの分布を表示します。

图(单位=“归一化”,Position=[0.2,0.2,0.5,0.5]) tiledlayout(2,1) nexttile直方图(adsTrain.Labels) title(“培训标签发放”) ylabel (“观察次数”网格)nexttile直方图(adsValidation.Labels)“验证标签分发”) ylabel (“观察次数”网格)

必要であれば,デ,タセットを小さくして,この例の実行を高速化します。

如果speedupExample numUniqueLabels = numel(unique(adsTrain.Labels));% #好< UNRCH >将数据集减少20倍adsTrain = splitEachLabel(adsTrain,round(numel(adsTrain. files) / numUniqueLabels / 20));adsValidation = splitEachLabel(adsValidation,round(numel(adsValidation. files) / numUniqueLabels / 20));结束

学習用デ,タの準備

畳み込みニューラルネットワークの学習を効果的に行うためにデータを準備するには,音声波形を聴覚ベースのスペクトログラムに変換します。

処理を高速化するには,複数のワ,カ,に特徴量抽出を分散します。并行计算工具箱™を利用できる場合は,並列プールを起動します。

如果useparallelpool && ~speedupExample useParallel = true;gcp;其他的useParallel = false;结束
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数:6)。

特徴量の抽出

オ,ディオ入力から聴覚スペクトログラムを抽出するパラメ,タ,を定義します。segmentDurationは各音声クリップの長さ(秒)です。frameDurationはスペクトル計算の各フレ,ムの長さです。hopDurationは各スペクトル間のタ@ @ムステップです。numBandsは聴覚スペクトログラムのフィルタ,数です。

Fs = 16e3;%数据集的已知抽样率。segmentDuration = 1;frameDuration = 0.025;hopDuration = 0.010;FFTLength = 512;numBands = 50;segmentSamples = round(segmentDuration*fs);frameSamples = round(frameDuration*fs);hopSamples = round(hopDuration*fs);overlapSamples = framessamples - hopSamples;

audioFeatureExtractor(音频工具箱)オブジェクトを作成して特徴量抽出を実行します。

afe = audioFeatureExtractor(...SampleRate = fs,...FFTLength = FFTLength,...窗口=损害(frameSamples,“周期”),...OverlapLength = overlapSamples,...barkSpectrum = true);setExtractorParameters (afe“barkSpectrum”NumBands = NumBands WindowNormalization = false);

長さが等しくなるようにオ,ディオをパディングするため一連の变换(音频工具箱)audioDatastore(音频工具箱)で定義し,特徴量を抽出してから,対数を適用します。

transform1 = transform(adsTrain,@(x)[零(地板((segmentSamples-size(x,1))/2),1);x;零(ceil((segmentSamples-size(x,1))/2),1)]);Transform2 = transform(transform1,@(x)extract(afe,x));Transform3 = transform(transform2,@(x){log10(x+1e-6)});

関数readall(音频工具箱)を使用して,デ,タストアからすべてのデ,タを読み取ります。ファ@ @ルが読み取られるたびに,変換が実行されてからデ@ @タが返されます。

XTrain = readall(transform3,UseParallel= UseParallel);

出力はnumFiles行1列のcell配列です。细胞配列の各要素は,细胞ファ,细胞ルから抽出された聴覚スペクトログラムに対応します。

numFiles = nummel (XTrain)
numFiles = 28463
[numHops,numBands,numChannels] = size(XTrain{1})
numHops = 98
numBands = 50
numChannels = 1

Cell配列を変換し,4番目の次元に聴覚スペクトログラムをも4次元配列にします。

XTrain = cat(4,XTrain{:});[numHops,numBands,numChannels,numFiles] = size(XTrain)
numHops = 98
numBands = 50
numChannels = 1
numFiles = 28463

検証セットに対して,上記で説明した特徴量抽出の手順を実行します。

transform1 = transform(adsValidation,@(x)[零(地板((segmentSamples-size(x,1))/2),1);x;零(ceil((segmentSamples-size(x,1))/2),1)]);Transform2 = transform(transform1,@(x)extract(afe,x));Transform3 = transform(transform2,@(x){log10(x+1e-6)});XValidation = readall(transform3,UseParallel= UseParallel);XValidation = cat(4,XValidation{:});

便宜上,学習タ,ゲットラベルと検証タ,ゲットラベルを分離します。

TTrain = adsTrain.Labels;TValidation = adsValidation.Labels;

デ,タの可視化

いくいて波形と聴覚スペクトログラムをプロットします。対応するオ,ディオクリップを再生します。

specMin = min(XTrain,[],“所有”);specMax = max(XTrain,[],“所有”);idx = randperm(numel(adsTrain.Files),3);图(单位=“归一化”位置= (0.2,0.2,0.6,0.6));tiledlayout(2、3)ii = 1:3 [x,fs] = audioread(adsTrain.Files{idx(ii)});Nexttile (ii) plot(x)轴title(string(adsTrain.Labels(idx(ii)))) nexttile(ii+3) spect = XTrain(:,:,1,idx(ii)))';pcolor(spect) clim([specMin specMax])着色声音(x, fs)暂停(2)结束

ネットワ,クア,キテクチャの定義

シンプルなネットワ,クア,キテクチャを層の配列として作成します。畳み込み層とバッチ正規化層を使用します。最大プーリング層を使って特徴マップを“空間的に”(つまり,時間と周波数に関して)ダウンサンプリングします。入力の特徴マップを時間の経過と共にグロ,バルにプ,リングする最後の最大プ,リング層を追加します。これによって(近似的な)時間並進不変性が入力スペクトログラムに課されるため,ネットワークは,音声の正確な時間的位置とは無関係に同じ分類を実行できます。また,グロ,バルプ,リングによって,最後の全結合層のパラメ,タ,数が大幅に減少します。ネットワークが学習データの特定の特徴量を記憶する可能性を減らすために,最後の全結合層への入力に少量のドロップアウトを追加します。

このネットワクは,フィルタがほとんどない5の畳み込み層しかないため小規模です。numFによって畳み込み層のフィルタ,の数を制御します。ネットワークの精度を高めるために,畳み込み層,バッチ正規化層,およびReLU層の同等なブロックを追加して,ネットワーク深さを大きくすることを試してください。numFを増やして,畳み込みフィルタ,の数を増やしてみることもできます。

各クラスの損失の合計重みを等しくするために,各クラスの学習例の数に反比例するクラスの重みを使用します。ネットワ,クの学習に Adam オプティマイザーを使用する場合、学習アルゴリズムはクラスの重み全体の正規化に依存しません。

类=类别(TTrain);classWeights = 1./countcats(TTrain);classWeights = classWeights'/mean(classWeights);numClasses = nummel(类);timePoolSize = ceil(numHops/8);dropoutProb = 0.2;numF = 12;layers = [imageInputLayer([numHops,afe.FeatureVectorLength]) convolution2dLayer(3,numF,Padding=“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer(3,Stride=2,Padding=“相同”) convolution2dLayer (3 2 * numF填充=“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer(3,Stride=2,Padding=“相同”) convolution2dLayer(3、4 * numF填充=“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer(3,Stride=2,Padding=“相同”) convolution2dLayer(3、4 * numF填充=“相同”) batchNormalizationLayer reluLayer convolution2dLayer(3,4*numF,Padding=“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer([timePoolSize,1]) dropoutLayer(dropoutProb) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer(Classes= Classes,ClassWeights= ClassWeights)];

学習オプションの指定

学習パラメ,タ,を定義するには,trainingOptionsを使用します。ミニバッチサ▪▪ズを128としてAdamオプティマ▪▪ザ▪を使用します。

miniBatchSize = 128;validationFrequency = floor(数字(TTrain)/miniBatchSize);选项= trainingOptions(“亚当”...InitialLearnRate = 3的军医,...MaxEpochs = 15,...MiniBatchSize = MiniBatchSize,...洗牌=“every-epoch”...情节=“训练进步”...Verbose = false,...ValidationData = {XValidation, TValidation},...ValidationFrequency = ValidationFrequency);

ネットワ,クの学習

ネットワ,クに学習させるには,trainNetworkを使用します。Gpuがない場合,ネットワ,クの学習に時間がかかる場合があります。

trainedNet = trainNetwork(XTrain,TTrain,图层,选项);

学習済みネットワ,クの評価

学習セットと検証セットに対するネットワ,クの最終精度を計算するには,分类を使用します。このデ,タセットではネットワ,クは非常に正確になります。ただし,学習データ,検証データ,およびテストデータの分布はどれも似ていて,必ずしも実際の環境を反映していません。この制限は特に未知的カテゴリに当てはまります。このカテゴリには,少数の単語の発話しか含まれていません。

YValidation = classification (trainedNet,XValidation);validationError = mean(YValidation ~= TValidation);YTrain =分类(trainedNet,XTrain);trainError = mean(YTrain ~= TTrain);disp ([“训练错误:”+ trainError*100 +“%”"验证错误:"+ validationError*100 +“%”])
“训练误差:2.7263%”“验证误差:6.3968%”

検証セットの混同行列をプロットするには,confusionchartを使用します。列と行の要約を使用して,各クラスの適合率と再現率を表示します。

图(单位=“归一化”位置= (0.2,0.2,0.5,0.5));cm = confusichart (TValidation,YValidation,...Title =验证数据混淆矩阵...ColumnSummary =“column-normalized”RowSummary =“row-normalized”);sortClasses(厘米,[命令,“未知”“背景”])

モバイル用途など,ハードウェアリソースに制約がある用途で使用する場合は,利用可能なメモリおよび計算リソースの制限を考慮することが重要です。CPUを使用する場合は,ネットワークの合計サイズをKB単位で計算し,その予測速度をテストします。予測時間は1の入力メジの分類にかかる時間です。複数のイメージをネットワークに入力する場合,これらを同時に分類して,イメージあたりの予測時間を短くすることができます。ストリミングオディオを分類する場合,1のメジの予測時間が最も重要です。

ii = 1:100 x = randn([numHops,numBands]);predictionTimer = tic;[y,probs] = category (trainedNet,x,ExecutionEnvironment=“cpu”);time(ii) = toc(predictionTimer);结束disp ([“网络规模:”+谁(“trainedNet”).字节/ 1024 +“知识库”...CPU单图像预测时间:+ mean(time(11:end))*1000 +“女士”])
“网络大小:292.2842 kB”“CPU上的单幅图像预测时间:3.7237 ms”

サポ,ト関数

バックグラウンドノ▪▪ズによるデ▪▪タセットの拡張

函数augmentDataset(datasetloc) adsBkg = audioDatastore(fullfile(datasetloc,“背景”));Fs = 16e3;%数据集的已知抽样率segmentDuration = 1;segmentSamples = round(segmentDuration*fs);volumeRange = log10([1e-4,1]);numkgsegments = 4000;numkgfiles = nummel (adsBkg.Files);numSegmentsPerFile = floor(numkgsegments / numkgfiles);fpTrain = fullfile(datasetloc,“训练”“背景”);fpValidation = fullfile(datasetloc,“确认”“背景”);如果~ datasetExists (fpTrain)%创建目录mkdir (fpTrain) mkdir (fpValidation)backgroundFileIndex = 1: nummel (adsBkg. files) [bkgFile,fileInfo] = read(adsBkg);[~,fn] = fileparts(fileInfo.FileName);确定每个分段的起始指数segmentStart = randi(size(bkgFile,1)-segmentSamples,numSegmentsPerFile,1);%确定每个剪辑的增益增益= 10.^((volumeRange(2)-volumeRange(1))*rand(numSegmentsPerFile,1) + volumeRange(1));segmentdx = 1:numSegmentsPerFile隔离随机选择的数据段。bkgSegment = bkgFile(segmentStart(segmentdx):segmentStart(segmentdx)+segmentSamples-1);按指定增益缩放段。bkgSegment = bkgSegment*gain(segmentdx);剪辑介于-1和1之间的音频。bkgSegment = max(min(bkgSegment,1),-1);创建文件名。Afn = fn +“_segment”+ segmentdx +“wav”%随机分配背景段给火车或%验证集。如果兰特> 0.85将15%分配给验证dirToWriteTo = fpValidation;其他的将85%分配给训练集。dirToWriteTo = fpTrain;结束将音频写入文件位置。ffn = fullfile(dirToWriteTo,afn);audiowrite (ffn bkgSegment fs)结束打印进度%流('进度= %d (%%)\n'而圆(100 *进展(adsBkg)))结束结束结束

参考文献

狱长P。“语音命令:用于单词语音识别的公共数据集”,2017年。可以从https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz.版权所有谷歌2017。语音命令集は,次で公開されている创作共用署名4.0许可证に従ってライセンスされています。https://creativecommons.org/licenses/by/4.0/legalcode

参照

狱长P。“语音命令:用于单词语音识别的公共数据集”,2017年。可以从http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz.版权所有谷歌2017。语音命令数据集是在创作共用属性4.0许可下授权的,可在这里获得:https://creativecommons.org/licenses/by/4.0/legalcode

参考

||

関連するトピック