代码之家  ›  专栏  ›  技术社区  ›  psihodelia

最简单和快速的音频活动检测方法?

  •  8
  • psihodelia  · 技术社区  · 15 年前

    给定的是一个320个元素(int16)的数组,它表示一个持续20毫秒的音频信号(16位lpcm)。我正在寻找一种最简单、最快速的方法来决定这个数组是否包含活动音频(如语音或音乐),而不是噪音或沉默。我不需要一个非常高质量的决定,但它必须非常快。

    我首先想到的是添加元素的所有平方或绝对值,并将它们的和与阈值进行比较,但这种方法在我的系统中非常慢,即使它是 o(n) .

    4 回复  |  直到 15 年前
        1
  •  6
  •   Martin B    15 年前

    你不会比平方和法快得多。

    到目前为止,您可能还没有做的一个优化是使用一个运行总计。也就是说,在每个时间步骤中,不要求最后n个样本的平方和,而是保持一个连续的总计,并用最近一个样本的平方更新它。为了避免你的跑步总数随着时间的增长而增长,加上指数衰减。在伪代码中:

    decay_constant=0.999;  // Some suitable value smaller than 1
    total=0;
    for t=1,...
        // Exponential decay
        total=total*decay_constant;
    
        // Add in latest sample
        total+=current_sample;
    
        if total>threshold
            // do something
        end
    end
    

    当然,您必须调整衰减常数和阈值以适合您的应用程序。如果速度不够快,无法实时运行,则 认真地 动力不足的数字信号处理器…

        2
  •  2
  •   PeterK    15 年前

    您可以尝试计算两个简单的“统计数据”——首先是分布(max-min)。沉默的传播速度很低。第二种是多样性——将可能值的范围划分为16个方括号(=值范围),然后在遍历元素时,确定元素所在的方括号。所有括号中的“噪音”数字都相同,而音乐或语音应优先选择其中一些括号,而忽略其他括号。

    这应该可以只通过一次数组传递就完成,而不需要复杂的算术运算,只需要对值进行一些加法和比较。

    还要考虑一些近似值,例如,只取第四个值,从而将检查元素的数量减少到80。对于音频信号,这应该是正常的。

        3
  •  1
  •   manneorama    15 年前

    我以前做过类似的事情。经过一些试验,我得出了一个在我的情况下足够有效的解决方案。

    我使用了运行平均值在120ms左右的立方体中的变化率,当有安静(只有噪音)时,表达式应该在零附近徘徊。一旦速率在几次运行中开始增加,您可能会有一些操作正在进行。

    
    rate = cur_avg^3 - prev_avg^3
    

    我用的是立方体,因为正方形不够有力。如果多维数据集要为您减速,请尝试使用平方和位移位。希望这有帮助。

        4
  •  0
  •   INS    15 年前

    很明显,复杂性至少应该是O(n)。也许一些简单的算法可以计算出一些值的范围,但我会寻找 Voice Activity Detection 论网络与信息技术 related code samples .