主要内容

このペジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

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

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

ネットワクにゼロから学習させるには,最初にデドしなければなりません。データセットのダウンロードやネットワークの学習を行わない場合は,この例にある学習済みのネットワークを読み込んで,以下の2節“事前学習済みネットワクによるコマンド認識”と“マ”を実行することができます。

事前学習済みネットワクによるコマンド認識

学習プロセスの詳細について説明する前に,事前学習済みの音声認識ネットワークを使用して音声コマンドを識別します。

事前学習済みのネットワクを読み込みます。

负载(“commandNet.mat”

ネットワクは次の音声コマンドを認識するように学習済みです。

  • “はい”

  • “いいえ”

  • "上"

  • "下"

  • "左"

  • "右"

  • “オン”

  • “オフ”

  • "停止"

  • "移動"

人が"停止"と発声している短い音声信号を読み込みます。

[x,fs] = audioread(“stop_command.flac”);

コマンドを聞きます。

声音(x, fs)

事前学習済みのネットワクは,聴覚ベスのスペクトログラムを入力として受け取ります。最初に音声の波形を聴覚ベスのスペクトログラムに変換します。

関数extractAuditoryFeatureを使用して聴覚スペクトログラムを計算します。特徴抽出の詳細にいては,この例で後ほど説明します。

auditorySpect = helperExtractAuditoryFeatures(x,fs);

聴覚スペクトログラムに基づいてコマンドを分類します。

command = classification (trainedNet,auditorySpect)
命令=分类停止

ネットワクは,このセットに属さない語を“不明”と分類するように学習済みです。

次に,識別するコマンドの一覧に含まれていない単語(“再生”)を分類します。

音声信号を読み込んで聞きます。

听力读物(“play_command.flac”);声音(x, fs)

聴覚スペクトログラムを計算します。

auditorySpect = helperExtractAuditoryFeatures(x,fs);

信号を分類します。

command = classification (trainedNet,auditorySpect)
命令=类别未知

ネットワークは,バックグラウンドノイズを”バックグラウンド”として分類するように学習済みです。

ランダムなノ邮箱ズで構成される1秒間の信号を作成します。

X = pinknoise(16e3);

聴覚スペクトログラムを計算します。

auditorySpect = helperExtractAuditoryFeatures(x,fs);

バックグラウンドノ邮箱ズを分類します。

command = classification (trainedNet,auditorySpect)
命令=分类背景

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

事前学習済みのコマンド検出ネットワクをマ。是的没有停止など,いずれかのコマンドを発声してみてください。さらに,马文希拉床上房子などの未知の単語や,0から9までの数のいずれかを発声してみてください。

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

classificationRate = 20;adr = audioDeviceReader(“SampleRate”fs,“SamplesPerFrame”、地板(fs / classificationRate));

オディオのバッファを初期化します。ネットワクの分類ラベルを抽出します。ストリミングオディオのラベルと分類確率用の0.5秒のバッファを初期化します。これらのバッファーを使用して長い時間にわたって分類結果を比較し,それによって,コマンドが検出されたタイミングとの”一致“を構築します。判定ロジックのしきい値を指定します。

audioBuffer = dsp.AsyncBuffer(fs);标签= trainedNet.Layers(end).Classes;YBuffer(1:classificationRate/2) = category (“背景”);probBuffer = 0 ([numel(labels),classificationRate/2]);countThreshold = ceil(classificationRate*0.2);probThreshold = 0.7;

图を作成し,作成した图が存在する限りコマンドを検出しますルプ処理を無限に実行するには,期限に設定します。ラereplicationブ検出を停止するには,単に图を閉じます。

H = figure(“单位”“归一化”“位置”,[0.2 0.1 0.6 0.8]);timeLimit = 20;抽搐ishandle(h) && toc < timeLimit从音频设备中提取音频样本,并将样本添加到%缓冲。X = adr();写(audioBuffer x);y = read(audioBuffer,fs,fs- addr . samplesperframe);spec = helperExtractAuditoryFeatures(y,fs);%对当前谱图进行分类,将标签保存到标签缓冲区中,%,并将预测概率保存到概率缓冲区中。[yexpected,probs] = classification (trainedNet,spec,)“ExecutionEnvironment”“cpu”);YBuffer = [YBuffer(2:end), yexpected];probBuffer = [probBuffer(:,2:end),probs(:)];绘制当前波形和谱图。副图(2,1,1)图(y)轴Ylim ([-1,1]) subplot(2,1,2) pcolor(spec') cabis([-4 2.6445])着色现在通过执行一个非常简单的命令来执行实际的命令检测。阈值操作。声明一个检测并将其显示在如果符合以下所有条件,%图标题:1)最常见的标签%不是背景信息。2)最新帧的至少countThreshold%标签同意。3)预测标签的最大概率为% least probThreshold。否则,不声明检测。[YMode,count] = mode(YBuffer);maxProb = max(probBuffer(labels == YMode,:));次要情节(2,1,1)如果YMode = =“背景”|| count < countThreshold || maxProb < probThreshold title(”“其他的标题(string (YMode),“字形大小”, 20)结束drawnow结束

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

この例では,谷歌语音命令デタセット[1]を使用します。デタセットをダウンロドして,ダウンロルを解凍します。PathToDatabaseをデタの場所に設定します。

url =“https://ssd.mathworks.com/金宝appsupportfiles/audio/google_speech.zip”;下载文件夹= tempdir;dataFolder = fullfile(downloadFolder,“google_speech”);如果~存在(dataFolder“dir”) disp (“正在下载数据集(1.4 GB)……”解压缩(url, downloadFolder)结束

学習デタストアの作成

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

ads = audioDatastore(fullfile(dataFolder),“火车”),...“IncludeSubfolders”,真的,...“FileExtensions”“wav”...“LabelSource”“foldernames”
ads = audioDatastore属性:Files:{'…\AppData\Local\Temp\google_speech\train\bed\00176480_nohash_0.wav';’……\ AppData \当地\ Temp \床google_speech \培训\ \ 004 ae714_nohash_0.wav;'…\AppData\Local\Temp\google_speech\train\bed\004ae714_nohash_1.wav'…{'C:\Users\jibrahim\AppData\Local\Temp\google_speech\train'}标签:[bed;床上;床上……{} OutputDataType: 'double' SupportedOutputFormats: ["wav" "flac" "ogg" "mp4" "m4a金宝app"] DefaultOutputFormat: "wav"

認識する単語の選択

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

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

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

命令= categorical([“是的”“不”《飞屋环游记》“向下”“左”“正确”“上”“关闭”“停止”“走”]);isCommand = ismember(ads.Labels,commands);isUnknown = ~isCommand;includerfraction = 0.2;mask = rand(numel(ads.Labels),1) < includerfraction;isUnknown = isUnknown & mask;ads.Labels(isUnknown) = category (“未知”);adsTrain =子集(ads, |isUnknown);countEachLabel (adsTrain)
ans = 11×2表标签计数_______ _____向下1842走1861左边1839没有1853 off 1839在1864右边1852停止1885未知6483向上1843是1860

検証デタストアの作成

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

ads = audioDatastore(fullfile(dataFolder),“验证”),...“IncludeSubfolders”,真的,...“FileExtensions”“wav”...“LabelSource”“foldernames”) isCommand = ismember(ads.Labels,commands);isUnknown = ~isCommand;includerfraction = 0.2;mask = rand(numel(ads.Labels),1) < includerfraction;isUnknown = isUnknown & mask;ads.Labels(isUnknown) = category (“未知”);adsValidation =子集(ads, |isUnknown);countEachLabel (adsValidation)
ads = audioDatastore属性:Files:{'…\AppData\Local\Temp\google_speech\validation\bed\026290a7_nohash_0.wav';’……\ AppData \当地\ Temp \ google_speech \床验证\ \ 060 cd039_nohash_0.wav;'…\AppData\Local\Temp\google_speech\validation\bed\060cd039_nohash_1.wav'…{'C:\Users\jibrahim\AppData\Local\Temp\google_speech\validation'}标签:[bed;床上;床上……和6795更明确]AlternateFileSystemRoots: {} OutputDataType: 'double' SupportedOutputFor金宝appmats: ["wav" "flac" "ogg" "mp4" "m4a"] DefaultOutputFormat: "wav" ans = 11×2 table Label Count _______ _____ down 264 go 260 left 247 no 270 off 256 on 257 right 256 stop 246 unknown 850 up 260 yes 261

デタセット全体を使ってネットワクに学習させ,できる限り精度を高くするには,reduceDatasetに設定します。この例を短時間で実行するには,reduceDataset真正的に設定します。

reducedatset = false;如果reducedatset numUniqueLabels = numel(unique(adsTrain.Labels));将数据集减少20倍adsTrain = splitEachLabel(adsTrain,round(numel(adsTrain. files) / numUniqueLabels / 20));adsValidation = splitEachLabel(adsValidation,round(numel(adsValidation. files) / numUniqueLabels / 20));结束

聴覚スペクトログラムの計算

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

特徴抽出のパラメタを定義します。segmentDurationは各音声クリップの長さ(秒)です。frameDurationはスペクトル計算の各フレムの長さです。hopDurationは各スペクトル間のタ邮箱ムステップです。numBandsは聴覚スペクトログラムのフィルタ数です。

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

Fs = 16e3;%数据集的已知采样率。segmentDuration = 1;frameDuration = 0.025;hopDuration = 0.010;segmentSamples = round(segmentDuration*fs);frameSamples = round(frameDuration*fs);hopSamples = round(hopDuration*fs);overlapSamples = frameSamples - hopSamples;FFTLength = 512;numBands = 50;afe = audioFeatureExtractor(...“SampleRate”fs,...“FFTLength”FFTLength,...“窗口”损害(frameSamples“周期”),...“OverlapLength”overlapSamples,...“barkSpectrum”,真正的);setExtractorParams (afe“barkSpectrum”“NumBands”numBands,“WindowNormalization”、假);

デタセットからファ。畳み込みニュラルネットワクに学習させるには,入力が一定サズでなければなりません。デタセットの一部のファ1秒未満です。ゼロパディングをオディオ信号の前後に適用して長さをsegmentSamplesにします。

x = read(adsTrain);numSamples = size(x,1);numToPadFront = floor((segmentSamples - numSamples)/2);numToPadBack = ceil((segmentSamples - numSamples)/2);xpadding = [0 (numToPadFront,1,“喜欢”, x); x; 0 (numToPadBack 1“喜欢”, x));

オディオの特徴を抽出するには,提取を呼び出します。出力は行に沿った時間をもバクスペクトルです。

features = extract(afe, xpadding);[numHops,numFeatures] = size(features)
numHops = 98 numFeatures = 50

この例では,聴覚スペクトログラムに対数を適用して後処理します。小さい数字の対数を取ると,丸め誤差の原因になります。

処理を高速化するために,parforを使用して複数のワカに特徴抽出を分散できます。

最初に,デタセットの区画数を決定します。并行计算工具箱™がない場合は,単一の区画を使用します。

如果~ isempty(版本(“平行”) && ~ reducedatset池= gcp;numPar = numpartitions(adsTrain,pool);其他的numPar = 1;结束

各区画にいて,デタストアから読み取り,信号をゼロパディングしてから,特徴を抽出します。

parfor2:分区(adsTrain,numPar,ii);XTrain = 0 (numHops,numBands,1,numel(subds.Files));idx = 1:numel(subds. files) x = read(subds);xpadding = [zeros(floor((segmentSamples-size(x,1))/2),1);x;zeros(ceil((segmentSamples-size(x,1))/2),1)];XTrain(:,:,:,idx) = extract(afe, xpadding);结束XTrainC{ii} = XTrain;结束

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

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

ウィンドウのべき乗で特徴をスケリングしてから対数を取ります。滑らかな分布のデタを得るために,小さいオフセットを使用してスペクトログラムの対数を取ります。

Epsil = 1e-6;XTrain = log10(XTrain + epsil);

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

如果~ isempty(版本(“平行”)池= gcp;numPar = numpartitions(adsValidation,pool);其他的numPar = 1;结束parfor2: subds =分区(adsValidation,numPar,ii);XValidation = 0 (numHops,numBands,1,numel(subds.Files));idx = 1:numel(subds. files) x = read(subds);xpadding = [zeros(floor((segmentSamples-size(x,1))/2),1);x;zeros(ceil((segmentSamples-size(x,1))/2),1)];XValidation(:,:,:,idx) = extract(afe, xpadding);结束XValidationC{ii} = XValidation;结束XValidation = cat(4,XValidationC{:});XValidation = log10(XValidation + epsil);

学習ラベルと検証ラベルを分離します。空のカテゴリを削除します。

YTrain = removecats(adsTrain.Labels);YValidation = removecats(adsValidation.Labels);

デタの可視化

いく。対応するオディオクリップを再生します。

specMin = min(XTrain,[],“所有”);specMax = max(XTrain,[],“所有”);idx = randperm(numel(adsTrain.Files),3);图(“单位”“归一化”“位置”,[0.2 0.2 0.6 0.6]);i = 1:3 [x,fs] = audioread(adsTrain.Files{idx(i)});副图(2,3,i)图(x)轴标题(string (adsTrain.Labels (idx (i))))次要情节(2 3 i + 3) spect = (XTrain (:,: 1, idx(我)');pcolor(spect) cabis ([specMin specMax])着色声音(x, fs)暂停(2)结束

バックグラウンドノ邮箱ズデ邮箱タの追加

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

_background_フォルダーのオーディオファイルを使用して,バックグラウンドノイズの1秒間のクリップのサンプルを作成します。各バックグラウンドノ邮箱ズファ邮箱ルから同じ数のバックグラウンドクリップを作成します。また,バックグラウンドノ_background_フォルダに追加することもできます。スペクトログラムを計算する前に,この関数は,対数一様分布からサンプリングされた係数を使用して,volumeRangeで与えられた範囲に各オディオクリップを再スケリングします。

adsBkg = audioDatastore(fullfile(dataFolder),“背景”)) numkgclips = 4000;如果reducedatset numberkgclips = numberkgclips /20;结束volumeRange = log10([1e-4,1]);numkgfiles = numel(adsBkg.Files);numClipsPerFile = histcounts(1: numkgclips,linspace(1, numkgclips, numkgfiles +1));Xbkg = 0 (size(XTrain,1),size(XTrain,2),1,“单一”);bkgAll = readall(adsBkg);Ind = 1;count = 1: numkgfiles bkg = bkgAll{count};idxStart = randi(numel(bkg)-fs,numClipsPerFile(count),1);idxEnd = idxStart+fs-1;^((volumeRange(2)-volumeRange(1))*rand(numClipsPerFile(count),1) + volumeRange(1));j = 1:numClipsPerFile(count) x = bkg(idxStart(j):idxEnd(j))*增益(j);X = max(min(X,1),-1);Xbkg(:,:,:,ind) =提取(afe,x);如果国防部(印第安纳州,1000)= = 0 disp (“加工”+字符串(ind) +“背景剪辑出来”+字符串(numBkgClips))结束Ind = Ind + 1;结束结束Xbkg = log10(Xbkg + epsil);
adsBkg = audioDatastore属性:Files:{'…\AppData\Local\Temp\google_speech\background\ doing_the_碟。wav';“…\ AppData \当地背景\ Temp \ google_speech \ \ dude_miaowing.wav;'…\AppData\Local\Temp\google_speech\background\exercise_bike.wav'…{'C:\Users\jibrahim\AppData\Local\Temp\google_speech\background'} AlternateFileSystemRoots: {} OutputDataType: 'double' Labels: {} SupportedOutputFormats: 金宝app["wav" "flac" "ogg" "mp4" "m4a"] DefaultOutputFormat: "wav"处理4000个背景剪辑中的1000个处理4000个背景剪辑中的2000个处理4000个背景剪辑中的3000个处理4000个背景剪辑中的4000个

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

numTrainBkg = floor(0.85* numkgclips);numValidationBkg = floor(0.15* numkgclips);XTrain(:,:,: + 1:终端+ numTrainBkg) = Xbkg (:,:,:, 1: numTrainBkg);YTrain(+ 1:结束+ numTrainBkg) =“背景”;XValidation(:,:,:,end+1:end+numValidationBkg) = Xbkg(:,:,:,numTrainBkg+1:end);YValidation(+ 1:结束+ numValidationBkg) =“背景”

学習セットと検証セット内のさまざまなクラスラベルの分布をプロットします。

图(“单位”“归一化”“位置”,[0.2 0.2 0.5 0.5]) subplot(2,1,1)直方图(YTrain) title(“培训标签发放”)子图(2,1,2)直方图(YValidation)“验证标签分发”

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

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

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

重み付き交差エントロピ分類損失を使用します。weightedClassificationLayer (classWeights)は,classWeightsによって重み付けされた観測値を使用して交差エントロピ損失を計算するカスタム分類層を作成します。类别(YTrain)に現れるクラスと同じ順序でクラスの重みを指定します。各クラスの損失の合計重みを等しくするために,各クラスの学習例の数に反比例するクラスの重みを使用します。ネットワクの学習に Adam オプティマイザーを使用する場合、学習アルゴリズムはクラスの重み全体の正規化に依存しません。

classWeights = 1./countcats(YTrain);classWeights = classWeights'/mean(classWeights);numClasses = numel(categories(YTrain));timePoolSize = cel (numHops/8);dropoutProb = 0.2;numF = 12;layers = [imageInputLayer([numHops numBands]) convolution2dLayer(3,numF,“填充”“相同”maxPooling2dLayer(3,“步”2,“填充”“相同”) convolution2dLayer (3 2 * numF“填充”“相同”maxPooling2dLayer(3,“步”2,“填充”“相同”) convolution2dLayer(3、4 * numF,“填充”“相同”maxPooling2dLayer(3,“步”2,“填充”“相同”) convolution2dLayer(3、4 * numF,“填充”“相同”) reluLayer卷积2dlayer (3,4*numF,“填充”“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer([timePoolSize,1]) dropoutLayer(dropoutProb) fullyConnectedLayer(numClasses) softmaxLayer weightedClassificationLayer(classWeights)];

ネットワクの学習

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

miniBatchSize = 128;validationFrequency = floor(numl (YTrain)/miniBatchSize);options = trainingOptions(“亚当”...“InitialLearnRate”3的军医,...“MaxEpochs”25岁的...“MiniBatchSize”miniBatchSize,...“洗牌”“every-epoch”...“阴谋”“训练进步”...“详细”假的,...“ValidationData”{XValidation, YValidation},...“ValidationFrequency”validationFrequency,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”, 20);

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

trainedNet = trainNetwork(XTrain,YTrain,layers,options);

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

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

如果reduceDataset负载(“commandNet.mat”“trainedNet”);结束YValPred = classification (trainedNet,XValidation);validationError = mean(YValPred ~= YValidation);YTrainPred = classification (trainedNet,XTrain);trainError = mean(YTrainPred ~= YTrain);disp (“训练错误:”+ trainError*100 +“%”) disp ("验证错误:"+ validationError*100 +“%”
训练误差:1.907%验证误差:5.5376%

混同行列をプロットします。列と行の要約を使用して,各クラスの適合率と再現率を表示します。混同行列のクラスを並べ替えます。大きな認識の違いが現れるのは,未知の単語間,コマンド向上下来没有,および没有の間にあります。

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

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

Info = whoos (“trainedNet”);disp (“网络规模:”+信息。字节/ 1024 +“知识库”i = 1:100 x = randn([numHops,numBands]);tic [yexpected,probs] = classification (trainedNet,x,)“ExecutionEnvironment”“cpu”);时间(i) = toc;结束disp (CPU上的单图像预测时间:+平均值(时间(11:结束))*1000 +“女士”
网络大小:286.7402 kB CPU上的单图像预测时间:2.5119毫秒

参考文献

监狱长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

参考

||

関連するトピック