主要内容

detectSpeech

检测语音信号中的语音边界

描述

例子

idx= detectSpeech (audioInfs返回索引audioIn对应于语音信号的边界。

例子

idx= detectSpeech (audioInfs名称,值使用一个或多个指定选项名称,值对参数。

例子:detectSpeech (audioIn、fs、“窗口”,损害(512年,“周期性”)、“OverlapLength”,256年)使用512点具有256点重叠的周期Hann窗口检测语音。

例子

idx阈值) = detectSpeech (___还返回用于计算语音边界的阈值。

例子

detectSpeech (___如果没有输出参数,则显示输入信号中检测到的语音区域的图。

例子

全部折叠

读入音频信号。把音频信号剪到20秒。

[audioIn, fs] = audioread (“彩虹- 16 - 8 mono - 114 secs.wav”);audioIn = audioIn (1:20 * fs);

调用detectSpeech.不指定输出参数以显示检测到的语音区域的图。

detectSpeech (audioIn fs);

图中包含一个坐标轴。标题为“检测语音”的轴包含37个类型为line、constantline、patch的对象。

detectSpeech函数使用基于每个分析帧的能量和光谱扩散的阈值算法。您可以修改窗口OverlapLength,MergeDistance调整算法以满足您的特定需求。

windowDuration =0.074%秒numWindowSamples =圆(windowDuration * fs);赢得=汉明(numWindowSamples,“周期”);percentOverlap =35;重叠=圆(numWindowSamples * percentOverlap / 100);mergeDuration =0.44;mergeDist =圆(mergeDuration * fs);detectSpeech (audioIn fs,“窗口”,赢了,“OverlapLength”重叠,“MergeDistance”mergeDist)

图中包含一个坐标轴。标题为“检测语音”的轴包含19个类型为line、constantline、patch的对象。

读入包含语音的音频文件。将音频信号分成前半段和后半段。

[audioIn, fs] = audioread (“Counting-16-44p1-mono-15secs.wav”);库= audioIn(1:地板(元素个数(audioIn) / 2));后半叶= audioIn(元素个数(库):结束);

调用detectSpeech在音频信号的前半部分。指定两个输出参数以返回与检测语音区域对应的索引和用于决策的阈值。

[speechIndices,阈值]= detectSpeech(库,fs);

调用detectSpeech在没有输出参数的第二部分,绘制检测到的语音区域。指定从上一个调用确定的阈值detectSpeech

detectSpeech(后半叶,fs,“阈值”阈值)

处理大型数据集

当您处理大型数据集时,或者当您部署用于实时推理的深度学习或机器学习管道时,重用语音检测阈值可以提供显著的计算效率。下载并提取数据集[1]

url =“https://storage.googleapis.com/download.tensorflow.org/data/speech_commands_v0.01.tar.gz”;downloadFolder = tempdir;datasetFolder = fullfile (downloadFolder,“google_speech”);如果~存在(datasetFolder“dir”) disp (“下载数据集(1.9 GB)……”解压(url, datasetFolder)结束

创建一个音频数据存储来指向录音。使用文件夹名称作为标签。

广告= audioDatastore (datasetFolder,“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

在本例中,将数据集减少95%。

广告= splitEachLabel(广告,0.05,“排除”“_background_noise”);

创建两个数据存储:一个用于培训,一个用于测试。

[adsTrain, adsTest] = splitEachLabel(广告,0.8);

计算训练数据集的平均阈值。

阈值= 0(元素个数(adsTrain.Files), 2);ii = 1:numel(adsTrain. files) [audioIn,adsInfo] = read(adsTrain);[~,阈值(ii)): = detectSpeech (audioIn adsInfo.SampleRate);结束thresholdAverage =意味着(阈值,1);

使用预先计算的阈值来检测测试数据集中的文件上的语音区域。绘制三个文件的检测区域。

[audioIn, adsInfo] =阅读(adsTest);detectSpeech (audioIn adsInfo。SampleRate,“阈值”, thresholdAverage);

[audioIn, adsInfo] =阅读(adsTest);detectSpeech (audioIn adsInfo。SampleRate,“阈值”, thresholdAverage);

[audioIn, adsInfo] =阅读(adsTest);detectSpeech (audioIn adsInfo。SampleRate,“阈值”, thresholdAverage);

参考文献

[1]监狱长,皮特。《语音指令:单字语音识别的公共数据集》由TensorFlow分布。知识共享署名4.0许可。

读一个音频文件并听它。画出光谱图

[audioIn, fs] = audioread (“Counting-16-44p1-mono-15secs.wav”);声音(audioIn fs)谱图(audioIn损害(1024年“周期”fs), 512年,1024年,“桠溪”

图中包含一个坐标轴。轴包含一个image类型的对象。

对于机器学习应用程序,您通常希望从音频信号中提取特征。调用spectralEntropy功能上的音频信号,然后绘图柱状图来显示光谱熵的分布。

熵= spectralEntropy (audioIn, fs);numBins = 40;直方图(熵,numBins“归一化”“概率”)标题(音频信号的谱熵

图中包含一个坐标轴。标题为“音频信号光谱熵”的坐标轴包含一个直方图类型的对象。

根据您的应用程序,您可能希望仅从语音区域提取光谱熵。所得到的统计结果更多地反映了说话人的特点,而较少反映了信道的特点。调用detectSpeech然后创建一个新信号,该信号只包含检测到的语音区域。

speechIndices = detectSpeech (audioIn, fs);speechSignal = [];audioIn(speech hindices (ii,1):speech hindices (ii,2));结束

听语音信号并绘制声谱图。

声音(speechSignal fs)谱图(speechSignal损害(1024年“周期”fs), 512年,1024年,“桠溪”

图中包含一个坐标轴。轴包含一个image类型的对象。

调用spectralEntropy作用于语音信号,然后绘图柱状图来显示光谱熵的分布。

熵= spectralEntropy (speechSignal, fs);直方图(熵,numBins“归一化”“概率”)标题(语音信号的谱熵

图中包含一个坐标轴。在语音信号谱熵的坐标轴上包含一个直方图类型的对象。

输入参数

全部折叠

音频输入,指定为列向量。

数据类型:|

以Hz为单位的采样率,指定为标量。

数据类型:|

名称-值对的观点

指定可选的逗号分隔的对名称,值参数。的名字参数名和价值为对应值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:detectSpeech (fs, audioIn MergeDistance, 100)

窗口应用于时域,指定为逗号分隔对,由'窗口’和一个真正的向量。向量中的元素个数必须在范围[2,大小(audioIn, 1)].向量中的元素数也必须大于OverlapLength

数据类型:|

相邻窗口之间重叠的样本数量,指定为逗号分隔对,包含'OverlapLength'和范围为[0,大小(窗口, 1)).

数据类型:|

要合并正语音检测决策的样本数量,指定为逗号分隔对,包含'MergeDistance和一个非负标量。

请注意

语音检测的分辨率由跳长给出,其中跳长等于元素个数(窗口)−OverlapLength

数据类型:|

判定阈值,指定为逗号分隔的对,由“阈值'和一个二元向量。

  • 如果没有指定阈值,detectSpeech函数使用在当前输入帧上计算的特征的直方图来获得阈值。

  • 如果您指定阈值,detectSpeech函数跳过了新的决策阈值的推导。当您处理大型数据集时,或者当您部署用于实时推理的深度学习或机器学习管道时,重用语音决策阈值可以提供显著的计算效率。

数据类型:|

输出参数

全部折叠

语音区域的开始和结束索引,返回为anN2矩阵。N对应于检测到的单个语音区域的数量。第一列对应语音区域的开始索引,第二列对应语音区域的结束索引。

数据类型:|

用于决策的阈值,作为双元素向量返回。阈值按顺序排列[能量阈值光谱传播阈值].

数据类型:|

算法

detectSpeech算法基于[1],虽然修改使统计阈值是短期能量和光谱扩散,而不是短期能量和光谱质心。图和步骤提供了算法的高级概述。有关详细信息,请参见[1]

算法中的阶段序列。

  1. 使用指定的参数将音频信号转换为时频表示形式窗口OverlapLength

  2. 计算每一帧的短期能量和光谱扩散。光谱扩展是根据spectralSpread

  3. 直方图是为短期能量和光谱分布创建的。

  4. 对于每个直方图,根据 T W × 1 + 2 W + 1 ,在那里12分别为第一和第二局部极大值。W被设置为5

  5. 通过连续的五元移动中值滤波器,对光谱扩展和短期能量进行时间平滑。

  6. 面罩是通过将短期能量和光谱传播与它们各自的阈值进行比较来创建的。要声明一个帧包含语音,一个特征必须超过它的阈值。

  7. 面具被组合在一起。对于宣布为语音的帧,其短期能量和频谱传播必须高于其各自的阈值。

  8. 如果声明为语音的区域之间的距离小于,则合并它们MergeDistance

参考文献

[1] Giannakopoulos,塞奥佐罗斯•。“一种语音信号的消噪和分割方法,用MATLAB实现”,(雅典大学,雅典,2009)。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。

介绍了R2020a