主要内容

基于Intel MKL-DNN的噪声码生成关键字定位

该示例演示了使用双向长短期记忆(BiLSTM)网络和mel频率倒谱系数(MFCC)特征提取进行关键字发现的代码生成。具有深度学习支持的MATLAB®Coder™可生成独立可执行文件(金宝app. exe)文件。MATLAB®(.mlx)文件和生成的可执行文件之间的通信发生在异步用户数据报协议(UDP)上。输入语音信号使用timescope.掩码显示为围绕关键字YES的标记实例的蓝色矩形。更多关于MFCC特征提取和深度学习网络训练的细节,请访问基于MFCC和LSTM网络的噪声关键字发现

例子要求

  • MATLAB®Coder接口的深度学习支持包金宝app

  • Intel®Xeon®处理器,支持Intel Advan金宝appced Vector Extensions 2 (Intel AVX2)

  • Intel深度神经网络数学内核库(MKL-DNN)

  • Intel mml - dnn的环境变量

有关受支金宝app持的库版本以及有关设置环境变量的信息,请参见用MATLAB编码器进行深度学习的先决条件(MATLAB编码器)

使用MATLAB预训练网络关键字发现和流式音频从麦克风

预训练网络的采样率为16kHz。设置窗口长度为512样本,重叠长度为384和跳长定义为窗口长度和重叠长度之差。定义掩码估计的速率。掩码每生成一次numHopsPerUpdate音频帧。

Fs = 16e3;windowLength = 512;overlapLength = 384;hopLength = windowLength - overlapLength;numHopsPerUpdate = 16;maskLength = hopLength*numHopsPerUpdate;

创建一个audioFeatureExtractor对象执行MFCC特征提取。

afe = audioFeatureExtractor(“SampleRate”fs,...“窗口”损害(windowLength“周期”),...“OverlapLength”overlapLength,...“mfcc”,真的,...“mfccDelta”,真的,...“mfccDeltaDelta”,真正的);

下载并加载预训练的网络,以及()和标准差(年代)用于特征标准化的向量。

url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/KeywordSpotting.zip”;downloadNetFolder =“。/”;netFolder = fullfile(下载netFolder,“KeywordSpotting”);如果~存在(netFolder“dir”) disp (“下载预先训练好的网络和音频文件(4个文件- 7 MB)…”解压缩(url, downloadNetFolder)结束负载(fullfile (netFolder“KWSNet.mat”),“KWSNet”“M”“S”);

调用generateMATLABFunctionaudioFeatureExtractor对象创建特征提取函数。您将在处理循环中使用此函数。

generateMATLABFunction (afe“generateKeywordFeatures”“IsStreaming”,真正的);

定义一个音频设备阅读器可以从你的麦克风读取音频。将帧长度设置为跳长。这使您能够为来自麦克风的每个新音频帧计算一组新的特征。

framength = hopLength;adr = audioDeviceReader(“SampleRate”fs,...“SamplesPerFrame”, frameLength);

创建一个时间范围可视化语音信号和估计的掩码。

Scope = timescope(“SampleRate”fs,...“TimeSpanSource”“属性”...“时间间隔”5,...“TimeSpanOverrunAction”“滚动”...“BufferLength”fs * 5 * 2,...“ShowLegend”,真的,...“ChannelNames”, {“演讲”“关键词面具”},...“YLimits”(-1.2 - 1.2),...“标题”关键字定位的);

初始化一个用于音频数据的缓冲区,一个用于计算特征的缓冲区,以及一个用于绘制输入音频和输出语音掩码的缓冲区。

dataBuff = dsp.AsyncBuffer(windowLength);featureBuff = dsp.AsyncBuffer(numHopsPerUpdate);plotBuff = dsp.AsyncBuffer(numHopsPerUpdate*windowLength);

对从麦克风接收到的语音执行关键字识别。要无限地运行循环,请设置期限.若要停止模拟,请关闭范围

timeLimit = 20;显示(范围);抽搐toc < timeLimit && isVisible(scope) data = adr();写(dataBuff、数据);写(plotBuff、数据);frame = read(dataBuff,windowLength,overlapLength);features = generateKeywordFeatures(帧,fs);写(featureBuff特性。');如果featureBuff。NumUnreadSamples == numHopsPerUpdate featureMatrix = read(featureBuff);featureMatrix(~isfinite(featureMatrix)) = 0;featureMatrix = (featureMatrix - M)./S;[keywordNet, v] = classifyAndUpdateState(KWSNet,featureMatrix.');V = double(V) - 1;v = repmat(v,hopLength,1);V = V (:);V =模态(V);predictedMask = repmat(v,numHopsPerUpdate*hopLength,1); data = read(plotBuff); scope([data,predictedMask]); drawnowlimitrate结束结束发行版(adr)藏(范围)

helperKeywordSpotting金宝app支持功能封装了之前演示的音频捕获、特征提取和网络预测过程。为了使特征提取与代码生成兼容,特征提取由生成的代码处理generateKeywordFeatures函数。为了使网络与代码生成兼容,支持函数使用金宝appcoder.loadDeepLearningNetwork(MATLAB编码器)(MATLAB Coder)函数加载网络。

支持函数金宝app使用adsp。UDPSender系统对象将输入数据连同网络预测的输出掩码一起发送到MATLAB。MATLAB脚本使用dsp。UDPReceiver系统对象接收输入数据以及由网络预测的输出掩码运行在支持函数中。金宝app

在桌面上生成可执行文件

创建代码生成配置对象以生成可执行文件。将目标语言指定为c++。

CFG = code .config(exe”);cfg。TargetLang =“c++”

使用mml - dnn库创建用于深度学习代码生成的配置对象。将深度学习配置对象附加到代码生成配置对象上。

DLCFG =编码器。DeepLearningConfig (“mkldnn”);cfg。DeepLearningConfig = dlcfg;

生成生成独立可执行文件所需的c++主文件。

cfg。GenerateExampleMain =“GenerateCodeAndCompile”

生成helperKeywordSpotting,该支持金宝app功能封装了音频捕获、特征提取和网络预测过程。您会在代码生成日志中得到一个可以忽略的警告,因为helperKeywordSpotting有一个无限循环,不断地从MATLAB中寻找音频帧。

codegenhelperKeywordSpotting配置cfg报告
警告:函数“helperKeywordSpotting”不会因为无限循环而终止。警告在==> helperKeywordSpotting行:73列:1代码生成成功(有警告):查看报告

准备依赖项并运行生成的可执行文件

在本节中,您将生成所有必需的依赖项文件,并将它们放入一个文件夹中。在构建过程中,MATLAB Coder生成buildInfo.mat,一个包含独立可执行文件的编译和运行时依赖项信息的文件。

将项目名称设置为helperKeywordSpotting

projName =“helperKeywordSpotting”;packageName =[项目名称,“包”];如果ispc exeName = [projName,. exe”];其他的exeName = projName;结束

负载buildinfo.mat和使用packNGo(MATLAB编码器)产生一个. zip包中。

负载([“codegen”filesep,exe”, projName filesep filesep,“buildInfo.mat”]);packNGo (buildInfo“文件名”packageName,“zip”),“minimalHeaders”、假);

解压缩包并将可执行文件放在解压缩的目录中。

解压缩([packageName,“zip”), packageName);拷贝文件(exeName packageName,“f”);

要调用依赖于MKL-DNN动态链接库的独立可执行文件,请将MKL-DNN库位置的路径附加到环境变量中路径

setenv (“路径”,采用“INTEL_MKLDNN”)、filesep“自由”、pathsep getenv (“路径”)));

运行生成的可执行文件。

如果ispc系统(['start CMD /k "title 'packageName,' && CD 'packageName,' && 'exeName]);其他的cd (packageName);系统([“。/”exeName,“&”]);cd..结束

使用部署的代码执行关键字发现

创建一个dsp。UDPReceiver系统对象从独立可执行文件接收语音数据和预测的语音掩码。从可执行文件接收的每个UDP包由maskLength掩模样本和语音样本。的最大消息长度dsp。UDPReceiver对象是65507字节。计算缓冲区大小,以容纳UDP数据包的最大数量。

sizeOfFloatInBytes = 4;speechDataLength = maskLength;numElementsPerUDPPacket = maskLength + speechDataLength;maxUDPMessageLength = floor(65507/sizeOfFloatInBytes);samplesPerPacket = 1 + numElementsPerUDPPacket;numPackets = floor(maxUDPMessageLength/samplesPerPacket);bufferSize = numPackets*samplesPerPacket*sizeOfFloatInBytes;UDPReceive = dsp。UDPReceiver (“LocalIPPort”, 20000,...“MessageDataType”“单一”...“MaximumMessageLength”samplesPerPacket,...“下面的”bufferSize);

要无限期地运行关键字发现,请设置期限.若要停止模拟,请关闭范围

抽搐;时间限制= 20;显示(范围);toc < timelimit && isVisible(scope) data = UDPReceive();如果~isempty(data) plotMask = data(1:maskLength);plotAudio = data(maskLength+1: maskLength+speechDataLength);范围([plotAudio plotMask]);结束drawnowlimitrate结束隐藏(范围);

释放系统对象并终止独立可执行文件。

释放(UDPReceive);释放(范围);如果ispc系统([taskkill /F /FI "WindowTitle eq "projName,'* " / t ']);其他的系统([“killall”exeName]);结束
PID为4644的进程(PID为21188的子进程)已被终止。PID为20052的进程(PID为21188的子进程)已被终止。PID为21188的进程(PID为22940的子进程)已被终止。

使用替代性MEX功能工作流评估执行时间

类似的工作流程涉及使用MEX文件而不是独立的可执行文件。执行MEX分析以测量工作流的计算时间。

创建代码生成配置对象以生成MEX函数。将目标语言指定为c++。

CFG = code .config(墨西哥人的);cfg。TargetLang =“c++”

使用mml - dnn库创建用于深度学习代码生成的配置对象。将深度学习配置对象附加到代码生成配置对象上。

DLCFG =编码器。DeepLearningConfig (“mkldnn”);cfg。DeepLearningConfig = dlcfg;

调用代码生成的MEX函数profileKeywordSpotting

inputAudioFrame = ones(hopLength,1,“单一”);codegenprofileKeywordSpotting配置cfgarg游戏{inputAudioFrame}报告
代码生成成功:查看报告

测量MATLAB代码的执行时间。

x = pinknoise(hopLength,1,“单一”);numPredictCalls = 100;totalNumCalls = numPredictCalls*numHopsPerUpdate;exeTimeStart = tic;call = 1:totalNumCalls [outputMask,inputData,plotFlag] = profileKeywordSpotting(x);结束exeTime = toc(exeTimeStart);流('MATLAB执行时间每%d ms音频= %0.4f ms\n'int32 (1000 * numHopsPerUpdate * hopLength / fs), (exeTime / numPredictCalls) * 1000);
MATLAB执行时间每128毫秒音频= 24.9238毫秒

测量MEX函数的执行时间。

exeTimeMexStart = tic;call = 1:totalNumCalls [outputMask,inputData,plotFlag] = profileKeywordSpotting_mex(x);结束exeTimeMex = toc(exeTimeMexStart);流('每%d ms音频的MEX执行时间= %0.4f ms\n'int32 (1000 * numHopsPerUpdate * hopLength / fs), (exeTimeMex / numPredictCalls) * 1000);
每128毫秒音频的MEX执行时间= 5.2710毫秒

比较独立可执行方法和MEX函数方法的总执行时间。本性能测试在一台使用NVIDIA Quadro®P620(版本26)GPU和Intel Xeon W-2133 CPU的机器上进行,运行频率为3.60 GHz。

PerformanceGain = exeTime/exeTimeMex
PerformanceGain = 4.7285