主要内容

关键字定位在噪声代码生成树莓π

这个例子演示了代码生成关键字定位使用双向久短期记忆(BiLSTM)网络和mel频率cepstral系数(MFCC)特征提取覆盆子π™。MATLAB®编码器™与深度学习支持使一代的一个独立的可执行文件(.金宝appelf)覆盆子π。MATLAB®之间的通信(.mlx)文件和生成的可执行文件是通过异步用户数据报协议(UDP)。输入的语音信号显示使用timescope。面具显示为蓝色矩形周围发现的实例关键字,是的。更多细节MFCC特征提取和深入学习网络培训,参观关键字定位在噪音使用MFCC和LSTM网络

例子要求

  • 为深度学习MATLAB®编码器接口支持包金宝app

  • ARM处理器,支持霓虹灯扩展金宝app

  • 臂计算库版本20.02.1(目标ARM硬件)

  • 环境变量的编译器和库

为支持版金宝app本的库和设置环境变量信息,明白了先决条件与MATLAB编码器深度学习(MATLAB编码器)

Pretrained网络关键字定位使用MATLAB®流式音频和麦克风

pretrained网络的采样率16kHz。设置窗口长度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”,真正的);

下载和加载pretrained网络,以及平均()和标准差(年代)向量用于功能标准化。

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

调用generateMATLABFunctionaudioFeatureExtractor对象创建特征提取功能。

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

定义一个音频设备的读者从你的麦克风系统对象™阅读音频。设置帧长度等于跳。这使得一套新的特性的计算为每个新收到麦克风音频帧。

frameLength = hopLength;adr = audioDeviceReader (“SampleRate”fs,“SamplesPerFrame”frameLength,“OutputDataType”,“单一”);

创建一个时间范围可视化语音信号和估计面具。

范围= 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 <期限& & isVisible(范围)数据= adr ();写(dataBuff、数据);写(plotBuff、数据);帧=阅读(dataBuff windowLength overlapLength);特点= generateKeywordFeatures(框架、fs);写(featureBuff特性。');如果featureBuff。NumUnreadSamples = = numHopsPerUpdate featureMatrix =阅读(featureBuff);featureMatrix (~ isfinite (featureMatrix)) = 0;featureMatrix = (featureMatrix - M)。/ S;[keywordNet v] = classifyAndUpdateState (KWSNet featureMatrix。');v =双(v) - 1;v = repmat (v hopLength 1);v = (,);v =模式(v);v = repmat (v numHopsPerUpdate * hopLength 1); data = read(plotBuff); scope([data,v]); drawnowlimitrate;结束结束隐藏(范围)

helperKeywordSpottingRaspi金宝app支持函数封装了特征提取和网络预测过程演示。特征提取与代码生成兼容,特征提取是由生成的generateKeywordFeatures函数。为了使网络兼容的代码生成,支持函数使用金宝appcoder.loadDeepLearningNetwork(MATLAB编码器)函数加载网络。

支持函数金宝app使用一个dsp.UDPReceiver系统对象接收捕获音频从MATLAB®和使用dsp.UDPSender系统对象发送输入语音信号与估计面具预测的网络MATLAB®。同样,MATLAB®脚本使用dsp.UDPSender系统对象将捕获的语音信号发送到可执行文件运行在覆盆子π和dsp.UDPReceiver系统对象接收语音信号和估计面具从树莓π。

生成可执行的覆盆子π

取代hostIPAddress与你的机器的地址。你的树莓π发送输入语音信号和估计面具指定的IP地址。

hostIPAddress = coder.Constant (“172.18.230.30”);

创建一个代码生成配置对象生成一个可执行程序。指定目标语言c++。

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

为深度学习创建一个配置对象代码生成的手臂计算图书馆在你的树莓π。指定覆盆子π的架构和深度学习配置对象附加到代码生成配置对象。

dlcfg = coder.DeepLearningConfig (“arm-compute”);dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“20.02.1”;cfg。DeepLearningConfig = dlcfg;

使用的覆盆子π支持包功能,金宝appraspi创建一个连接你的树莓π。在以下代码中,替换:

  • raspiname覆盆子π的名称

  • π和你的用户名

  • 密码用你的密码

r = raspi (“raspiname”,“π”,“密码”);

创建一个coder.hardware(MATLAB编码器)对象树莓π和附加的代码生成配置对象。

hw = coder.hardware (“树莓π”);cfg。硬件= hw;

指定构建文件夹树莓π。

buildDir =“~ / remoteBuildDir”;cfg.Hardware。BuildDir = BuildDir;

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

cfg。GenerateExampleMain =“GenerateCodeAndCompile”;

生成c++代码helperKeywordSpottingRaspi在你的树莓π。

codegen配置cfghelperKeywordSpottingRaspiarg游戏{hostIPAddress}报告
部署代码。这可能需要几分钟。警告:函数的helperKeywordSpottingRaspi并不因无限循环终止。= = > helperKeywordSpottingRaspi行警告:78列:1代码生成成功(警告):查看报告

使用部署代码执行关键字定位

创建一个命令来打开helperKeywordSpottingRaspi应用覆盆子π。使用系统将命令发送到你的树莓π。

applicationName =“helperKeywordSpottingRaspi”;applicationDirPaths = raspi.utils.getRemoteBuildDirectory (“applicationName”applicationName);targetDirPath = applicationDirPaths {1} .directory;exeName = strcat (applicationName,“.elf”);命令= [“cd”targetDirPath,”;。/”exeName,“& > 1 &”];系统(r,命令);

创建一个dsp.UDPSender系统在MATLAB®对象发送音频捕捉你的树莓π。更新targetIPAddress你的树莓π。覆盆子π接收音频捕获来自同一个端口使用dsp.UDPReceiver系统对象。

targetIPAddress =“172.18.231.92”;UDPSend = dsp.UDPSender (“RemoteIPPort”,26000,“RemoteIPAddress”,targetIPAddress);

创建一个dsp.UDPReceiver系统对象接收语音数据和预测语音面具从你的树莓π。每一个收到的覆盆子π包括UDP数据包maskLength面具和语音样本。的最大消息长度dsp.UDPReceiver对象是65507年字节。计算缓冲区的大小,以适应UDP数据包的最大数量。

sizeOfFloatInBytes = 4;speechDataLength = maskLength;numElementsPerUDPPacket = maskLength + speechDataLength;maxUDPMessageLength =地板(65507 / sizeOfFloatInBytes);numPackets =地板(maxUDPMessageLength / numElementsPerUDPPacket);bufferSize = numPackets * numElementsPerUDPPacket * sizeOfFloatInBytes;UDPReceive = dsp.UDPReceiver (“LocalIPPort”,21000,“MessageDataType”,“单身”,“MaximumMessageLength”1 + numElementsPerUDPPacket,“下面的”bufferSize);

点关键字只要时间范围是开放或直到到达的期限。停止现场检测在期限到达之前,关闭时间范围。

抽搐;显示(范围);期限= 20;toc <期限& & isVisible(范围)x = adr ();UDPSend (x);data = UDPReceive ();如果~ isempty(数据)面具=数据(1:maskLength);dataForPlot =数据(maskLength + 1: numElementsPerUDPPacket);范围([dataForPlot、面具]);结束drawnowlimitrate;结束

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

隐藏(范围)发布(UDPSend)发布(UDPReceive)发布(范围)发布(adr) stopExecutable (codertarget.raspi.raspberrypi exeName)

评估执行时间使用替代公益诉讼功能的工作流

评估执行时间由独立的可执行文件在覆盆子π,使用一个公益诉讼(processor-in-loop)工作流。执行公益诉讼分析,生成一个公益诉讼功能的支持功能金宝appprofileKeywordSpotting。的profileKeywordSpotting相当于helperKeywordSpottingRaspi,除了前返回演讲和预测演讲面具而后者使用UDP发送相同的参数。UDP调用所花的时间小于1 ms,这是相对较小的总执行时间相比。

创建一个代码生成配置对象生成公益诉讼的功能。

cfg = coder.config (“自由”,“是”,真正的);cfg。VerificationMode =“公益诉讼”;

设置部门计算库和架构。

dlcfg = coder.DeepLearningConfig (“arm-compute”);cfg。DeepLearningConfig = dlcfg;cfg.DeepLearningConfig。ArmArchitecture =v7的;cfg.DeepLearningConfig。ArmComputeVersion =“20.02.1”;

与你的目标硬件设置连接。

如果(~ (“r”,“var”)r = raspi (“raspiname”,“π”,“密码”);结束hw = coder.hardware (“树莓π”);cfg。硬件= hw;

设置构建目录和目标语言。

buildDir =“~ / remoteBuildDir”;cfg.Hardware。BuildDir = BuildDir;cfg。TargetLang =“c++”;

使分析和生成公益诉讼代码。一个墨西哥人的文件命名profileKeywordSpotting_pil是你当前文件夹中生成。

cfg。CodeExecutionProfiling = true;codegen配置cfgprofileKeywordSpottingarg游戏{pinknoise (hopLength 1 '单')}报告
部署代码。这可能需要几分钟。# # #连接配置功能“profileKeywordSpotting”:“树莓π”生成的精灵的位置:/home/pi/remoteBuildDir / MATLAB_ws R2022a / W / / ExampleManager / sporwal.Bdoc22a交货。j1844576 / deeplearning_shared-ex18742368 codegen / lib / profileKeywordSpotting /公益诉讼成功代码生成:查看报告

评估覆盆子π执行时间

多次调用生成的公益诉讼函数得到的平均执行时间。

numPredictCalls = 10;totalCalls = numHopsPerUpdate * numPredictCalls;x = pinknoise (hopLength 1“单一”);k = 1: totalCalls maskReceived、inputSignal plotFlag] = profileKeywordSpotting_pil (x);结束
# # #开始应用程序:“codegen \ lib \ profileKeywordSpotting \ \ profileKeywordSpotting趁手。精灵的终止执行:明确profileKeywordSpotting_pil # # #启动应用程序profileKeywordSpotting.elf……执行分析数据可供浏览。开放的仿真数据检查员。执行分析报告后终止。

公益诉讼执行终止。

清晰的profileKeywordSpotting_pil
# # #主机应用程序产生以下标准输出(stdout)和标准错误(stderr)消息:执行分析报告:报告(getCoderExecutionProfile (profileKeywordSpotting))

生成执行概要报告评估执行时间。

executionProfile = getCoderExecutionProfile (“profileKeywordSpotting”);报告(executionProfile,“单位”,“秒”,“ScaleFactor”,“1 e 03”,“NumericFormat”,' % 0.4 f ')
ans = ' W: \ \ ExampleManager \ sporwal.Bdoc22a.j1844576交货\ deeplearning_shared-ex18742368 \ codegen \ lib \ profileKeywordSpotting \ html \ \ ExecutionProfiling_d43d66431b443d29.html孤儿”

策划每一帧的执行时间从生成的报告。

第一帧的处理~ 20女士由于初始化开销成本。的高峰时间在每16帧图(numHopsPerUpdate)对应于每16帧计算密集型预测函数。最大执行时间~ 30 ms,低于128 ms预算实时流媒体。性能是measuerd覆盆子π4模型B牧师1.1。