ウェ,ブレット散乱と深層学習を使用した数字音声認識
この例では,機械学習と深層学習の両方の手法を使用して数字音声を分類する方法を説明します。この例では,ウェ,ブレット時間散乱をサポトベクター マシン (SVM) および長短期記憶 (LSTM) ネットワークと組み合わせて分類を行います。また、ベイズ最適化を適用し、LSTM ネットワークの精度向上に適したハイパーパラメーターを判定します。さらに、この例では、深層畳み込みニューラル ネットワーク (CNN) とメル周波数スペクトログラムを用いた手法についても説明します。
デタ
免费使用数字データセット(FSDD)を複製またはダウンロードします。このデータセットは,https://github.com/Jakobovski/free-spoken-digit-datasetから入手できます。FSDDはオ,プンなデ,タセットなので,時間の経過とともに大きくなる可能性があります。この例では,2019年1月29日にまとめられたバ,ジョンを使用します。このバージョンには,4人の話者が英語で発話した0 ~ 9の数字が2000件記録されています。このバージョンでは,2人の話者はアメリカ英語を話すネイティブスピーカー,1人の話者はベルギーフランス語なまりの英語を話す非ネイティブスピーカー,もう1人の話者はドイツ語なまりの英語を話す非ネイティブスピーカーです。デ,タは8000 Hzでサンプリングされます。
audioDatastore
を使用してデータアクセスを管理し,録音が必ず学習セットとテストセットにランダムに分割されるようにします。位置
プロパティに,コンピュ,タ,上でFSDDの録音が保存されているフォルダ,の場所を設定します。たとえば,次のようにします。
pathToRecordingsFolder = fullfile(tempdir,“free-spoken-digit-dataset-master”,“录音”);location = pathToRecordingsFolder;
audioDatastore
にこの場所を参照させます。
ads = audioDatastore(location);
補助関数helpergenLabels
は,FSDDファ,aaplルから取得したラベルの分类配列を作成します。helpergenLabels
のソ,スコ,ドの一覧を付録に示します。クラスと,各クラスに含まれる例の数をリストします。
ads. labels = helpergenLabels(广告);总结(ads.Labels)
0 300 1 300 2 300 3 300 4 300 5 300 6 300 7 300 8 300 9 300
このFSDDデータセットはバランスの取れた10個のクラスで構成され,各クラスに200個の録音が含まれています。FSDDに含まれる録音はそれぞれ再生時間が異なります。FSDDは膨大ではないため,FSDDのファイルをすべて読み取り,信号長のヒストグラムを作成します。
LenSig = 0(数字(ads.Files),1);Nr = 1;而Hasdata(广告)数字=读(广告);LenSig(nr) =数字(数字);Nr = Nr +1;结束重置(广告)直方图(LenSig)网格在包含(“信号长度(样本)”) ylabel (“频率”)
ヒストグラムから,録音の長さの分布に正の歪みがあることがわかります。この例は,分類のために一般的な信号長である8192サンプルを使用します。これは,長い録音を打切っても発話内容が切断されることのない保守的な値です。8192年信号がサンプル(1.024秒)より長い場合,録音は8192サンプルに打ち切られます。8192年信号がサンプルより短い場合,長さを8192サンプルにするため,信号の前後が対称的にゼロでパディングされます。
ウェ,ブレット時間散乱
waveletScattering
を使用して,0.22秒の不変スケルでウェブレット時間散乱フレムワクを作成します。この例では,すべての時間サンプルについて散乱変換を平均化することで特徴ベクトルを作成します。時間ウィンドウごとの平均化に十分な数の散乱係数を得るため、OversamplingFactor
を2に設定し,大きくダウンサンプリングされた値に対して各パスの散乱係数の数が4倍となるようにします。
sf =小波散射(“SignalLength”, 8192,“InvarianceScale”, 0.22,...“SamplingFrequency”, 8000,“OversamplingFactor”2);
FSDDを学習セットとテストセットに分割します。デタの 80% を学習セットに割り当て、20% をテスト セット用に確保します。学習データは、散乱変換に基づいて分類器に学習させるのに使用します。テスト データは、モデルを検証するのに使用します。
rng默认的;广告= shuffle(广告);[adsTrain,adsTest] = splitEachLabel(ads,0.8);countEachLabel (adsTrain)
ans =10×2表标签计数_____ _____ 0 240 1 240 2 240 3 240 4 240 5 240 6 240 7 240 8 240 9 240
countEachLabel (adsTest)
ans =10×2表标签计数_____ _____ 0 60 1 60 2 60 3 60 4 60 5 60 6 60 7 60 8 60 9 60
補助関数helperReadSPData
8192年は,長さがとなるようにデータを打ち切り(またはパディングし),各記録データを最大値で正規化します。helperReadSPData
のソ,スコ,ドの一覧を付録に示します。各列に数字音声の録音を格納する8192行1600列の行列を作成します。
Xtrain = [];scatds_Train = transform(adsTrain,@(x)helperReadSPData(x));而hasdata(scatds_Train) smat = read(scatds_Train);Xtrain = cat(2,Xtrain,smat);结束
テストセットに対して同じ処理を繰り返します。8192行400列の行列が得られます。
Xtest = [];scatds_Test = transform(adsTest,@(x)helperReadSPData(x));而hasdata(scatds_Test) smat = read(scatds_Test);Xtest = cat(2,Xtest,smat);结束
学習セットとテストセットにウェ,ブレット散乱変換を適用します。
Strain = sf.featureMatrix(Xtrain);Stest = sf.featureMatrix(Xtest);
学習セットとテストセットの平均の散乱特徴を取得します。ゼロ次散乱係数は除外します。
TrainFeatures = Strain(2:end,:,:);TrainFeatures = squeeze(mean(TrainFeatures,2))';TestFeatures = Stest(2:end,:,:);TestFeatures = squeeze(mean(TestFeatures,2))';
支持向量机分類器
データが各記録データの特徴ベクトルに削減されたので,次に,これらの特徴を使用して記録データを分類します。2次多項式カ,ネルを使用して,支持向量机学習器のテンプレ,トを作成します。支持向量机を学習デ,タに適合させます。
template = templateSVM(...“KernelFunction”,多项式的,...“PolynomialOrder”2,...“KernelScale”,“汽车”,...“BoxConstraint”, 1...“标准化”,真正的);分类svm = fitcecoc(...TrainFeatures,...adsTrain。标签,...“学习者”模板,...“编码”,“onevsone”,...“类名”分类({' 0 ';' 1 ';' 2 ';“3”;“4”;“5”;“6”;“7”;“8”;“9”}));
K分割交差検証を使用して,学習デ,タに基づきモデルの一般化精度を予測します。学習セットを5のグルプに分割します。
partitionedModel = crossval(classificationSVM,“KFold”5);[validationforecasts, validationScores] = kfoldPredict(partitionedModel);validationAccuracy = (1 - kfoldLoss(partitionedModel,“LossFun”,“ClassifError”)) * 100
validationAccuracy = 97.4167
推定された一般化精度は約97%です。学習済みのSVMを使用して,テストセットに含まれる数字音声のクラスを予測します。
predLabels = predict(classificationSVM,TestFeatures);testAccuracy = sum(predLabels==adsTest.Labels)/numel(predLabels)*100
testAccuracy = 97.1667
テストセットに対するモデルの性能を混同チャ,トに集計します。列と行の要約を使用して,各クラスの適合率と再現率を表示します。混同チャ,トの下部にあるテ,ブルに,各クラスの精度が示されます。混同チャ,トの右側にあるテ,ブルに,再現率が示されます。
图(“单位”,“归一化”,“位置”,[0.2 0.2 0.5 0.5]);ccscat = confusionchart(adsTest.Labels,predLabels);ccscat。Title =“小波散射分类”;ccscat。ColumnSummary =“column-normalized”;ccscat。RowSummary =“row-normalized”;
散乱変換とSVM分類器を組み合わせると,テストセットに含まれる数字音声が98%の精度(または2%の誤差率)で分類されます。
長短期記憶(lstm)ネットワ.ク
LSTMネットワ,クは,再帰型ニュ,ラルネットワ,ク(rnn)の一種です。RNNは,音声データのようなシーケンスデータまたは時間データの処理に特化したニューラルネットワークです。ウェ,ブレット散乱係数はシ,ケンスなので,lstmの入力として使用できます。生デ,タではなく散乱特徴を使用することで,ネットワ,クが学習すべき変動性を減らすことができます。
LSTMネットワ,クで使用できるように,学習用およびテスト用の散乱特徴に変更を加えます。ゼロ次散乱係数は除外し,特徴を单元格配列に変換します。
TrainFeatures = Strain(2:end,:,:);TrainFeatures = squeeze(num2cell(TrainFeatures,[1 2]));TestFeatures = Stest(2:end,:,:);TestFeatures = squeeze(num2cell(TestFeatures, [1 2]));
512個の隠れ層を使用して,単純なLSTMネットワ,クを構築します。
[inputSize, ~] = size(TrainFeatures{1});YTrain = adsTrain.Labels;numHiddenUnits = 512;numClasses = numel(唯一的(YTrain));层= [...sequenceInputLayer inputSize lstmLayer (numHiddenUnits,“OutputMode”,“最后一次”) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
ハパパラメタを設定します。亚当最適化を使用し,ミニバッチサaaplズとして50を使用します。エポックの最大回数に300を設定します。学習率として1e-4を使用します。プロットを使用して学習の進行状況を追跡しない場合は,学習の進行状況プロットをオフにして構いません。使用可能な場合,学習にはgpuが既定で使用されます。そうでない場合はCPUが使用されます。詳細にいては,trainingOptions
(深度学习工具箱)を参照してください。
maxEpochs = 300;miniBatchSize = 50;选项= trainingOptions(“亚当”,...“InitialLearnRate”, 0.0001,...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“SequenceLength”,“最短”,...“洗牌”,“every-epoch”,...“详细”假的,...“阴谋”,“训练进步”);
ネットワ,クに学習をさせます。
net = trainNetwork(TrainFeatures,YTrain,layers,options);
predLabels =分类(net,TestFeatures);testAccuracy = sum(predLabels==adsTest.Labels)/numel(predLabels)*100
testAccuracy = 96.3333
ベ@ @ズ最適化
一般に,ハイパーパラメーターの適切な設定は,深層ネットワークの学習において最も難しい作業の1つです。ベesc escズ最適化を使用すると,これを軽減できます。この例では,ベイズ法を使用して隠れ層の数と初期学習率を最適化します。ハイパーパラメーターの設定とネットワークに関する情報、および対応する誤差率を格納する MAT ファイルを保存するための新しいディレクトリを作成します。
YTrain = adsTrain.Labels;YTest = adsTest.Labels;如果~ (”结果/”,“dir”mkdir)结果结束
最適化する変数とその値の範囲を初期化します。隠れ層の数は整数でなければならないため,“类型”
を“整数”
に設定します。
optVars = [optimizableVariable(“InitialLearnRate”(1 e-5, 1 e 1),“转换”,“日志”) optimizableVariable (“NumHiddenUnits”(1000),“类型”,“整数”));
ベesc escズ最適化は計算量が多く,完了するまで数時間かかる場合があります。この例では,optimizeCondition
を假
に設定し,事前に定義された最適化済みのハパパラメタ設定をダウンロドして使用します。optimizeCondition
を真正的
に設定すると,目的関数helperBayesOptLSTM
はベ@ @ズ最適化を使用して最小化されます。付録にリストされているこの目的関数は,特定のハイパーパラメーター設定が与えられたときのネットワークの誤差率を表します。読み込まれる設定では,目的関数の最小値が0.02(誤差率2%)になります。
ObjFcn = helperBayesOptLSTM(TrainFeatures,YTrain,TestFeatures,YTest);optimizeCondition = false;如果optimizeCondition BayesObject = bayesopt(ObjFcn,optVars,...“MaxObjectiveEvaluations”15岁的...“IsObjectiveDeterministic”假的,...“UseParallel”,真正的);其他的url =“http://ssd.mathworks.com/万博1manbetxsupportfiles/audio/SpokenDigitRecognition.zip”;downloadNetFolder = tempdir;netFolder = fullfile(下载netFolder,“SpokenDigitRecognition”);如果~存在(netFolder“dir”) disp (下载预训练的网络(1个文件- 12 MB)…解压缩(url, downloadNetFolder)结束负载(fullfile (netFolder“0.02.mat”));结束
下载预训练网络(1个文件- 12 MB)…
ベイズ最適化を実行すると,目的関数の値と対応するハイパーパラメーターの値および反復回数を追跡するために,次のような図が生成されます。ベesc escズ最適化の反復回数を増やすと,目的関数の大域的最小値に確実に到達できます。
隠れユニットの数と初期学習率に最適化された値を適用し,ネットワ,クに再学習させます。
numHiddenUnits = 768;numClasses = numel(唯一的(YTrain));层= [...sequenceInputLayer inputSize lstmLayer (numHiddenUnits,“OutputMode”,“最后一次”) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];maxEpochs = 300;miniBatchSize = 50;选项= trainingOptions(“亚当”,...“InitialLearnRate”2.198827960269379 e-04...“MaxEpochs”maxEpochs,...“MiniBatchSize”miniBatchSize,...“SequenceLength”,“最短”,...“洗牌”,“every-epoch”,...“详细”假的,...“阴谋”,“训练进步”);net = trainNetwork(TrainFeatures,YTrain,layers,options);predLabels =分类(net,TestFeatures);testAccuracy = sum(predLabels==adsTest.Labels)/numel(predLabels)*100
testAccuracy = 97.5000
このプロットからわかるように,ベesc escズ最適化によってLSTMの精度が向上します。
メル周波数スペクトログラムを使用した深層畳み込みネットワ,ク
数字音声認識のタスクを処理するもう1つのアプローチとして,メル周波数スペクトログラムに基づく深層畳み込みニューラルネットワーク(DCNN)を使用してFSDDデータセットを分類する方法があります。散乱変換の場合と同じ手順で信号の切り捨てやパディングを行います。同様に,各信号サンプルを最大絶対値で除算して,各録音を正規化します。一貫性を持たせるため,散乱変換の場合と同じ学習セットとテストセットを使用します。
メル周波数スペクトログラムのパラメ,タ,を設定します。ウィンドウ(フレ,ム)の持続時間には,散乱変換の場合と同じ0.22秒を使用します。ウィンドウ間のホップを10 msに設定します。周波数帯域の数として40を使用します。
segmentDuration = 8192*(1/8000);frameDuration = 0.22;hopDuration = 0.01;numBands = 40;
学習デ,タストアとテストデ,タストアをリセットします。
重置(adsTrain);重置(adsTest);
この例の最後で定義されている補助関数helperspeechSpectrograms
は,録音の長さを標準化し,振幅を正規化した後に,melSpectrogram
を使用してメル周波数スペクトログラムを取得します。メル周波数スペクトログラムの対数をDCNNへの入力として使用します。ゼロの対数をとることのないよう,各要素に小さい。
Epsil = 1e-6;XTrain = helpspeech spectrograms (adsTrain,segmentDuration,frameDuration,hopDuration,numBands);
计算语音谱图…2400中处理500个文件2400中处理1000个文件2400中处理1500个文件2400中处理2000个文件…完成
XTrain = log10(XTrain + epsil);XTest = helpspeechspectrograms (adsTest,segmentDuration,frameDuration,hopDuration,numBands);
计算语音谱图…处理了600个文件中的500个…完成了
XTest = log10(XTest + epsil);YTrain = adsTrain.Labels;YTest = adsTest.Labels;
DCNNア,キテクチャの定義
小さいDCNNを層の配列として構築します。畳み込み層とバッチ正規化層を使用します。また,最大プ,リング層を使って特徴マップをダウンサンプリングします。ネットワークが学習データの特定の特徴を記憶する可能性を減らすために,最後の全結合層への入力に少量のドロップアウトを追加します。
sz = size(XTrain);specSize = sz(1:2);imageSize = [specSize 1];numClasses = nummel(类别(YTrain));dropoutProb = 0.2;numF = 12;图层= [imageInputLayer(imageSize) convolution2dLayer(5,numF,“填充”,“相同”maxPooling2dLayer(3,“步”2,“填充”,“相同”) convolution2dLayer (3 2 * numF“填充”,“相同”maxPooling2dLayer(3,“步”2,“填充”,“相同”) convolution2dLayer(3、4 * numF,“填充”,“相同”maxPooling2dLayer(3,“步”2,“填充”,“相同”) convolution2dLayer(3、4 * numF,“填充”,“相同”(3,4*numF,“填充”,“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer(2) dropoutLayer(dropoutProb) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer(“类”类别(YTrain));];
ネットワクの学習に使用するハパパラメタを設定します。ミニバッチサesc escズとして50を使用し,学習率として1e-4を使用します。亚当最適化を指定します。この例のデ,タ量は比較的少ないため,再現性を考慮して実行環境を“cpu”
に設定します。実行環境を“图形”
または“汽车”
に設定することで,使用可能なgpu上でネットワ,クに学習させることもできます。詳細にいては,trainingOptions
(深度学习工具箱)を参照してください。
miniBatchSize = 50;选项= trainingOptions(“亚当”,...“InitialLearnRate”1的军医,...“MaxEpochs”30岁的...“MiniBatchSize”miniBatchSize,...“洗牌”,“every-epoch”,...“阴谋”,“训练进步”,...“详细”假的,...“ExecutionEnvironment”,“cpu”);
ネットワ,クに学習をさせます。
trainedNet = trainNetwork(XTrain,YTrain,图层,选项);
学習済みのネットワ,クを使用して,テストセットに含まれる数字ラベルを予測します。
[ypredict,probs] =分类(trainedNet,XTest,“ExecutionEnvironment”,“CPU”);cnnAccuracy = sum(yexpected ==YTest)/ nummel (YTest)*100
cnnAccuracy = 98.1667
テストセットに対する学習済みのネットワ,クのパフォ,マンスを混同チャ,トに要約します。列と行の要約を使用して,各クラスの適合率と再現率を表示します。混同チャ,トの下にあるテ,ブルに,精度が示されます。混同チャ,トの右側にあるテ,ブルに,再現率が示されます。
图(“单位”,“归一化”,“位置”,[0.2 0.2 0.5 0.5]);ccDCNN =混淆图(YTest, yexpected);ccDCNN。Title =“DCNN的困惑表”;ccDCNN。ColumnSummary =“column-normalized”;ccDCNN。RowSummary =“row-normalized”;
メル周波数スペクトログラムを入力として使用するDCNNの場合も,テストセットに含まれる数字音声が約98%の精度で分類されています。
まとめ
この例では,機械学習と深層学習に関するさまざまな手法を使用して,FSDDに含まれる数字音声を分類する方法を示しました。ここではウェーブレット散乱をSVMおよびLSTMの両方と組み合わせる方法について説明しました。ベズ法を使用してLSTMのハパパラメタを最適化しました。最後に,cnnとメル周波数スペクトログラムを組み合わせて使用する方法を説明しました。
この例の目的は,基本的には異なるものの,相互に補完する手法で問題に取り組むために,MathWorks®のツールをどのように使用するかを示すことです。どのワ,クフロ,でもaudioDatastore
を使用してディスクからのデ,タの流れを管理し,デ,タを確実にランダム化します。
この例で使用されている手法は,どれもテストセットに対して同程度に良好な性能を示しています。この例は各種の手法を直接比較することを意図したものではありません。たとえば,cnnのハパパラメタの選択にベズ最適化を使用することもできます。このバージョンのFSDDのように小さな学習セットを使用した深層学習に役立つもう1つの手法として,データ拡張があります。データの操作がクラスにどのように影響するかは必ずしも明らかではないため,データの拡張が不可能な場合もあります。ただし,音声の場合は,audioDataAugmenter
を使用したデ,タ拡張の手法が確立されています。
ウェ,ブレット時間散乱の場合も,さまざまな変更を試すことができます。たとえば,変換の不変スケールを変更したり,フィルターバンクごとのウェーブレットフィルターの数を変更したり,各種の分類器を試してみることができます。
付録: 補助関数
函数标签= helpergenLabels(广告)此函数仅在小波工具箱示例中使用。可能是这样%将在将来的版本中更改或删除。tmp = cell(数字(ads.Files),1);表达=“[0 - 9]+ _”;为nf = 1: number (ads.Files) idx = regexp(ads.Files{nf},表达式);tmp{nf} = ads.Files{nf}(idx);结束标签=分类(tmp);结束
函数x = helperReadSPData(x)此函数仅用于使用小波工具箱的示例。它可能会改变%将在未来的版本中删除。N =数字(x);如果N > 8192 x = x(1:8192);elseifN < 8192 pad = 8192-N;Prepad =地板(pad/2);Postpad = cell (pad/2);X = [0 (prepad,1);x;0 (postpad 1)];结束X = X /max(abs(X));结束
函数x = helperBayesOptLSTM(X_train, Y_train, X_val, Y_val)此函数仅用于基于小波散射和深度学习的语音数字识别%的例子。它可能会在未来的版本中被更改或删除。x = @valErrorFun;函数[valError,cons, fileName] = valErrorFun(optVars)%% LSTM体系结构[inputSize,~] = size(X_train{1});numClasses = nummel(惟一的(Y_train));层= [...sequenceInputLayer inputSize bilstmLayer (optVars。NumHiddenUnits,“OutputMode”,“最后一次”)使用优化变量中的隐藏层数fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];%训练时不显示图选项= trainingOptions(“亚当”,...“InitialLearnRate”, optVars。InitialLearnRate,...%利用优化变量的初始学习率值“MaxEpochs”, 300,...“MiniBatchSize”30岁的...“SequenceLength”,“最短”,...“洗牌”,“永远”,...“详细”、假);%%网络训练net = trainNetwork(X_train, Y_train, layers, options);训练准确率X_val_P = net. classification (X_val);精度训练= sum(X_val_P == Y_val)./数值(Y_val);valError = 1 -准确性训练;将网络和选项的结果与错误值一起保存在results文件夹中的MAT文件中文件名= fullfile(“结果”, num2str(valError) +“.mat”);保存(文件名,“净”,“valError”,“选项”) cons = [];结束% end为内部函数结束% end用于外部函数
函数X = helpspeechspectrograms (ads,segmentDuration,frameDuration,hopDuration,numBands)此函数仅用于基于小波散射和深度学习的语音数字识别%的例子。它可能会在未来的版本中被更改或删除。%% helperspeechSpectrograms(广告、segmentDuration frameDuration、hopDuration numBands)%为数据存储广告中的文件计算语音频谱图。% segmentDuration是演讲片段的总时长(以秒为单位),% frameDuration每个频谱图帧的持续时间,hopDuration表示%每个频谱图帧之间的时移,和numBands的个数%频带。disp (“计算语音谱图……”);numHops = ceil((segmentDuration - frameDuration)/hopDuration);numFiles = length(ads.Files);X = 0 ([numBands,numHops,1,numFiles],“单一”);为i = 1:numFiles [x,info] = read(ads);x = normalizeAndResize(x);fs = info.SampleRate;frameLength = round(frameDuration*fs);hopLength = round(hopDuration*fs);spec = melSpectrogram(x,fs,...“窗口”汉明(frameLength“周期”),...“OverlapLength”,frameLength...“FFTLength”, 2048,...“NumBands”numBands,...“FrequencyRange”[4000]);如果频谱图的宽度小于numHops,则将频谱图放入% X的中间。W = size(spec,2);left = floor((numHops-w)/2)+1;Ind = left:left+w-1;X(:,ind,1,i) = spec;如果Mod (i,500) == 0“加工”+ I +文件输出+ numFiles)结束结束disp (“…”);结束%--------------------------------------------------------------------------函数x = normalizeandsize (x)此函数仅用于基于小波散射和深度学习的语音数字识别%的例子。它可能会在未来的版本中被更改或删除。N =数字(x);如果N > 8192 x = x(1:8192);elseifN < 8192 pad = 8192-N;Prepad =地板(pad/2);Postpad = cell (pad/2);X = [0 (prepad,1);x;0 (postpad 1)];结束X = X /max(abs(X));结束
版权所有2018 The MathWorks, Inc.