这个例子演示了使用双向长短期记忆(BiLSTM)网络和mel频率倒频谱系数(MFCC)特征提取来识别关键字的代码生成。具有深度学习支持的MATLAB®Coder™能够生成独立的可执行文件金宝app(. exe
)文件。MATLAB®(.mlx)文件与生成的可执行文件之间的通信通过异步用户数据报协议(UDP)进行。输入的语音信号使用Timescope.
.一个掩码显示为一个围绕关键字YES的被标记实例的蓝色矩形。有关MFCC特征提取和深度学习网络训练的更多细节,请访问使用MFCC和LSTM网络噪声中的关键字.
MATLAB®编码器接口的深度学习支持包金宝app
英特尔®Xeon®处理器,支持英特尔高级矢量扩展2(英特金宝app尔AVX2)
深度神经网络的英特尔数学内核库(MKL-DNN)
英特尔MKL-DNN的环境变量
对于支持金宝app版本的库和有关设置环境变量的信息,请参阅深度学习与MATLAB编码器的先决条件(MATLAB编码器).
预磨料网络的采样率是16
千赫。将窗口长度设置为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”,overtaplenth,...“mfcc”,真的,...“mfccDelta”,真的,...“mfccDeltaDelta”,真正的);
下载和加载预先训练的网络,以及平均值(M.
)和标准偏差(S.
)用于特征标准化的向量。
url =“http://ssd.mathworks.com/金宝appsupportfiles/audio/KeywordSpotting.zip”;downloaddnetfolder =.'./';netFolder = fullfile (downloadNetFolder,'关键字');如果〜存在(NetFolder,“dir”)disp(“下载预先训练的网络和音频文件(4个文件- 7 MB)……”解压缩(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如果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.
金宝app支持功能封装先前拍摄的音频,特征提取和网络预测过程。要与代码生成兼容的功能提取,所生成的特征提取由生成的处理生成KeywordFeatures.
函数。为了使网络与代码生成兼容,支持函数使用金宝appCoder.LoadDeePlearningnetwork.
(MATLAB编码器)(MATLAB Coder)函数来加载网络。
支持功能金宝app使用dsp。UDPSender
系统对象将输入数据连同网络预测的输出掩码一起发送到MATLAB。MATLAB脚本使用dsp.udpreceiver.
系统对象接收输入数据连同输出掩码,由网络预测运行中的支持功能。金宝app
创建代码生成配置对象以生成可执行文件。指定目标语言为c++。
cfg = coder.config(exe”);cfg。TargetLang =“c++”;
使用MKL-DNN库创建深度学习代码生成的配置对象。将深度学习配置对象附加到代码生成配置对象。
dlcfg =编码器。DeepLearningConfig (“mkldnn”);cfg.deeplearningconfig = dlcfg;
生成生成独立可执行文件所需的c++主文件。
cfg。GenerateExampleMain ='generatecodeandcompile';
生成HelperKeywordSpotting.
,封装音金宝app频捕获,特征提取和网络预测过程的支持功能。您可以在代码生成日志中获取警告,因为您可以忽略HelperKeywordSpotting.
有一个无限的循环,连续查找来自Matlab的音频帧。
codegenHelperKeywordSpotting.配置CFG.报告
警告:函数“helperKeywordSpotting”不会因为一个无限循环而终止。代码生成成功(带有警告):查看报告
在本节中,您将生成所有必需的依赖项文件,并将它们放入单个文件夹中。在构建过程中,MATLAB编码器生成buildinfo.mat
,一个包含独立可执行文件的编译和运行时依赖性信息的文件。
将项目名称设置为HelperKeywordSpotting.
.
projName =“helperKeywordSpotting”;packageName = [projName,“包”];如果ispc exeName =[项目名称,'。可执行程序'];别的exeName = projName;结尾
加载buildinfo.mat
和使用packNGo
(MATLAB编码器)产生一个。压缩
包裹。
负载([“codegen”,filesep,exe”, projName filesep filesep,'buildinfo.mat']);Packngo(BuildInfo,'文档名称',[包裹名字,“zip”],'最小的人'、假);
解压缩包并将可执行文件放在解压缩的目录中。
解压缩([packageName,“zip”), packageName);拷贝文件(exeName packageName,“f”);
要调用依赖于MKL-DNN动态链接库的独立可执行文件,请将MKL-DNN库位置的路径附加到环境变量小路
.
setenv (“路径”,[getEnv(“INTEL_MKLDNN”)、filesep'lib'、pathsep getenv (“路径”)));
运行生成的可执行文件。
如果ISPC系统(['start CMD /k ' "title ",包裹名字,' && CD ',包裹名字,'&&',exename]);别的cd (packageName);系统(['./',exename,“&”]);cd..;结尾
创建一个dsp.udpreceiver.
从独立可执行文件接收语音数据和预测语音掩码的系统对象。从可执行文件接收到的每个UDP数据包包括maskLength
面具样品和语音样本。最大消息长度dsp.udpreceiver.
对象是65507
字节。计算缓冲区大小以容纳UDP报文的最大数目。
sizeOfFloatInBytes = 4;speechDataLength = maskLength;numElementsPerUDPPacket = maskLength + speech datallength;maxUDPMessageLength =地板(65507 / sizeOfFloatInBytes);samplesPerPacket = 1 + numElementsPerUDPPacket;numPackets =地板(maxUDPMessageLength / samplesPerPacket);bufferSize = numPackets * samplesPerPacket * sizeOfFloatInBytes;UDPReceive = dsp。UDPReceiver (“LocalIPPort”, 20000,...“MessageDataType”那“单一”那...“MaximumMessageLength”,samplespacket,...'roceBuffersize',缓冲区大小);
要无限期地运行关键字检测,请设置期限
来正
.要停止模拟,关闭范围
.
抽搐;期限= 20;显示(范围);而toc < timlimit && isVisible(scope) data = udreceive ();如果~isempty(data) plotMask = data(1:maskLength);plotAudio = data(maskLength+1: maskLength+speech datallength);范围([plotAudio plotMask]);结尾drawnlimitrate;结尾隐藏(范围);
释放系统对象并终止独立的可执行文件。
释放(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函数。指定目标语言为c++。
cfg = coder.config('mex');cfg。TargetLang =“c++”;
使用MKL-DNN库创建深度学习代码生成的配置对象。将深度学习配置对象附加到代码生成配置对象。
dlcfg =编码器。DeepLearningConfig (“mkldnn”);cfg.deeplearningconfig = dlcfg;
调用codegen来生成的MEX函数profilekeywordspotting.
.
inputAudioFrame = 1 (hopLength 1“单一”);codegenprofilekeywordspotting.配置CFG.- args.{inputAudioFrame}报告
代码生成成功:查看报告
测量MATLAB代码的执行时间。
x = pinknoise (hopLength 1“单一”);numpredictcalls = 100;TotalNumcalls = numpredictcalls * numhopsperupdate;exetimestart = tic;为了调用= 1:totalNumCalls [outputMask,inputData,plotFlag] = profileKeywordSpotting(x);结尾exeTime = toc (exeTimeStart);FPRINTF('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);FPRINTF('每%d ms的MEX执行时间= %0.4f ms\n',Int32(1000 * numhopsperupdate * hoplength / fs),(exetimemex / numpredictcalls)* 1000);
每128毫秒的MEX执行时间= 5.2710 ms
比较独立可执行方法与MEX函数方法的总执行时间。这个性能测试是在一台使用NVIDIA Quadro®P620 (Version 26) GPU和Intel Xeon W-2133 CPU(运行在3.60 GHz)的机器上进行的。
PerformanceGain = exeTime / exeTimeMex
PerformentGain = 4.7285.