检测音频包络开始和停止位置的最简单方法

信息处理 过滤器 声音的 过滤器设计
2021-12-24 21:31:11

下面是一个信号,它代表某人说话的录音。我想在此基础上创建一系列较小的音频信号。这个想法是检测“重要”声音何时开始和结束,并使用这些标记来制作新的音频片段。换句话说,我想使用静音作为音频“块”何时开始或停止的指标,并以此为基础制作新的音频缓冲区。

例如,如果一个人记录自己说

Hi [some silence] My name is Bob [some silence] How are you?

然后我想从中制作三个音频剪辑。一个说Hi,一个说My name is Bob,一个说How are you?

我最初的想法是通过音频缓冲区不断检查低振幅区域的位置。也许我可以通过取前十个样本来做到这一点,平均这些值,如果结果很低,则将其标记为无声。我将通过检查接下来的十个样本来继续缓冲区。以这种方式递增,我可以检测到信封在哪里开始和停止。

如果有人对一个好的但简单的方法有任何建议,那就太好了。就我的目的而言,解决方案可能非常初级。

我不是 DSP 的专业人士,但了解一些基本概念。此外,我会以编程方式执行此操作,因此最好谈谈算法和数字样本。

感谢所有的帮助!

在此处输入图像描述


编辑 1

到目前为止反应很好!只是想澄清这不是现场音频,我将自己用 C 或 Objective-C 编写算法,因此任何使用库的解决方案都不是真正的选择。

4个回答

您真正想做的基本上称为语音活动检测或语音检测。

基本上任何纯语音信号(不包含音乐)都包含三个部分。

  1. 浊音 - 基本上是由元音引起的
  2. 清音 - 包含辅音。

人类声音的特点是,虽然在浊音中使用了大量能量,但真正的信息包含在辅音中。此外,浊音通常频率较低,而清音频率较高。[准确地说,对于给定的人,所有浊音或多或少都会产生一个恒定的频率,即他/她的音高]。

现在,任何系统都有噪音。浊音通常足够强大,以至于可以区分可见。当您应用较低频率的过滤时,可以收集良好幅度的浊音,但是清音(具有所有丰富的信息)将丢失。

来到如何解决它的问题:

诀窍在于清音仍然来自共振源。并且固有地限制在一定的频率上。其中,噪音相当均匀。因此,区分这三者的一个简单措施是“局部功率”或替代但等效的方法是采用窗口自相关。

如果您一次取 100 个样本 - 并自动关联自身,如果它仅包含噪声,则结果将几乎为零(这是白噪声的属性),而对于语音信号,这个幅度将是可观察到的,因为信号仍然有更好的结构。这在过去对我有用。

VAD 一直是一个活跃的研究领域——因为几乎所有的移动电话通信都希望检测非语音部分并将其从编码中删除。但是,如果他们将删除非语音语音,这将使电话变得无用。

G.729 标准基于以下特征计算 VAD:线谱频率、全频带能量、低频带能量 (<1 kHz) 和过零率。

GSM 标准的工作方式如下:选项 1 计算九个频段的 SNR 并对这些值应用阈值。选项 2 计算不同的参数:信道功率、语音指标和噪声功率。然后,它使用根据估计的 SNR 变化的阈值对语音度量进行阈值处理。(来自维基百科)

对于更高级的技术,我列出了有关此主题的一些参考资料。

  1. 最常参考:Jongseo Sohn;金南秀;元永盛;“基于统计模型的语音活动检测” Signal Processing Letters,IEEE,1999 年 1 月,卷:6 期:1 pp:1-3

  2. 与您最相关:Mark Marzinzik 和 Birger Kollmeier “通过跟踪功率包络动力学进行噪声谱估计的语音暂停检测”IEEE TRANSACTIONS ON SPEECH AND AUDIO PROCESSING,卷。10,没有。2,2002 年 2 月,第 109 页

  3. 拉米雷斯,J。JM Górriz,JC 塞古拉(2007 年)。“语音活动检测。基本原理和语音识别系统鲁棒性”。在 M. Grimm 和 K. Kroschel 中。强大的语音识别和理解。第 1-22 页。国际标准书号 978-3-902613-08-0。

  4. 介绍性:Jonathan Kola、Carol Espy-Wilson 和 Tarun Pruthi “语音活动检测”

这是语音检测的经典问题。首先要做的是谷歌这个概念。它被广泛用于数字通信,并且对该主题进行了大量研究,并且那里有很好的论文。

通常,您必须处理的背景噪声越多,您的语音检测方法就必须越精细。如果您使用的是在安静的房间中拍摄的录音,您可以很容易地做到这一点(稍后会详细介绍)。如果有人说话时你有各种各样的噪音(卡车经过、狗吠、盘子砸、外星人攻击),你将不得不使用更聪明的东西。

查看您附加的波形,您的噪音很小,所以我建议如下:

  1. 提取信号包络
  2. 选择一个好的阈值
  3. 检测包络幅度超过阈值的地方

这是什么意思呢?信号的包络线是描述其幅度随时间变化的曲线,与它的频率成分如何使其振荡无关(见下图)。

在此处输入图像描述

包络提取可以通过创建一个包含原始信号绝对值的新信号来完成,例如变为,然后对结果进行低通滤波最简单的低通滤波器可以通过将每个样本值替换为其两侧N个邻居的平均值来实现。N的最佳值可以通过实验找到,并且可能取决于您的采样率等多项因素。{1,45,6,2,43,2}{1,45,6,2,43,2}

您可以从图像中看到,您没有太多噪声存在,您的信号包络将始终高于某个阈值(响度级别),您可以将这些区域视为语音检测区域。

我完全赞成 Jim Clay 的做法,但使用信封稍微改变风味:

我们知道语音主要发生在 1-2kHz 左右。您的数据采样可能是 44kHz(这取决于您的录音设备)。所以我首先要做的是在 10 个点上实时取平方信号的移动平均值,以获得信号功率的包络。这将导致检测延迟,因此您希望将其保持在较低水平。

然后,我会在你的系统上添加一个校准阶段:要求用户保持沉默,按下按钮,然后记录背景噪音,比如说 10 秒。取包络的平均幅度或中值幅度,乘以 2 以获得安全性,这将自动为您提供 Jim 一直在谈论的阈值。

如果不是实时记录,您可能会发现使用 0 相位移动平均来减少延迟带来的烦恼很有用。告诉我们它是否适合您。

埃里克,

如果您真的追求快速而肮脏的东西,那么您首先要得到的是信封,我会简单地(在 MATLAB 中)通过以下方式做到这一点:

 envelope = abs(hilbert(yourSignal));

那时,我会简单地设置阈值,如果您超过某个阈值,则“声音存在”。

顺便说一句,这是一个非常简单的解决方案,但它可能对您有用。