В этом примере показано, как развернуть извлечение признаков и сверточную нейронную сеть (CNN) для речевого распознавания команды на процессорах Intel®. Чтобы сгенерировать извлечение признаков и сетевой код, вы используете MATLAB Coder и Math Kernel Library Intel для Глубоких нейронных сетей (MKL-DNN). В этом примере сгенерированный код является исполняемым файлом MATLAB (MEX) функция, которая вызвана скриптом MATLAB, который отображает предсказанную речевую команду наряду с сигналом области времени и слуховой спектрограммой. Для получения дополнительной информации о предварительной обработке аудио и сетевом обучении, смотрите Распознание речевых команд с использованием глубокого обучения.
Интерфейс MATLAB Coder для пакета поддержки глубокого обучения
Процессор Xeon с поддержкой Intel Усовершенствованные Векторные Расширения 2 (Intel AVX2)
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Переменные окружения для Intel MKL-DNN
Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder).
Используйте те же параметры для конвейера извлечения признаков и классификации, как разработано в Распознании речевых команд с использованием глубокого обучения.
Задайте ту же частоту дискретизации, сеть была обучена на (16 кГц). Задайте уровень классификации и количество входа аудиосэмплов на систему координат. Вход функции к сети является спектрограммой Коры, которая соответствует 1 секунде аудиоданных. Спектрограмма Коры вычисляется для 25 MS Windows с транзитными участками на 10 мс.
fs = 16000; classificationRate = 20; samplesPerCapture = fs/classificationRate; segmentDuration = 1; segmentSamples = round(segmentDuration*fs); frameDuration = 0.025; frameSamples = round(frameDuration*fs); hopDuration = 0.010; hopSamples = round(hopDuration*fs);
Создайте audioFeatureExtractor
возразите, чтобы извлечь спектрограммы Коры с 50 полосами без нормализации окна.
afe = audioFeatureExtractor( ... 'SampleRate',fs, ... 'FFTLength',512, ... 'Window',hann(frameSamples,'periodic'), ... 'OverlapLength',frameSamples - hopSamples, ... 'barkSpectrum',true); numBands = 50; setExtractorParams(afe,'barkSpectrum','NumBands',numBands,'WindowNormalization',false);
Загрузите предварительно обученную сверточную нейронную сеть и метки.
load('commandNet.mat') labels = trainedNet.Layers(end).Classes; numLabels = numel(labels); backgroundIdx = find(labels == 'background');
Задайте буферы и пороги решения, чтобы отправить предсказания сети процесса.
probBuffer = single(zeros([numLabels,classificationRate/2])); YBuffer = single(numLabels * ones(1, classificationRate/2)); countThreshold = ceil(classificationRate*0.2); probThreshold = single(0.7);
Создайте audioDeviceReader
возразите, чтобы считать аудио из вашего устройства. Создайте dsp.AsyncBuffer
возразите, чтобы буферизовать аудио во фрагменты.
adr = audioDeviceReader('SampleRate',fs,'SamplesPerFrame',samplesPerCapture,'OutputDataType','single'); audioBuffer = dsp.AsyncBuffer(fs);
Создайте dsp.MatrixViewer
возразите и timescope
объект отобразить результаты.
matrixViewer = dsp.MatrixViewer("ColorBarLabel","Power per band (dB/Band)", ... "XLabel","Frames", ... "YLabel","Bark Bands", ... "Position",[400 100 600 250], ... "ColorLimits",[-4 2.6445], ... "AxisOrigin",'Lower left corner', ... "Name","Speech Command Recognition Using Deep Learning"); timeScope = timescope('SampleRate', fs, ... 'YLimits',[-1 1], 'Position', [400 380 600 250], ... 'Name','Speech Command Recognition Using Deep Learning', ... 'TimeSpanSource','Property', ... 'TimeSpan',1, ... 'BufferLength',fs); timeScope.YLabel = 'Amplitude'; timeScope.ShowGrid = true;
Покажите осциллограф времени и матричное средство просмотра. Обнаружьте команды, пока и осциллограф времени и матричное средство просмотра открыты или пока ограничение по времени не достигнуто. Чтобы остановить живое обнаружение перед, ограничение по времени достигнуто, закройте окно scope времени или матричное окно средства просмотра.
show(timeScope) show(matrixViewer) timeLimit = 10; tic while isVisible(timeScope) && isVisible(matrixViewer) && toc < timeLimit %% Capture Audio x = adr(); write(audioBuffer,x); y = read(audioBuffer,fs,fs-samplesPerCapture); % Compute auditory features features = extract(afe,y); auditory_features = log10(features + 1e-6); % Transpose to get the auditory spectrum auditorySpectrum = auditory_features'; % Perform prediction probs = predict(trainedNet, auditory_features); [~, YPredicted] = max(probs); % Perform statistical post processing YBuffer = [YBuffer(2:end),YPredicted]; probBuffer = [probBuffer(:,2:end),probs(:)]; [YMode_idx, count] = mode(YBuffer); count = single(count); maxProb = max(probBuffer(YMode_idx,:)); if (YMode_idx == single(backgroundIdx) || count < countThreshold || maxProb < probThreshold) speechCommandIdx = backgroundIdx; else speechCommandIdx = YMode_idx; end % Update plots matrixViewer(auditorySpectrum); timeScope(x); if (speechCommandIdx == backgroundIdx) timeScope.Title = ' '; else timeScope.Title = char(labels(speechCommandIdx)); end drawnow end
Скройте осциллографы.
hide(matrixViewer) hide(timeScope)
Чтобы создать функцию, чтобы выполнить извлечение признаков, совместимое с генерацией кода, вызовите generateMATLABFunction
на audioFeatureExtractor
объект. generateMATLABFunction
объектная функция создает автономную функцию, которая выполняет эквивалентное извлечение признаков и совместима с генерацией кода.
generateMATLABFunction(afe,'extractSpeechFeatures')
HelperSpeechCommandRecognition, поддерживающий функцию, инкапсулирует извлечение признаков и сетевой процесс предсказания, продемонстрированный ранее. Так, чтобы извлечение признаков было совместимо с генерацией кода, извлечение признаков обработано сгенерированным extractSpeechFeatures
функция. Так, чтобы сеть была совместима с генерацией кода, функция поддержки использует coder.loadDeepLearningNetwork
(MATLAB Coder) функция, чтобы загрузить сеть.
Используйте функцию HelperSpeechCommandRecognition, чтобы выполнить живое обнаружение речевых команд.
show(timeScope) show(matrixViewer) timeLimit = 10; tic while isVisible(timeScope) && isVisible(matrixViewer) && toc < timeLimit x = adr(); [speechCommandIdx, auditorySpectrum] = HelperSpeechCommandRecognition(x); matrixViewer(auditorySpectrum); timeScope(x); if (speechCommandIdx == backgroundIdx) timeScope.Title = ' '; else timeScope.Title = char(labels(speechCommandIdx)); end drawnow end
Скройте осциллографы.
hide(timeScope) hide(matrixViewer)
Создайте объект настройки генерации кода для генерации исполняемой программы. Задайте выходной язык как C++.
cfg = coder.config('mex'); cfg.TargetLang = 'C++';
Создайте объект настройки для генерации кода глубокого обучения с библиотекой MKL-DNN. Присоедините объект настройки к объекту настройки генерации кода.
dlcfg = coder.DeepLearningConfig('mkldnn');
cfg.DeepLearningConfig = dlcfg;
Вызовите codegen
(MATLAB Coder), чтобы сгенерировать Код С++ для HelperSpeechCommandRecognition
функция. Задайте объект настройки и моделируйте аргументы. Файл MEX под названием HelperSpeechCommandRecognition_mex
сгенерирован к вашей текущей папке.
codegen HelperSpeechCommandRecognition -config cfg -args {rand(samplesPerCapture, 1, 'single')} -profile -report -v
Code generation successful: View report
Покажите осциллограф времени и матричное средство просмотра. Обнаружьте команды с помощью сгенерированного MEX столько, сколько и осциллограф времени и матричное средство просмотра открыты или пока ограничение по времени не достигнуто. Чтобы остановить живое обнаружение перед, ограничение по времени достигнуто, закройте окно scope времени или матричное окно средства просмотра.
show(timeScope) show(matrixViewer) timeLimit = 20; tic while isVisible(timeScope) && isVisible(matrixViewer) && toc < timeLimit x = adr(); [speechCommandIdx, auditorySpectrum] = HelperSpeechCommandRecognition_mex(x); matrixViewer(auditorySpectrum); timeScope(x); if (speechCommandIdx == backgroundIdx) timeScope.Title = ' '; else timeScope.Title = char(labels(speechCommandIdx)); end drawnow end hide(matrixViewer) hide(timeScope)
Используйте tic
и toc
сравнить время выполнения, чтобы запустить симуляцию полностью в MATLAB со временем выполнения MEX-функции.
Измерьте уровень кода симуляции.
testDur = 50e-3; x = pinknoise(fs*testDur,'single'); numLoops = 100; tic for k = 1:numLoops [speechCommandIdx, auditory_features] = HelperSpeechCommandRecognition(x); end exeTime = toc; fprintf('SIM execution time per 50 ms of audio = %0.4f ms\n',(exeTime/numLoops)*1000);
SIM execution time per 50 ms of audio = 6.6746 ms
Измерьте уровень кода MEX.
tic for k = 1:numLoops [speechCommandIdx, auditory_features] = HelperSpeechCommandRecognition_mex(x); end exeTimeMex = toc; fprintf('MEX execution time per 50 ms of audio = %0.4f ms\n',(exeTimeMex/numLoops)*1000);
MEX execution time per 50 ms of audio = 1.5188 ms
Оцените эффективность, полученную от использования MEX-функции. Этот тест производительности выполняется на машине с помощью NVIDIA QUADRо P620 (Версия 26) графический процессор и центральный процессор Intel(R) Xeon(R) W-2133, достигающий 3,60 ГГц.
PerformanceGain = exeTime/exeTimeMex
PerformanceGain = 4.3945