用Java静默识别WAV文件

问题描述

我需要使用JAVA编写一个函数,如下所示:

输入:.wav文件(或byte [] fileBytes) 输出:true / false(该文件仅包含静

最好的方法是什么?

谢谢。

更新:

  1. 我用于记录的命令:

    arecord --format = S16_LE --max-file-time = 60 --rate = 16000 --file-type = wav randomvalue_i.wav

  2. 静音=完全没有音频

解决方法

好吧,简短的答案是您将要扫描.WAV数据并对其进行最小/最大值设置。一个“无声”文件,其值基本上应该全部为0。

更长的答案是,您将需要了解.WAV格式,您可以在此处找到描述(http://soundfile.sapp.org/doc/WaveFormat/)。您可能可以跳过前44个字节(RIFF,'fmt')以获取数据,然后开始查看字节。标头可能中的“每样本位数”值很重要,因为16位样本意味着您需要将2个“字节”合并在一起才能得到一个样本。但是,即使这样,对于一个静默的16位样本文件,两个字节都将为0。 NumChannels的同上-理论上您应该了解它,但是对于真正的“沉默”而言,两者都应为0。如果所有数据都为“ 0”,则为静默状态。

“静音”有点含糊。上面,我很严格,并假设它只表示真正的“ 0”。但是,在安静的房间中,背景环境噪声仍然非常低。在这种情况下,您需要对比较有所宽容。例如计算每个样本的最小值/最大值,并确保范围在一定的公差范围内。仍然可以确定,但是只是添加了代码。

出于完整性考虑:

public boolean isSilent(byte[] info) {
    for (int idx = 44; idx < info.length; ++idx) {
        if (info[idx] != 0)
            return false;
    }
    return true;
}
,

您可能拥有一个您认为“静音”的.wav文件,并将其与其他.wav文件进行比较,以查看它们是否具有相同的频率。