主要内容

基于深度学习的语音指令识别

本示例演示如何对流音频执行语音命令识别。该示例使用预先训练的深度学习模型。要了解深度学习模型是如何训练的,请参见用深度学习训练语音指令识别模型

加载预训练的网络。经过训练,网络可以识别以下语音命令:是的没有向上下来正确的停止,以及将音频分类为未知单词或背景噪音。

负载(“commandNet.mat”)标签= trainedNet.Layers(end).Classes'
标签=1×12分类向下走,向左走,没有关闭,在右边停止,上是,未知背景

加载以下音频信号之一:噪音,有人说停止,或者有人说.这个词停止被网络识别为命令。这个词对网络来说是一个陌生的词。听信号。

audioData ={audioread(“stopCommand.flac”),16 e3,“停止”};audioData声音(audioData {1}, {2})

预先训练的网络将基于听觉的谱图作为输入。使用配套功能extractAuditorySpectrogram提取光谱图。根据听觉谱图对音频进行分类。

audioData auditorySpectrogram = extractAuditorySpectrogram (audioData {1}, {2});预测=分类(trainedNet auditorySpectrogram);

使用配套功能visualizeClassificationPipeline,绘制音频信号、听觉谱图、网络预测和表示预测分数的词云。

visualizeClassificationPipeline (audioData trainedNet)

从流音频检测命令

该模型被训练来分类对应于1秒音频数据块的听觉谱图。它没有分类之间的记忆概念。为了使这个模型适应流式应用程序,您可以添加逻辑来随着时间的推移建立决策置信度。

创建一个9秒长的音频剪辑,包含背景噪音、未知单词和已知命令。

fs = 16 e3;audioPlay = audioread (“playCommand.flac”);audioStop = audioread (“stopCommand.flac”);audioBackground = 0.02 * pinknoise (fs);audioIn = repmat ([audioBackground; audioPlay audioStop], 3, 1);

指定以赫兹为单位的分类速率。分类速率是每秒分类的数量。每次分类都需要1秒的音频数据。

classificationRate =20.%赫兹

指定决策的时间窗口。决策是通过在决策时间窗口中考虑所有个体分类来做出的。

decisionTimeWindow =1.5%秒

为决策逻辑指定阈值。的frameAgreementThreshold帧的百分比是decisionTimeWindow必须同意识别一个单词。的probabilityThreshold阈值是否至少是分类概率中的一个decisionTimeWindow必须通过。

frameAgreementThreshold =50% %probabilityThreshold =0.7

利用配套功能,detectCommands,模拟流命令检测。该功能使用您的默认音频设备播放流音频。

detectCommands (...输入= audioIn,...SampleRate = fs,...网络= trainedNet,...ClassificationRate = ClassificationRate,...DecisionTimeWindow = DecisionTimeWindow,...FrameAgreementThreshold = FrameAgreementThreshold,...ProbabilityThreshold = ProbabilityThreshold);

从麦克风输入检测命令

您可以通过对从麦克风输入的数据执行语音命令识别来测试模型。在这种情况下,音频从默认的音频输入设备读取。的期限参数控制音频记录的持续时间。您可以通过关闭作用域来提前结束记录。

经过训练,网络可以识别以下语音命令:是的没有向上下来正确的停止,以及将音频分类为未知单词或背景噪音。

detectCommands (...SampleRate = fs,...网络= trainedNet,...ClassificationRate =20....DecisionTimeWindow =1.5...FrameAgreementThreshold =50...ProbabilityThreshold =0.7...期限=10);

支持功能

提取听觉谱图

函数特点= extractAuditorySpectrogram (x, fs)计算听觉谱图% features = extractAuditorySpectrogram(x,fs)计算听觉(Bark)%谱图,与在列车语音指令中所做的方法相同%识别模型使用深度学习的例子。指定音频输入,% x,作为持续时间为1秒的单声道音频信号。设计audioFeatureExtractor对象持续的afe segmentSamples如果isempty(afe) designFs = 16e3;segmentDuration = 1;frameDuration = 0.025;hopDuration = 0.01;numBands = 50;FFTLength = 512;segmentSamples =圆(segmentDuration * designFs);frameSamples =圆(frameDuration * designFs);hopSamples =圆(hopDuration * designFs);overlapSamples = frameSamples - hopSamples; afe = audioFeatureExtractor(...SampleRate = designFs,...FFTLength = FFTLength,...窗口=损害(frameSamples,“周期”),...OverlapLength = overlapSamples,...barkSpectrum = true);setExtractorParams (afe“barkSpectrum”NumBands = NumBands WindowNormalization = false);结束%如有必要重新采样到16 kHz如果Double (fs)~=16e3 x = cast(resample(Double (x),16e3, Double (fs))),like=x);结束确保输入等于1秒的数据在16千赫。x = trimOrPad (x, segmentSamples);%提取特征=特征提取(afe x);%应用对数Features = log10(Features + 1e-6);结束

可视化分类管道

函数visualizeClassificationPipeline (audioData trainedNet)可视化分类管道visualizeClassificationPipeline(audioData,trainedNet)创建一个平铺的%布局的音频数据,提取的听觉谱图,和一个词%云表示各类的相对预测概率。解包音频数据音频= audioData {1};fs = audioData {2};标签= audioData {3};%创建平铺布局tiledlayout (3,1)在第一个贴图中绘制音频信号nexttile plotAudio(音频、fs)标题(“已知类=”+标签)在第二个贴图中绘制听觉谱图nexttile auditorySpectrogram = extractAuditorySpectrogram(音频,fs);plotAuditorySpectrogram (auditorySpectrogram)在第三个贴图中绘制网络预测作为词云nexttile[预测,分数]=分类(trainedNet,auditorySpectrogram);wordcloud (trainedNet.Layers(结束). class,分数)标题(“预测班级=”+字符串(预测)函数plotAuditorySpectrogram (auditorySpectrogram)绘制听觉谱图% extratAuditorySpectrogram使用25毫秒的窗口和10毫秒的跳跃。创建一个时间向量,其中的瞬间对应于的中心%的窗户t = 0.0125:0.01: (1 - 0.0125);垃圾箱= 1:尺寸(auditorySpectrogram 2);pcolor (t,垃圾箱,auditorySpectrogram)阴影包含(“时间(s)”) ylabel (“汪汪”(箱)结束函数plotAudio (audioIn fs)% plotAudio情节音频t =(0:大小(audioIn, 1) 1) / fs;情节(t, audioIn)包含(“时间(s)”) ylabel (“振幅”网格)结束结束

修剪或垫

函数y = trimOrPad (x, n)trimOrPad修剪或pad音频% y = trimOrPad(x,n)沿第一个方向修剪或填充输入x到n个样本%的维度。如果x被修剪了,那么它的前面和后面的修剪是相等的。如果x是填充的,则在前后相等地填充0。对于奇数长度的修整或填充,额外的样品被修整或填充。从后面开始。一个=大小(x, 1);如果a < n frontPad = floor((n-a)/2);backPad = n - a - frontPad;y = [0 (frontPad、大小(x, 2),如= x); x; 0(挤压垫、大小(x, 2),如= x));elseifn frontTrim = floor((a-n)/2) + 1;backTrim = a - n - frontTrim;y = x (frontTrim: end-backTrim:);其他的y = x;结束结束

情节流特性

函数detectCommands (nvargs)% detectCommand检测命令% detectCommand (SampleRate = fs、网络=净,ClassificationRate = cr,…% DecisionTimeWindow = dtw FrameAgreementThreshold =脂肪,ProbabilityThreshold = pt,…% = audioIn输入)打开一个时间窗口来可视化流媒体音频和一个dsp。MatrixViewer来可视化从模拟流中提取的听觉谱图% audioIn。作用域显示已检测到的语音命令%由流算法处理。播放流媒体音频%您的默认音频输出设备。% detectCommand (SampleRate = fs、网络=净,ClassificationRate = cr,…% DecisionTimeWindow = dtw FrameAgreementThreshold =脂肪,ProbabilityThreshold = pt,…%期限= tl)打开一个时间窗口来可视化流媒体音频和一个dsp。MatrixViewer来可视化从你的音频流中提取的听觉谱图%默认的音频输入设备。范围显示检测到的语音%命令,在它被流算法处理后。参数nvargs。SampleRate nvargs。网络nvargs。ClassificationRate nvargs。DecisionTimeWindow nvargs。FrameAgreementThreshold nvargs。ProbabilityThreshold nvargs。Input = [] nvargs.输出说明期限=正;结束%隔离标签. class标签= nvargs.Network.Layers(结束);如果isempty (nvargs.Input)创建一个audioDeviceReader从您的麦克风读取音频。adr = audioDeviceReader (SampleRate = nvargs.SampleRate SamplesPerFrame =地板(nvargs.SampleRate / nvargs.ClassificationRate));创建dsp。AsyncBuffer来缓冲来自你的音频流麦克风分成重叠的片段。audioBuffer = dsp.AsyncBuffer (nvargs.SampleRate);其他的创建dsp。AsyncBuffer对象。将音频写入缓冲区,以便你可以以流媒体的方式阅读。。audioBuffer = dsp.AsyncBuffer(大小(nvargs.Input, 1));写(audioBuffer nvargs.Input);创建一个audioDeviceWriter对象,将音频写入默认值%的扬声器在流循环中。adw = audioDeviceWriter (SampleRate = nvargs.SampleRate);结束newSamplesPerUpdate =地板(nvargs.SampleRate / nvargs.ClassificationRate);将请求的决策时间窗口转换为分析帧数。numAnalysisFrame = round((nvargs.DecisionTimeWindow-1)*(nvargs.ClassificationRate) + 1);将请求的帧协议阈值转换为必须一致的帧数。countThreshold =圆(nvargs.FrameAgreementThreshold / 100 * numAnalysisFrame);为流音频的分类决策和概率初始化缓冲区。YBuffer = repmat(分类(“背景”)、numAnalysisFrame 1);probBuffer = 0(元素个数(标签),numAnalysisFrame,“单身”);控件中处理的音频的可视化%流循环。创建一个dsp。对象来可视化%用于预测的听觉谱图。wavePlotter = timescope (...SampleRate = nvargs。SampleRate,...Title =“…”...TimeSpanSource =“财产”...时间间隔= 1,...YLimits = [1],...位置= [600640800340],...TimeAxisLabels =“没有”...AxesScaling =“手动”);show(wavePlotter) specPlotter = dsp。MatrixViewer (...XDataMode =“自定义”...AxisOrigin =“左下角”...位置= [600220800380],...ShowGrid = false,...Title =“…”...包含=“时间(s)”...YLabel =“汪汪”(本));显示(specPlotter)为绘图初始化变量currentTime = 0;colorLimits = [1];运行流循环。loopTimer =抽搐;whileCriteria (loopTimer、nvargs.TimeLimit wavePlotter、specPlotter nvargs.Input, audioBuffer)如果isempty (nvargs.Input)从音频设备中提取音频样本,并将样本添加到%的缓冲。audioIn = adr ();写(audioBuffer audioIn);结束从缓冲区读取样本y =阅读(audioBuffer nvargs.SampleRate nvargs。SampleRate - newSamplesPerUpdate);从音频中提取听觉谱图。规范= extractAuditorySpectrogram (y, nvargs.SampleRate);%对当前谱图进行分类,将标签保存到标签缓冲区中,%,并将预测概率保存到概率缓冲区中。(YPredicted,聚合氯化铝)= (nvargs.Network、规格)进行分类;YBuffer = [YBuffer(2:结束);YPredicted);probBuffer = [probBuffer(:, 2:结束)、聚合氯化铝(:));绘制当前波形和谱图。ynew = y (end-newSamplesPerUpdate + 1:结束);wavePlotter ynew specPlotter(规范)%声明一个检测并显示在图中,如果满足以下条件:% 1)最常见的标签不是背景。% 2)最新帧标签的至少countThreshold一致。% 3)预测标签的最大概率至少是probThreshold。否则,不声明检测。。[YMode,计数]=模式(YBuffer);maxProb = max(probBuffer(labels == YMode,:));如果YMode = =“背景”|| count < countThreshold || maxProb < nvargs。ProbabilityThreshold wavePlotter。Title =“…”;specPlotter。Title =“…”其他的wavePlotter。Title =string(YMode); specPlotter.Title = string(YMode);结束更新用于绘图的变量currentTime = currentTime + newSamplesPerUpdate/nvargs.SampleRate;colorLimits = [min ([colorLimits (1), min(规范、[]“所有”)))、马克斯([colorLimits (2), max(规范、[]“所有”))));specPlotter。CustomXData = [currentTime-1, currentTime];specPlotter。ColorLimits = ColorLimits;如果~ isempty (nvargs.Input)写入新的音频到您的音频输出设备。adw (ynew);结束结束发布(wavePlotter)发布(specPlotter)函数tf = whileCriteria (loopTimer时限、wavePlotter specPlotter,输入,audioBuffer)如果isempty(Input) tf = toc(loopTimer)其他的tf = audioBuffer。NumUnreadSamples > 0;结束结束结束
Baidu
map