Main Content

後期融合を使用した音響シーン認識

この例では、音響シーン認識のためのマルチモデル後期融合システムを作成する方法を説明します。この例では、メル スペクトログラムと、ウェーブレット散乱によるアンサンブル分類器を使用して、畳み込みニューラル ネットワーク (CNN) に学習させます。ここでは TUT データセットを使用して学習と評価を行います [1]

はじめに

音響シーン分類 (ASC) は、環境が発している音に基づいて環境を分類するタスクです。ASC は、デバイス、ロボット、その他さまざまなアプリケーションのコンテキスト アウェアネスの基礎となる汎用の分類問題です [1]。ASC の初期の試みでは、メル周波数ケプストラム係数 (mfcc (Audio Toolbox)) と混合ガウス モデル (GMM) を使用して統計分布が記述されていました。ASC で使用されているその他の良く知られた特徴として、ゼロ交差率、スペクトル重心 (spectralCentroid (Audio Toolbox))、スペクトル ロールオフ (spectralRolloffPoint (Audio Toolbox))、スペクトル フラックス (spectralFlux (Audio Toolbox))、および線形予測係数 (lpc (Signal Processing Toolbox)) があります [5]。GMM の時間的発展を記述するため、隠れマルコフ モデル (HMM) に学習させていました。最近の性能が最も優れたシステムでは、深層学習 (通常は CNN) や、複数のモデルの融合が使用されてきました。DCASE 2017 コンテストで上位にランクされたシステムで最もよく使われた特徴は、メル スペクトログラム (melSpectrogram (Audio Toolbox)) でした。このチャレンジで上位にランクしたシステムは、後期融合とデータ拡張を使用してシステムを一般化しています。

この例では、妥当な結果を生成する簡単な方法を説明するために、メル スペクトログラムと、ウェーブレット散乱によるアンサンブル分類器を使用して、CNN に学習させます。CNN とアンサンブル分類器は、全体の精度はほぼ同じですが、区別の対象となる音響シーンによってそれぞれ性能が異なります。全体的な精度を向上させるには、後期融合を使用して CNN の結果とアンサンブル分類器の結果をマージします。

音響シーン認識用のデータセットの読み込み

この例を実行するには、まず、データ セットをダウンロードしなければなりません [1]。このデータセット全体は約 15.5 GB です。お使いのマシンとインターネット接続によっては、データのダウンロードに約 4 時間かかることがあります。

downloadFolder = tempdir;
dataset = fullfile(downloadFolder,"TUT-acoustic-scenes-2017");

if ~datasetExists(dataset)
    disp("Downloading TUT-acoustic-scenes-2017 (15.5 GB) ...")
    HelperDownload_TUT_acoustic_scenes_2017(dataset);
end

開発セットのメタデータを table として読み取ります。table 変数は FileNameAcousticScene、および SpecificLocation という名前にします。

trainMetaData = readtable(fullfile(dataset,"TUT-acoustic-scenes-2017-development","meta"), ...
    Delimiter={'\t'}, ...
    ReadVariableNames=false);
trainMetaData.Properties.VariableNames = ["FileName","AcousticScene","SpecificLocation"];
head(trainMetaData)
             FileName             AcousticScene    SpecificLocation
    __________________________    _____________    ________________

    {'audio/b020_90_100.wav' }      {'beach'}          {'b020'}    
    {'audio/b020_110_120.wav'}      {'beach'}          {'b020'}    
    {'audio/b020_100_110.wav'}      {'beach'}          {'b020'}    
    {'audio/b020_40_50.wav'  }      {'beach'}          {'b020'}    
    {'audio/b020_50_60.wav'  }      {'beach'}          {'b020'}    
    {'audio/b020_30_40.wav'  }      {'beach'}          {'b020'}    
    {'audio/b020_160_170.wav'}      {'beach'}          {'b020'}    
    {'audio/b020_170_180.wav'}      {'beach'}          {'b020'}    
testMetaData = readtable(fullfile(dataset,"TUT-acoustic-scenes-2017-evaluation","meta"), ...
    Delimiter={'\t'}, ...
    ReadVariableNames=false);
testMetaData.Properties.VariableNames = ["FileName","AcousticScene","SpecificLocation"];
head(testMetaData)
         FileName         AcousticScene    SpecificLocation
    __________________    _____________    ________________

    {'audio/1245.wav'}      {'beach'}          {'b174'}    
    {'audio/1456.wav'}      {'beach'}          {'b174'}    
    {'audio/1318.wav'}      {'beach'}          {'b174'}    
    {'audio/967.wav' }      {'beach'}          {'b174'}    
    {'audio/203.wav' }      {'beach'}          {'b174'}    
    {'audio/777.wav' }      {'beach'}          {'b174'}    
    {'audio/231.wav' }      {'beach'}          {'b174'}    
    {'audio/768.wav' }      {'beach'}          {'b174'}    

テスト セット内の特定の録音位置は、開発セット内の録音位置と交差しないことに注意してください。これにより、学習済みのモデルを実世界のシナリオに一般化できるかどうかを検証しやすくなります。

sharedRecordingLocations = intersect(testMetaData.SpecificLocation,trainMetaData.SpecificLocation);
disp("Number of specific recording locations in both train and test sets = " + numel(sharedRecordingLocations))
Number of specific recording locations in both train and test sets = 0

メタデータ テーブルの最初の変数には、ファイル名が含まれています。ファイル名とファイル パスを連結します。

trainFilePaths = fullfile(dataset,"TUT-acoustic-scenes-2017-development",trainMetaData.FileName);

testFilePaths = fullfile(dataset,"TUT-acoustic-scenes-2017-evaluation",testMetaData.FileName);

データ セット内に存在しないファイルがメタデータにリストされている場合があります。存在しないファイルに対応するファイル パスと音響シーン ラベルを削除します。

ads = audioDatastore(dataset,IncludeSubfolders=true);
allFiles = ads.Files;

trainIdxToRemove = ~ismember(trainFilePaths,allFiles);
trainFilePaths(trainIdxToRemove) = [];
trainLabels = categorical(trainMetaData.AcousticScene);
trainLabels(trainIdxToRemove) = [];

testIdxToRemove = ~ismember(testFilePaths,allFiles);
testFilePaths(testIdxToRemove) = [];
testLabels = categorical(testMetaData.AcousticScene);
testLabels(testIdxToRemove) = [];

学習セットとテスト セットのためのオーディオ データストアを作成します。audioDatastore (Audio Toolbox)Labels プロパティを音響シーンに設定します。countEachLabel (Audio Toolbox)を呼び出して、学習セットとテスト セット両方のラベルが均等に分布していることを確認します。

adsTrain = audioDatastore(trainFilePaths, ...
    Labels=trainLabels, ...
    IncludeSubfolders=true);
display(countEachLabel(adsTrain))
  15×2 table

         Label          Count
    ________________    _____

    beach                312 
    bus                  312 
    cafe/restaurant      312 
    car                  312 
    city_center          312 
    forest_path          312 
    grocery_store        312 
    home                 312 
    library              312 
    metro_station        312 
    office               312 
    park                 312 
    residential_area     312 
    train                312 
    tram                 312 
adsTest = audioDatastore(testFilePaths, ...
    Labels=testLabels, ...
    IncludeSubfolders=true);
display(countEachLabel(adsTest))
  15×2 table

         Label          Count
    ________________    _____

    beach                108 
    bus                  108 
    cafe/restaurant      108 
    car                  108 
    city_center          108 
    forest_path          108 
    grocery_store        108 
    home                 108 
    library              108 
    metro_station        108 
    office               108 
    park                 108 
    residential_area     108 
    train                108 
    tram                 108 

この例で使用されているデータセットを小さくすると、性能は低下しますが、速度を上げることができます。一般に、開発とデバッグではデータセットを小さくすることをお勧めします。speedupExampletrue に設定してデータ セットを小さくします。

speedupExample = false;
if speedupExample
    adsTrain = splitEachLabel(adsTrain,20);
    adsTest = splitEachLabel(adsTest,10);
end
trainLabels = adsTrain.Labels;
testLabels = adsTest.Labels;

read (Audio Toolbox)を呼び出して、学習セットからファイルのデータとサンプル レートを取得します。データベースに含まれるオーディオは、一貫したサンプル レートと再生時間をもちます。オーディオを正規化して再生します。対応するラベルを表示します。

[data,adsInfo] = read(adsTrain);
data = data./max(data,[],"all");

fs = adsInfo.SampleRate;
sound(data,fs)

disp("Acoustic scene = " + string(adsTrain.Labels(1)))
Acoustic scene = beach

reset (Audio Toolbox)を呼び出して、データストアを初期状態に戻します。

reset(adsTrain)

CNN の特徴抽出

データセット内のオーディオ クリップは、それぞれ 10 秒間のステレオ (左右) オーディオで構成されています。この例の特徴抽出パイプラインと CNN アーキテクチャは、[3] に基づいています。特徴抽出のハイパーパラメーター、CNN アーキテクチャ、および学習オプションは、体系的なハイパーパラメーター最適化ワークフローを使用して、元の論文から変更されています。

最初に、オーディオをミッドサイド符号化に変換します。[3] では、ミッドサイド符号化で処理したデータはより優れた空間情報を提供することが示されており、CNN は、この情報を使用して移動するソース (音響シーンを横切る列車など) を特定することができます。

dataMidSide = [sum(data,2),data(:,1)-data(:,2)];

信号を、オーバーラップする 1 秒間のセグメントに分割します。最終的なシステムでは、1 秒間のセグメントに対して確率加重平均を適用し、テスト セットに含まれる 10 秒間の各オーディオ クリップのシーンを予測します。オーディオ クリップを 1 秒間のセグメントに分割することで、ネットワークに学習させやすくなり、学習セットに含まれる特定の音響イベントへの過適合を防ぐことができます。オーバーラップによって、相互に関連がある特徴のすべての組み合わせを学習データに確実に取り込むことができます。また、これにより、システムに追加のデータが提供されます。追加のデータは拡張時に一意に混合することができます。

segmentLength = 1;
segmentOverlap = 0.5;

[dataBufferedMid,~] = buffer(dataMidSide(:,1),round(segmentLength*fs),round(segmentOverlap*fs),"nodelay");
[dataBufferedSide,~] = buffer(dataMidSide(:,2),round(segmentLength*fs),round(segmentOverlap*fs),"nodelay");
dataBuffered = zeros(size(dataBufferedMid,1),size(dataBufferedMid,2)+size(dataBufferedSide,2));
dataBuffered(:,1:2:end) = dataBufferedMid;
dataBuffered(:,2:2:end) = dataBufferedSide;

melSpectrogram (Audio Toolbox)を使用して、データをコンパクトな周波数領域の表現に変換します。[3] で示されているように、メル スペクトログラムのパラメーターを定義します。

windowLength = 2048;
samplesPerHop = 1024;
samplesOverlap = windowLength - samplesPerHop;
fftLength = 2*windowLength;
numBands = 128;

melSpectrogram は、チャネルごとに独立して作用します。処理時間を最適化するために、バッファーされた信号全体を渡して melSpectrogram を呼び出します。

spec = melSpectrogram(dataBuffered,fs, ...
    Window=hamming(windowLength,"periodic"), ...
    OverlapLength=samplesOverlap, ...
    FFTLength=fftLength, ...
    NumBands=numBands, ...
    ApplyLog=true);

この配列を、(帯域数)×(ホップ数)×(チャネル数)×(セグメント数) の次元に形状変換します。ニューラル ネットワークにイメージを入力すると、最初の 2 つの次元はイメージの高さと幅、3 つ目の次元はチャネル、4 つ目の次元は各イメージの区切りになります。

X = reshape(spec,size(spec,1),size(spec,2),size(data,2),[]);

melSpectrogram を出力引数なしで呼び出し、1 秒のインクリメントの最初の 6 つについて中間チャネルのメル スペクトログラムをプロットします。

tiledlayout(3,2)
for channel = 1:2:11
    nexttile
    melSpectrogram(dataBuffered(:,channel),fs, ...
        Window=hamming(windowLength,"periodic"), ...
        OverlapLength=samplesOverlap, ...
        FFTLength=fftLength, ...
        NumBands=numBands, ...
        ApplyLog=true);
    title("Segment " + ceil(channel/2))
end

補助関数 HelperSegmentedMelSpectrograms は、前述の特徴抽出手順を実行します。

データストア内にあるすべてのファイルに対して特徴抽出手順を適用するには、変換データストアを作成し、関数 HelperSegmentedMelSpectrograms を変換として指定します。後続の処理を高速化するには、readall を使用してすべてのファイルを読み取り、抽出した特徴量をメモリ内に配置します。Parallel Computing Toolbox™ がある場合、変換データストアは、並列プールを活用してファイルの読み取りと前処理を高速化できます。

tdsTrain = transform(adsTrain,@(x){HelperSegmentedMelSpectrograms(x,fs, ...
    SegmentLength=segmentLength, ...
    SegmentOverlap=segmentOverlap, ...
    WindowLength=windowLength, ...
    HopLength=samplesPerHop, ...
    NumBands=numBands, ...
    FFTLength=fftLength)});
xTrain = readall(tdsTrain,UseParallel=canUseParallelPool);
Starting parallel pool (parpool) using the 'local' profile ...
16-Nov-2023 12:40:45: Job Queued. Waiting for parallel pool job with ID 1 to start ...
16-Nov-2023 12:41:46: Job Queued. Waiting for parallel pool job with ID 1 to start ...
Connected to parallel pool with 6 workers.
xTrain = cat(4,xTrain{:});

tdsTest = transform(adsTest,@(x){HelperSegmentedMelSpectrograms(x,fs, ...
    SegmentLength=segmentLength, ...
    SegmentOverlap=segmentOverlap, ...
    WindowLength=windowLength, ...
    HopLength=samplesPerHop, ...
    NumBands=numBands, ...
    FFTLength=fftLength)});
xTest = readall(tdsTest,UseParallel=canUseParallelPool);
xTest = cat(4,xTest{:});

セグメントと 1 対 1 で対応するように、学習セットとテスト セットのラベルを複製します。

numSegmentsPer10seconds = size(dataBuffered,2)/2;
yTrain = repmat(trainLabels,1,numSegmentsPer10seconds)';
yTrain = yTrain(:);
yTest = repmat(testLabels,1,numSegmentsPer10seconds)';
yTest = yTest(:);

CNN 用のデータ拡張

DCASE 2017 データセットには、このタスク用に比較的少量の音響記録が含まれており、開発セットと評価セットはそれぞれ異なる特定の場所で録音されたものです。そのため、学習中にデータへの過適合が生じやすくなります。過適合を減らすためによく使われる方法の 1 つに、mixup があります。mixup では、2 つの異なるクラスの特徴を混合してデータセットを拡張します。特徴を混合する場合、それと同じ比率でラベルを混合します。次のようになります。

x=λxi+(1-λ)xjy=λyi+(1-λ)yj

[2] では、mixup は混合されたラベルではなく、確率分布から抽出されたラベルとして再定式化されています。この例で使用する mixup の実装は、簡略化されたバージョンの mixup です。ここでは各スペクトログラムが異なるラベルをもつスペクトログラムと混合され、ラムダは 0.5 に設定されています。元のデータセットと混合されたデータセットが学習用に結合されます。

xTrainExtra = xTrain;
yTrainExtra = yTrain;
lambda = 0.5;
for ii = 1:size(xTrain,4)
    
    % Find all available spectrograms with different labels.
    availableSpectrograms = find(yTrain~=yTrain(ii));
    
    % Randomly choose one of the available spectrograms with a different label.
    numAvailableSpectrograms = numel(availableSpectrograms);
    idx = randi([1,numAvailableSpectrograms]);
    
    % Mix.
    xTrainExtra(:,:,:,ii) = lambda*xTrain(:,:,:,ii) + (1-lambda)*xTrain(:,:,:,availableSpectrograms(idx));
    
    % Specify the label as randomly set by lambda.
    if rand > lambda
        yTrainExtra(ii) = yTrain(availableSpectrograms(idx));
    end
end
xTrain = cat(4,xTrain,xTrainExtra);
yTrain = [yTrain;yTrainExtra];

summary を呼び出して、拡張された学習セットのラベルの分布を表示します。

summary(yTrain)
     beach                 11769 
     bus                   11904 
     cafe/restaurant       11873 
     car                   11820 
     city_center           11886 
     forest_path           11936 
     grocery_store         11914 
     home                  11923 
     library               11817 
     metro_station         11804 
     office                11922 
     park                  11871 
     residential_area      11704 
     train                 11773 
     tram                  11924 

CNN の定義と学習

CNN アーキテクチャを定義します。このアーキテクチャは [1] に基づいており、試行錯誤によって変更が加えられます。MATLAB® で使用可能な深層学習層の詳細については、深層学習層の一覧 (Deep Learning Toolbox)を参照してください。

imgSize = [size(xTrain,1),size(xTrain,2),size(xTrain,3)];
numF = 32;
layers = [ ...
    imageInputLayer(imgSize)
    
    batchNormalizationLayer
    
    convolution2dLayer(3,numF,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,numF,Padding="same")
    batchNormalizationLayer
    reluLayer 
    
    maxPooling2dLayer(3,Stride=2,Padding="same")

    convolution2dLayer(3,2*numF,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,2*numF,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(3,Stride=2,Padding="same")
    
    convolution2dLayer(3,4*numF,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,4*numF,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(3,Stride=2,Padding="same")
    
    convolution2dLayer(3,8*numF,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,8*numF,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    globalAveragePooling2dLayer
    
    dropoutLayer(0.5)
    
    fullyConnectedLayer(15)
    softmaxLayer];

CNN 用のtrainingOptions (Deep Learning Toolbox)を定義します。これらのオプションは [3] に基づいており、体系的なハイパーパラメーター最適化ワークフローによって変更が加えられます。

miniBatchSize = 128;
tuneme = 128;
lr = 0.05*miniBatchSize/tuneme;
options = trainingOptions( ...
    "sgdm", ...
    Momentum=0.9, ...
    L2Regularization=0.005, ...
    ...
    MiniBatchSize=miniBatchSize, ...
    MaxEpochs=8, ...
    Shuffle="every-epoch", ...
    ...
    Plots="training-progress", ...
    Verbose=false, ...
    Metrics="accuracy", ...
    ...
    InitialLearnRate=lr, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropPeriod=2, ...
    LearnRateDropFactor=0.2, ...
    ...
    ValidationData={xTest,yTest}, ...
    ValidationFrequency=floor(size(xTrain,4)/miniBatchSize));

trainnet を呼び出してネットワークに学習させます。

trainedNet = trainnet(xTrain,yTrain,layers,"crossentropy",options);

CNN の評価

minibatchpredict を呼び出し、ホールドアウトされたテスト セットを使用して学習済みネットワークの応答を予測します。

cnnResponsesPerSegment = minibatchpredict(trainedNet,xTest);

10 秒間の各オーディオ クリップにわたる応答を平均化します。

classes = unique(trainLabels);
numFiles = numel(testLabels);

counter = 1;
cnnResponses = zeros(numFiles,numel(classes));
for channel = 1:numFiles
    cnnResponses(channel,:) = sum(cnnResponsesPerSegment(counter:counter+numSegmentsPer10seconds-1,:),1)/numSegmentsPer10seconds;
    counter = counter + numSegmentsPer10seconds;
end

10 秒間の各オーディオ クリップについて、予測の最大値を選択し、対応する予測位置にマッピングします。

[~,classIdx] = max(cnnResponses,[],2);
cnnPredictedLabels = classes(classIdx);

confusionchart (Deep Learning Toolbox)を呼び出して、テスト セットの精度を可視化します。

figure(Units="normalized",Position=[0.2 0.2 0.5 0.5])
confusionchart(testLabels,cnnPredictedLabels, ...
    title=["Test Accuracy - CNN","Average Accuracy = " + mean(testLabels==cnnPredictedLabels)*100], ...
    ColumnSummary="column-normalized",RowSummary="row-normalized");

アンサンブル分類器の特徴抽出

[4] では、ウェーブレット散乱が音響シーンの表現に優れていることが示されています。waveletScatteringオブジェクトを定義します。不変スケールと品質係数は、試行錯誤によって決定されています。

sf = waveletScattering(SignalLength=size(data,1), ...
                       SamplingFrequency=fs, ...
                       InvarianceScale=0.75, ...
                       QualityFactors=[4 1]);

オーディオ信号をモノラルに変換します。次にfeatureMatrixを呼び出して、散乱分解フレームワーク sf の散乱係数を返します。

dataMono = mean(data,2);
scatteringCoeffients = featureMatrix(sf,dataMono,Transform="log");

10 秒間のオーディオ クリップにわたる散乱係数を平均化します。

featureVector = mean(scatteringCoeffients,2);
disp("Number of wavelet features per 10-second clip = " + numel(featureVector));
Number of wavelet features per 10-second clip = 286

補助関数 HelperWaveletFeatureVector は、前述の手順を実行します。変換データストアを使用して、特徴抽出を並列処理します。学習セットとテスト セットのためのウェーブレット特徴ベクトルを抽出します。

scatteringTrain = transform(adsTrain,@(x)HelperWaveletFeatureVector(x,sf));
xTrain = readall(scatteringTrain,UseParallel=canUseParallelPool);
xTrain = (reshape(xTrain,numel(featureVector),[]))';
scatteringTest = transform(adsTest,@(x)HelperWaveletFeatureVector(x,sf));
xTest = readall(scatteringTest,UseParallel=canUseParallelPool);
xTest = (reshape(xTest,numel(featureVector),[]))';

アンサンブル分類器の定義と学習

fitcensemble を使用して、学習済みのアンサンブル分類モデル (ClassificationEnsemble) を作成します。

subspaceDimension = min(150,size(xTrain,2) - 1);
numLearningCycles = 30;
classificationEnsemble = fitcensemble(xTrain,trainLabels, ...
    Method="Subspace", ...
    NumLearningCycles=numLearningCycles, ...
    Learners="discriminant", ...
    NPredToSample=subspaceDimension, ...
    ClassNames=removecats(unique(trainLabels)));

アンサンブル分類器の評価

10 秒間の各オーディオ クリップについて、predict を呼び出してラベルと重みを返し、これを対応する予測位置にマッピングします。confusionchart (Deep Learning Toolbox)を呼び出して、テスト セットの精度を可視化します。

[waveletPredictedLabels,waveletResponses] = predict(classificationEnsemble,xTest);

figure(Units="normalized",Position=[0.2 0.2 0.5 0.5])
confusionchart(testLabels,waveletPredictedLabels, ...
    title=["Test Accuracy - Wavelet Scattering","Average Accuracy = " + mean(testLabels==waveletPredictedLabels)*100], ...
    ColumnSummary="column-normalized",RowSummary="row-normalized");

fprintf('Average accuracy of classifier = %0.2f\n',mean(testLabels==waveletPredictedLabels)*100)
Average accuracy of classifier = 75.74

後期融合の適用

10 秒間の各クリップについて、ウェーブレット分類器と CNN に対して predict を呼び出すと、その判定の相対的な信頼度を表すベクトルが返されます。waveletResponsescnnResponses を乗算し、後期融合システムを作成します。

fused = waveletResponses.*cnnResponses;
[~,classIdx] = max(fused,[],2);

predictedLabels = classes(classIdx);

後期融合の評価

confusionchart を呼び出して、融合された分類の精度を可視化します。

figure(Units="normalized",Position=[0.2 0.2 0.5 0.5])
confusionchart(testLabels,predictedLabels, ...
    Title=["Test Accuracy - Fusion","Average Accuracy = " + mean(testLabels==predictedLabels)*100], ...
    ColumnSummary="column-normalized",RowSummary="row-normalized");

サポート関数

HelperSegmentedMelSpectrograms

function X = HelperSegmentedMelSpectrograms(x,fs,options)
% Copyright 2019-2023 The MathWorks, Inc.

arguments
    x
    fs
    options.WindowLength = 1024
    options.HopLength = 512
    options.NumBands = 128
    options.SegmentLength = 1
    options.SegmentOverlap = 0
    options.FFTLength = 1024
end


x = [sum(x,2),x(:,1)-x(:,2)];
x = x./max(max(x));

[xb_m,~] = buffer(x(:,1),round(options.SegmentLength*fs),round(options.SegmentOverlap*fs),"nodelay");
[xb_s,~] = buffer(x(:,2),round(options.SegmentLength*fs),round(options.SegmentOverlap*fs),"nodelay");
xb = zeros(size(xb_m,1),size(xb_m,2)+size(xb_s,2));
xb(:,1:2:end) = xb_m;
xb(:,2:2:end) = xb_s;

spec = melSpectrogram(xb,fs, ...
    Window=hamming(options.WindowLength,"periodic"), ...
    OverlapLength=options.WindowLength - options.HopLength, ...
    FFTLength=options.FFTLength, ...
    NumBands=options.NumBands, ...
    FrequencyRange=[0,floor(fs/2)], ...
    ApplyLog=true);

X = reshape(spec,size(spec,1),size(spec,2),size(x,2),[]);
end

HelperWaveletFeatureExtractor

function features = HelperWaveletFeatureVector(x,sf)
% Copyright 2019-2023 The MathWorks, Inc.
if canUseGPU
    x = gpuArray(x);
end
x = mean(x,2);
features = featureMatrix(sf,x,Transform="log");
features = gather(mean(features,2));
end

参考文献

[1] A. Mesaros, T. Heittola, and T. Virtanen. Acoustic Scene Classification: an Overview of DCASE 2017 Challenge Entries. In proc. International Workshop on Acoustic Signal Enhancement, 2018.

[2] Huszar, Ferenc. "Mixup: Data-Dependent Data Augmentation." InFERENCe. November 03, 2017.Accessed January 15, 2019. https://www.inference.vc/mixup-data-dependent-data-augmentation/.

[3] Han, Yoonchang, Jeongsoo Park, and Kyogu Lee. "Convolutional neural networks with binaural representations and background subtraction for acoustic scene classification." the Detection and Classification of Acoustic Scenes and Events (DCASE) (2017): 1-5.

[4] Lostanlen, Vincent, and Joakim Anden. Binaural scene classification with wavelet scattering. Technical Report, DCASE2016 Challenge, 2016.

[5] A. J. Eronen, V. T. Peltonen, J. T. Tuomi, A. P. Klapuri, S. Fagerlund, T. Sorsa, G. Lorho, and J. Huopaniemi, "Audio-based context recognition," IEEE Trans. on Audio, Speech, and Language Processing, vol 14, no. 1, pp. 321-329, Jan 2006.

[6] TUT Acoustic scenes 2017, Development dataset

[7] TUT Acoustic scenes 2017, Evaluation dataset

参考

関連する例

詳細