このページは前リリースの情报です。该当の英语のページはこのリリースで削除されています。

深层学习を使用した音声コマンド认识

この例では,オーディオに存在する音声コマンドを検出するシンプルな深层学习モデルに学习させる方法を说明します。この例では,音声コマンドデータセット[1]を使用して,与えられた一连のコマンドを认识する畳み込みニューラルネットワークに学习させます。

この例を実行するには,まず,データセットをダウンロードしなければなりません。データセットをダウンロードしない,またはネットワークに学习させない场合,この例をMATLAB®で开いて,コマンドラインで负载( 'commandNet.mat')と入力し,事前学习済みのネットワークを読み込むことができます。ネットワークを読み込んだ后,この例の最后の节「マイクからのストリーミングオーディオを使用したコマンドの検出」に直接进みます。

音声コマンドデータセットの読み込み

データセットをhttps://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gzからダウンロードし,ダウンロードしたファイルを解冻します。datafolderをデータの场所に设定します。audioDatastoreを使用して,ファイル名と対応するラベルを含むデータストアを作成します。フォルダー名をラベルソースとして使用します。オーディオファイル全体を読み取るための読み取り方法を指定します。后で使用するためにデータストアのコピーを作成します。

datafolder = PathToDatabase;广告= audioDatastore(datafolder,...'IncludeSubfolders',真正,...'FileExtensions''.WAV'...'LABELSOURCE''foldernames')ADS0 =拷贝(广告);
广告= audioDatastore与性能:文件:{ '... \数据集\ google_speech \ _background_noise_ \ doing_the_dishes.wav';'... \数据集\ google_speech \ _background_noise_ \ dude_miaowing.wav';'... \数据集\ google_speech \ _background_noise_ \ exercise_bike.wav' ......和64724多}标签:[_background_noise_;_背景噪音_;_background_noise_ ...和64724多个分类] AlternateFileSystemRoots:{} OutputDataType: '双师型'

认识する単语の选択

モデルにコマンドとして认识させる単语を指定します。コマンドではないすべての単语に未知とラベル付けします。コマンドではない単语に未知とラベル付けすることで,コマンド以外のすべての単语の分布に近い単语のグループが作成されます。ネットワークは,このグループを使用して,コマンドと他のすべての単语の违いを学习します。

既知の単语と未知の単语の间でクラスの不均衡を减らし,处理を高速化するために,未知の単语の一部(includeFraction)のみを学习セットに含めます。バックグラウンドノイズがある长いファイルは,まだ学习セットに含めないでください。バックグラウンドノイズは以降の别の手顺で追加します。

子集(广告,索引)を使用して,指数によってインデックス付けされたファイルとラベルのみを含むデータストアを作成します。コマンドと未知の単语のサブセットのみが含まれるようにデータストア广告を缩小します。各クラスに属している例の数をカウントします。

命令=分类([“是”“没有”“涨”“下”“剩下”“对”“上”“关”“停”“走”]);isCommand = ismember(ads.Labels,命令);isUnknown =〜ismember(ads.Labels,[命令,“_背景噪音_”]);includeFraction = 0.2;掩模=兰特(numel(ads.Labels),1)“未知”);广告=子集(广告,isCommand | isUnknown);countEachLabel(广告)
ANS = 11×2表标签数量_______ _____下降2359转到2372在2367右2367停止2380未知8294留下2353没有2375关高达2357 2375个2377是

学习セット,検证セット,およびテストセットへのデータの分割

データセットフォルダーには,検证セットおよびテストセットとして使用するオーディオファイルをリストしたテキストファイルが含まれています。これらの事前定义された検证セットとテストセットには,同じ人物による同じ単语の発话が含まれていないため,データセット全体のランダムなサブセットを选択するよりも,これらの事前定义されたセットを使用する方が得策です。サポート关数splitDataを使用して,データセットフォルダーにある検证ファイルとテストファイルのリストに基づき,データストアを学习セット,検证セット,およびテストセットに分割します。

この例では1つのネットワークに学习させるため,テストセットは使用せず検证セットのみを使用して,学习済みのモデルを评価します。多くのネットワークに学习させて検证精度が最も高いネットワークを最终的なネットワークとして选択すると,テストセットを使用して最终的なネットワークを评価できます。

[adsTrain,adsValidation,adsTest] = splitData(广告,datafolder);

音声スペクトログラムの计算

畳み込みニューラルネットワークの学习を效果的に行うためのデータを准备するために,音声波形を対数メルスペクトログラムに変换します。

スペクトログラムの计算に使用するパラメーターを定义します。segmentDurationは各音声クリップの长さ(秒単位)です。frameDurationはスペクトログラムの计算用の各フレームの长さです。hopDurationはスペクトログラムの各列间のタイムステップです。numBandsは対数メルフィルターの数で,各スペクトログラムの高さに一致します。

segmentDuration = 1;frameDuration = 0.025;hopDuration = 0.010;numBands = 40;

サポート关数speechSpectrogramsを使用して,学习セット,検证セット,およびテストセットのスペクトログラムを计算します。关数speechSpectrogramsは対数メルスペクトログラムの计算にdesignAuditoryFilterBankを使用します。滑らかな分布のデータを得るために,小さいオフセットepsilを使用してスペクトログラムの対数を取ります。

epsil = 1E-6;XTrain = speechSpectrograms(adsTrain,segmentDuration,frameDuration,hopDuration,numBands);XTrain = LOG10(XTrain + epsil);XValidation = speechSpectrograms(adsValidation,segmentDuration,frameDuration,hopDuration,numBands);XValidation = LOG10(XValidation + epsil);XTEST = speechSpectrograms(adsTest,segmentDuration,frameDuration,hopDuration,numBands);XTEST = LOG10(XTEST + epsil);YTrain = adsTrain.Labels;YValidation = adsValidation.Labels;YTest = adsTest.Labels;
计算语音频谱...加工1000个文件出的25128个加工2000个文件出的25128个加工3000个文件出的25128个加工4000个文件出的25128个加工5000个文件出的25128个加工6000个文件出的25128个加工7000个文件出的25128加工8000文件出的25128个加工9000个文件出的25128个加工10000个文件出的25128个加工11000个文件出的25128个加工12000个文件出的25128个加工13000个文件出的25128个加工14000个文件出的25128个加工15000个文件出的25128加工16000个文件出来的25128加工17000个文件出的25128个加工18000个文件出的25128个加工19000个文件出的25128个加工20000个文件出的25128个加工21000个文件出的25128个加工22000个文件出的25128个加工23000个文件出的25128个加工24000个文件出25128处理25000个文件出的25128 ...进行计算的语音频谱...处理1000个文件出的3391个处理2000个文件出3391个加工3000个文件出的3391 ...做计算的语音频谱...加工1000个文件出的3457个加工2000个文件从3457个加工3000个文件从3457 ...做

データの可视化

いくつかの学习例について波形とスペクトログラムをプロットします。対応するオーディオクリップを再生します。

specMin =分钟(XTrain(:));specMax = MAX(XTrain(:));IDX = randperm(大小(XTrain,4),3);数字('单位'“规范化”'位置'[0.2 0.2 0.6 0.6]);对于I = 1:3 [X,FS] = audioread(adsTrain.Files {IDX(ⅰ)});副区(2,3,i)的积(X)轴标题(字符串(adsTrain.Labels(IDX(I))))副区(2,3,i + 3中)SPECT = XTrain(:,:,1,IDX(I));令pColor(SPECT)CAXIS([specMin + 2 specMax])阴影平面声音(X,FS)暂停(2)结束

ネットワークへの入力が适度に滑らかに分布していて正规化されている场合,ニューラルネットワークの学习は最も简単になります。データ分布が滑らかであることを确认するために,学习データのピクセル値のヒストグラムをプロットします。

图直方图(XTrain,'EdgeColor''没有''正常化''PDF')轴AX = GCA;ax.YScale =“日志”;xlabel(“输入像素值”)ylabel(“概率密度”

バックグラウンドノイズデータの追加

このネットワークは,発声されたさまざまな単语を认识できるだけでなく,入力に无音部分またはバックグラウンドノイズが含まれているかどうかを検出できなければなりません。

_背景噪音_フォルダーのオーディオファイルを使用して,バックグラウンドノイズの1秒间のクリップのサンプルを作成します。各バックグラウンドノイズファイルから同じ数のバックグラウンドクリップを作成します。また,バックグラウンドノイズの录音を独自に作成して,_背景噪音_フォルダーに追加することもできます。adsBkgデータストアのオーディオファイルから得られたバックグラウンドクリップのnumBkgClipsスペクトログラムを计算するには,サポート关数backgroundSpectrogramsを使用します。スペクトログラムを计算する前に,この关数は,対数一様分布からサンプリングされた系数を使用して,volumeRangeで与えられた范囲に各オーディオクリップを再スケーリングします。

4000个のバックグラウンドクリップを作成し,1E-41の间の数で各クリップを再スケーリングします。XBkgには,ほぼ无音から大音量までの音量のバックグラウンドノイズのスペクトログラムが含まれています。

adsBkg =子集(ADS0,ads0.Labels ==“_背景噪音_”);numBkgClips = 4000;volumeRange = [1E-4,1];XBkg = backgroundSpectrograms(adsBkg,numBkgClips,volumeRange,segmentDuration,frameDuration,hopDuration,numBands);XBkg = LOG10(XBkg + epsil);
计算背景频谱...加工1000个背景剪辑出的4000加工2000背景剪辑出的4000加工3000个背景剪辑出的4000加工4000个背景剪辑出来的4000 ...完成

バックグラウンドノイズのスペクトログラムを学习セット,検证セット,およびテストセットに分割します。_背景噪音_フォルダーには约5分半のバックグラウンドノイズのみが含まれているため,异なるデータセットのバックグラウンドサンプルには高い相关があります。バックグラウンドノイズのバリエーションを増やすために,独自のバックグラウンドファイルを作成して,このフォルダーに追加できます。ノイズに対するネットワークのロバスト性を向上させるために,バックグラウンドノイズを音声ファイルにミキシングしてみることもできます。

numTrainBkg =地板(0.8 * numBkgClips);numValidationBkg =地板(0.1 * numBkgClips);numTestBkg =地板(0.1 * numBkgClips);XTrain(:,:,:,端+ 1:端+ numTrainBkg)= XBkg(:,:,:,1:numTrainBkg);XBkg(:,:,:,1:numTrainBkg)= [];YTrain(端+ 1:端+ numTrainBkg)=“背景”;XValidation(:,:,:,端+ 1:端+ numValidationBkg)= XBkg(:,:,:,1:numValidationBkg);XBkg(:,:,:,1:numValidationBkg)= [];YValidation(端+ 1:端+ numValidationBkg)=“背景”;XTEST(:,:,:,端+ 1:端+ numTestBkg)= XBkg(:,:,:,1:numTestBkg);明确XBkg;YTest(端+ 1:端+ numTestBkg)=“背景”;YTrain = removecats(YTrain);YValidation = removecats(YValidation);YTest = removecats(YTest);

学习セットと検证セット内のさまざまなクラスラベルの分布をプロットします。テストセットの分布は検证セットの分布と非常によく似ています。

数字('单位'“规范化”'位置'[0.2 0.2 0.5 0.5]);副区(2,1,1)直方图(YTrain)称号(“培训标签分发”)副区(2,1,2)的直方图(YValidation)标题(“验证标签分发”

データ拡张の追加

スペクトログラムの自动拡张とサイズ変更用の拡张イメージデータストアを作成します。スペクトログラムを时间について最大10フレーム(100毫秒)前后にランダムに移动し,さらにこのスペクトログラムを时间轴に沿って20%スケールアップまたはスケールダウンします。データを拡张すると,学习データの有效サイズが増加し,ネットワークの过适合を防止するのに役立ちます。拡张したイメージデータストアは,学习中にリアルタイムで拡张イメージを作成し,それらのイメージをネットワークに入力します。拡张されたスペクトログラムはメモリに保存されません。

SZ =尺寸(XTrain);specSize = SZ(1:2);IMAGESIZE = [specSize 1];增强因子= imageDataAugmenter(...'RandXTranslation',[ -  10 10],...'RandXScale'[0.8 1.2],...'FillValue',LOG10(epsil));augimdsTrain = augmentedImageDatastore(IMAGESIZE,XTrain,YTrain,...'DataAugmentation',增强因子);

ニューラルネットワークアーキテクチャの定义

シンプルなネットワークアーキテクチャを层の配列として作成します。畳み込み层とバッチ正规化层を使用します。最大プーリング层を使って特徴マップを “空间的に”(つまり,时间と周波数に关して)ダウンサンプリングします。入力の特徴マップを时间の経过と共にグローバルにプーリングする最后の最大プーリング层を追加します。これによって(近似的な)时间并进不変性が入力スペクトログラムに课されるため,ネットワークは,音声の正确な时间的位置とは无关系に同じ分类を実行できます。また,グローバルプーリングによって,最后の全结合层のパラメーター数が大幅に减少します。ネットワークが学习データの特定の特徴を记忆する可能性を减らすために,最后の全结合层への入力に少量のドロップアウトを追加します。

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

重み付き交差エントロピー分类损失を使用します。weightedClassificationLayer(classWeights)は,classWeightsによって重み付けされた観测値を使用して交差エントロピー损失を计算するカスタム分类层を作成します。类别(YTrain)に现れるクラスと同じ顺序でクラスの重みを指定します。各クラスの损失の合计重みを等しくするために,各クラスの学习例の数に反比例するクラスの重みを使用します。ネットワークの学习に亚当·オプティマイザーを使用する场合,学习アルゴリズムはクラスの重み全体の正规化に依存しません。

classWeights = 1./countcats(YTrain);classWeights = classWeights' /平均值(classWeights);numClasses = numel(类别(YTrain));timePoolSize =小区(IMAGESIZE(2)/ 8);dropoutProb = 0.2;numF = 12;层= [imageInputLayer(IMAGESIZE)convolution2dLayer(3,numF,'填充''相同')batchNormalizationLayer reluLayer maxPooling2dLayer(3,“跨越论”,2,'填充''相同')convolution2dLayer(3,2 * numF,'填充''相同')batchNormalizationLayer reluLayer maxPooling2dLayer(3,“跨越论”,2,'填充''相同')convolution2dLayer(3,4- * numF,'填充''相同')batchNormalizationLayer reluLayer maxPooling2dLayer(3,“跨越论”,2,'填充''相同')convolution2dLayer(3,4- * numF,'填充''相同')batchNormalizationLayer reluLayer convolution2dLayer(3,4 * numF,'填充''相同')batchNormalizationLayer reluLayer maxPooling2dLayer([1个timePoolSize])dropoutLayer(dropoutProb)fullyConnectedLayer(numClasses)softmaxLayer weightedClassificationLayer(classWeights)];

ネットワークの学习

学习オプションを指定します。ミニバッチサイズを128として亚当オプティマイザーを使用します。学习は25エポック行い,20エポック后に学习率を10分の1に下げます。

miniBatchSize = 128;validationFrequency =地板(numel(YTrain)/ miniBatchSize);选项= trainingOptions('亚当'...'InitialLearnRate',3E-4,...'MaxEpochs'25,...'MiniBatchSize',miniBatchSize,...“洗牌”“每个历元”...“情节”“训练进度”...“放牧”,假,...'ValidationData'{XValidation,YValidation}...'ValidationFrequency',validationFrequency,...'LearnRateSchedule'“分段”...'LearnRateDropFactor',0.1%,...'LearnRateDropPeriod',20);

ネットワークに学习をさせます.GPUがない场合,ネットワークの学习に时间がかかる场合があります。ネットワークにゼロから学习させる代わりに,事前学习済みのネットワークを読み込む场合は,doTrainingに设定します。

doTraining = TRUE;如果doTraining trainedNet = trainNetwork(augimdsTrain,层,选项);其他加载('commandNet.mat''trainedNet');结束

学习済みネットワークの评価

学习セット(データ拡张なし)と検证セットに対するネットワークの最终精度を计算します。このデータセットではネットワークは非常に正确になります。ただし,学习データ,検证データ,およびテストデータの分布はどれも似ていて,必ずしも実际の环境を反映していません。この制限は特に未知カテゴリに当てはまります。このカテゴリには,少数の単语の発话しか含まれていません。

YValPred =分类(trainedNet,XValidation);validationError =平均值(YValPred〜= YValidation);YTrainPred =分类(trainedNet,XTrain);trainError =平均值(YTrainPred〜= YTrain);DISP(“培训错误:”+ trainError * 100 +“%”)DISP(“验证错误:”+ validationError * 100 +“%”
训练误差:4.0419%验证错误:6.4099%

混同行列をプロットします。列と行の要约を使用して,各クラスの适合率と再现率を表示します。混同行列のクラスを并べ替えます。大きな认识の违いが现れるのは,未知の単语间,コマンド向上没有,および没有の间にあります。

数字('单位'“规范化”'位置'[0.2 0.2 0.5 0.5]);厘米= confusionchart(YValidation,YValPred);cm.Title =“混淆矩阵用于验证数据”;cm.ColumnSummary =“列归一化”;cm.RowSummary =“行标准化”;sortClasses(厘米,[命令,“未知”“背景”])

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

信息=卫生组织('trainedNet');DISP(“网络规模”+ info.bytes / 1024 +“KB”对于I = 1:100×= randn(IMAGESIZE);抽动[YPredicted,probs] =分类(trainedNet,X,“执行环境”'中央处理器');时间(I)= TOC;结束DISP(“关于CPU单图像预测时间:”+平均(时间(11:结束))* 1000 +“ 女士”
网络规模:在CPU 285.2109 KB单图像预测时间:1.9703毫秒

マイクからのストリーミングオーディオを使用したコマンドの検出

新しく学习させたコマンド検出ネットワークをマイクからのストリーミングオーディオでテストします。ネットワークの学习を行っていない场合は,コマンドラインで负载( 'commandNet.mat')と入力して,ライブストリーミングオーディオの分类に必要な,事前学习済みのネットワークとパラメーターを読み込みます。没有など,いずれかのコマンドを発声してみてください。さらに,马文希拉などの未知の単语や,0から9までの数のいずれかを発声してみてください。

オーディオのサンプリングレートと分类レートを赫兹単位で指定し,マイクからオーディオを読み取ることができるオーディオデバイスリーダーを作成します。

FS = 16e3;classificationRate = 20;AUDIOIN = audioDeviceReader('采样率',FS,...'SamplesPerFrame',地板(FS / classificationRate));

ストリーミングスペクトログラムの计算用のパラメーターを指定し,オーディオのバッファーを初期化します。ネットワークの分类ラベルを抽出します。ストリーミングオーディオのラベルと分类确率用の0.5秒のバッファーを初期化します。これらのバッファーを使用して长い时间にわたって分类结果を比较し,それによって,コマンドが検出されたタイミングとの '一致' を构筑します。

帧长度=地板(frameDuration * FS);hopLength =地板(hopDuration * FS);waveBuffer =零([FS,1]);标签= trainedNet.Layers(结束).Classes;YBuffer(1:classificationRate / 2)=分类(“背景”);probBuffer =零([numel(标签),classificationRate / 2]);

图を作成し,作成した图が存在する限りコマンドを検出します。ライブ検出を停止するには,単に图を闭じます。

H =系数('单位'“规范化”'位置'[0.2 0.1 0.6 0.8]);滤波器= designAuditoryFilterBank(FS,'FrequencyScale''吠'...'FFTLength',512,...'NumBands',numBands,...'频率范围'[50,7000]);ishandle(H)从音频设备%提取音频样本,并将样品加入到%的缓冲区。X = AUDIOIN();waveBuffer(1:最终numel(X))= waveBuffer(numel(x)的1:结束);waveBuffer(端numel(x)的1:结束)= X;%计算最新的音频样本的频谱。[〜,〜,〜,规格] =谱图(waveBuffer,汉恩(帧长度,“周期性”),帧长度 -  hopLength,512,'片面');规格=滤波器*规范;规格=日志10(规格+ epsil);%分类目前的频谱,保存标签到标签缓冲,%并保存预测概率的概率缓冲器。[YPredicted,probs] =分类(trainedNet,规格,“执行环境”'中央处理器');YBuffer(1:结束-1)= YBuffer(2:结束);YBuffer(结束)= YPredicted;probBuffer(:,1:端-1)= probBuffer(:,2:结束);probBuffer(:,端)= probs';%绘制的电流波形和频谱。副区(2,1,1);情节(waveBuffer)轴ylim([ -  0.2,0.2])副区(2,1,2)令pColor(SPEC)CAXIS([specMin + 2 specMax])阴影平面%立即通过执行一个非常简单的做实际的命令检测%阈值操作。声明的检测,并在其显示%图标题,如果所有下列条件成立:%1)最常见的标签不是|背景|。%2)至少| countThreshold |最新的帧标签的认同。%3)预测的标签的最大预测概率是在%至少| probThreshold |。否则,不申报的检测。[YMode,计数] =模式(YBuffer);countThreshold =小区(classificationRate * 0.2);maxProb = MAX(probBuffer(标签== YMode,:));probThreshold = 0.7;副区(2,1,1);如果YMode ==“背景”||计数“”)其他标题(字符串(YMode)'字体大小',20)结束的DrawNow结束

参照

[1]看守P.“语音命令:用于单词语音识别一个公共数据集”,2017年可从http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz。版权所有2017年谷歌的语音命令数据集采用知识共享署名4.0许可协议授权,可在这里:https://creativecommons.org/licenses/by/4.0/legalcode

参考

||

关连するトピック