识别无声的 wav 文件 Java

Recognize wav files with silence in Java

我需要 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 文件,并将其与另一个 .wav 文件进行比较,看看它们是否具有相同的频率。

好吧,简短的回答是您需要扫描 .WAV 数据并对其执行 min/max 值。一个“静默”文件的值基本上应该都是 0。

较长的答案是您需要了解 .WAV 格式,您可以在此处找到描述 (http://soundfile.sapp.org/doc/WaveFormat/)。您可能可以跳过前 44 个字节(RIFF,'fmt')以了解数据,然后开始查看字节。来自 header 的 'bits-per-sample' 值可能 很重要,因为 16 位样本意味着您需要将 2 'bytes' 合并在一起才能得到一个样本。但是,即便如此,对于一个无声的 16 位示例文件,两个字节都将为 0。 NumChannels 的同上 - 理论上你应该理解它,但同样,对于 true 'silent',两者都应该是 0。如果所有数据都为'0',则无声。

“沉默”有点含糊。上面,我很严格,并假设它仅表示真正的“0”。然而,在一个安静的房间里,背景环境噪音的水平仍然很低。在那种情况下,您需要对比较更加宽容一些。例如为每个样本计算一个 min/max ,并确保该范围在一定的公差范围内。还是可以确定的,只是加了代码

完整性:

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