基于Intel MKL-DNN的噪声码生成关键字识别
这个例子演示了使用双向长短期记忆(BiLSTM)网络和mel频率倒谱系数(MFCC)特征提取的关键字发现的代码生成。具有深度学习支持的MATLAB®Coder™能够生成独立的可执行文件(. exe
)文件。MATLAB®(.mlx)文件和生成的可执行文件之间的通信通过异步用户数据报协议(UDP)进行。输入的语音信号使用timescope
.掩码显示为围绕关键字YES的斑点实例的蓝色矩形。更多关于MFCC特征提取和深度学习网络训练的细节,请访问基于MFCC和LSTM网络的噪声关键字发现.
例子要求
深度学习支持包的MATLAB®编码器接口
支持Intel Advanced Vector Extensions 2 (Intel AVX2)的Intel®Xeon®处理器
Intel深度神经网络数学内核库(MKL-DNN)
Intel MKL-DNN的环境变量
有关受支持的库版本和有关设置环境变量的信息,请参见用MATLAB编码器进行深度学习的先决条件(MATLAB编码器).
使用MATLAB预训练的网络关键字识别和麦克风流音频
预训练网络的抽样率为16
kHz。将窗口长度设置为512
样本,重叠长度为384
样本,以及定义为窗口长度和重叠长度之差的跳长度。定义估计掩码的速率。每生成一个掩码numHopsPerUpdate
音频帧。
fs = 16 e3;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/supportfiles/audio/KeywordSpotting.zip”;downloadNetFolder =“。/”;netFolder = fullfile (downloadNetFolder,“KeywordSpotting”);如果~存在(netFolder“dir”) disp (下载预先训练的网络和音频文件(4个文件- 7mb)…解压缩(url, downloadNetFolder)结束负载(fullfile (netFolder“KWSNet.mat”),“KWSNet”,“M”,“S”);
调用generateMATLABFunction
在audioFeatureExtractor
对象创建特征提取函数。您将在处理循环中使用此函数。
generateMATLABFunction (afe“generateKeywordFeatures”,“IsStreaming”,真正的);
定义一个音频设备的读者可以从你的麦克风读取音频。设置帧长度等于跳长度。这使您能够为来自麦克风的每一个新的音频帧计算一组新的特性。
frameLength = hopLength;adr = audioDeviceReader (“SampleRate”fs,...“SamplesPerFrame”, frameLength);
创建一个时间范围可视化语音信号和估计掩码。
范围= 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);
对从麦克风接收到的语音执行关键字识别。要无限地运行循环,请设置期限
来正
.若要停止模拟,请关闭范围
.
期限= 20;显示(范围);抽搐而toc < timeLimit && isVisible(scope) data = adr();写(dataBuff、数据);写(plotBuff、数据);帧=阅读(dataBuff windowLength overlapLength);特点= 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);predictedMask = repmat (v numHopsPerUpdate * hopLength 1); data = read(plotBuff); scope([data,predictedMask]); drawnowlimitrate;结束结束发行版(adr)藏(范围)
的helperKeywordSpotting
支持功能封装了之前演示的音频捕获、特征提取和网络预测过程。为了使特征提取与代码生成兼容,特征提取由生成的代码处理generateKeywordFeatures
函数。为使网络与代码生成兼容,支持函数使用coder.loadDeepLearningNetwork
(MATLAB编码器)(MATLAB Coder)函数加载网络。
辅助函数使用adsp。UDPSender
系统对象将网络预测的输入数据和输出掩码发送到MATLAB。MATLAB脚本使用dsp。UDPReceiver
系统对象接收在支持函数中运行的网络预测的输入数据和输出掩码。
在桌面生成可执行文件
创建代码生成配置对象以生成可执行文件。指定目标语言为c++。
cfg = coder.config (exe”);cfg。TargetLang =“c++”;
创建一个配置对象,用于使用MKL-DNN库生成深度学习代码。将深度学习配置对象附加到代码生成配置对象。
dlcfg =编码器。DeepLearningConfig (“mkldnn”);cfg。DeepLearningConfig = dlcfg;
生成生成独立可执行文件所需的c++主文件。
cfg。GenerateExampleMain =“GenerateCodeAndCompile”;
生成helperKeywordSpotting
的支持功能,封装了音频捕获、特征提取和网络预测过程。您会在代码生成日志中得到一个可以忽略的警告,因为helperKeywordSpotting
有一个无限循环,不断地从MATLAB中寻找音频帧。
codegenhelperKeywordSpotting配置cfg报告
警告:函数'helperKeywordSpotting'不会因为无限循环而终止。警告在==> helperKeywordSpotting行:73列:1代码生成成功(带有警告):查看报告
准备依赖项并运行生成的可执行文件
在本节中,您将生成所有必需的依赖项文件,并将它们放入单个文件夹中。在构建过程中,MATLAB Coder生成buildInfo.mat
,一个包含独立可执行文件的编译和运行时依赖关系信息的文件。
将项目名称设置为helperKeywordSpotting
.
projName =“helperKeywordSpotting”;packageName = [projName,“包”];如果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系统(['开始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 =地板(65507 / sizeOfFloatInBytes);samplesPerPacket = 1 + numElementsPerUDPPacket;numPackets =地板(maxUDPMessageLength / samplesPerPacket);bufferSize = numPackets * samplesPerPacket * sizeOfFloatInBytes;UDPReceive = dsp。UDPReceiver (“LocalIPPort”, 20000,...“MessageDataType”,“单一”,...“MaximumMessageLength”samplesPerPacket,...“下面的”bufferSize);
要无限期地运行关键字查找,请设置期限
来正
.若要停止模拟,请关闭范围
.
抽搐;期限= 20;显示(范围);而toc < timlimit && 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 = coder.config (墨西哥人的);cfg。TargetLang =“c++”;
创建一个配置对象,用于使用MKL-DNN库生成深度学习代码。将深度学习配置对象附加到代码生成配置对象。
dlcfg =编码器。DeepLearningConfig (“mkldnn”);cfg。DeepLearningConfig = dlcfg;
调用codegen生成MEX函数profileKeywordSpotting
.
inputAudioFrame = 1 (hopLength 1“单一”);codegenprofileKeywordSpotting配置cfgarg游戏{inputAudioFrame}报告
代码生成成功:查看报告
测量MATLAB代码的执行时间。
x = pinknoise (hopLength 1“单一”);numPredictCalls = 100;totalNumCalls = numPredictCalls * numHopsPerUpdate;exeTimeStart =抽搐;为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 =抽搐;为call = 1:totalNumCalls [outputMask,inputData,plotFlag] = profileKeywordSpotting_mex(x);结束exeTimeMex = toc (exeTimeMexStart);流('MEX执行时间每%d ms的音频= %0.4f ms\n'int32 (1000 * numHopsPerUpdate * hopLength / fs), (exeTimeMex / numPredictCalls) * 1000);
MEX执行时间每128毫秒音频= 5.2710毫秒
比较独立可执行方法和MEX函数方法的总执行时间。该性能测试是在使用NVIDIA Quadro®P620(版本26)GPU和运行在3.60 GHz的Intel Xeon W-2133 CPU的机器上进行的。
PerformanceGain = exeTime / exeTimeMex
PerformanceGain = 4.7285