Речевая генерация кода распознавания команды с Intel MKL-DNN

В этом примере показано, как развернуть извлечение признаков и сверточную нейронную сеть (CNN) для речевого распознавания команды на процессорах Intel®. Чтобы сгенерировать извлечение признаков и сетевой код, вы используете MATLAB Coder и Math Kernel Library Intel для Глубоких нейронных сетей (MKL-DNN). В этом примере сгенерированный код является исполняемым файлом MATLAB (MEX) функция, которая вызвана скриптом MATLAB, который отображает предсказанную речевую команду наряду с сигналом области времени и слуховой спектрограммой. Для получения дополнительной информации о предварительной обработке аудио и сетевом обучении, смотрите Распознание речевых команд с использованием глубокого обучения (Audio Toolbox).

Необходимые условия

  • Интерфейс MATLAB Coder для пакета поддержки глубокого обучения

  • Процессор Xeon с поддержкой Intel Усовершенствованные Векторные Расширения 2 (Intel AVX2)

  • Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)

  • Переменные окружения для Intel MKL-DNN

Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder).

Потоковая передача демонстрации в MATLAB

Используйте те же параметры для конвейера извлечения признаков и классификации, как разработано в Распознании речевых команд с использованием глубокого обучения (Audio Toolbox).

Задайте ту же частоту дискретизации, сеть была обучена на (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 Объект (Audio Toolbox) извлечь спектрограммы Коры с 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 Объект (Audio Toolbox) считать аудио из вашего устройства. Создайте dsp.AsyncBuffer Объект (DSP System Toolbox) буферизовать аудио во фрагменты.

adr = audioDeviceReader('SampleRate',fs,'SamplesPerFrame',samplesPerCapture,'OutputDataType','single');
audioBuffer = dsp.AsyncBuffer(fs);

Создайте dsp.MatrixViewer Объект (DSP System Toolbox) и timescope Объект (DSP System Toolbox) отобразить результаты.

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)

Подготовьте код MATLAB к развертыванию

Чтобы создать функцию, чтобы выполнить извлечение признаков, совместимое с генерацией кода, вызовите generateMATLABFunction (Audio Toolbox) на 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)

Сгенерируйте исполняемый файл MATLAB

Создайте объект настройки генерации кода для генерации исполняемой программы. Задайте выходной язык как 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)

Оцените время выполнения MEX

Используйте 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