【问题标题】:Recognize wav files with silence in Java在 Java 中识别无声的 wav 文件
【发布时间】:2021-01-19 11:00:07
【问题描述】:

我需要一个 JAVA 中的函数,如下所示:

输入:.wav 文件(或 byte[] fileBytes) 输出:真/假(文件只包含静音)

最好的方法是什么?

谢谢。

更新:

  1. 我用来录制的命令:

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

  2. 静音 = 完全没有声音

【问题讨论】:

    标签: java audio wav recording


    【解决方案1】:

    嗯,简短的回答是您需要扫描 .WAV 数据并对其进行最小值/最大值。一个“静默”文件的值基本上都应该是 0。

    更长的答案是您需要了解 .WAV 格式,您可以在此处找到描述 (http://soundfile.sapp.org/doc/WaveFormat/)。您可能可以跳过前 44 个字节(RIFF,'fmt')以深入了解数据,然后开始查看字节。标头中的“bits-per-sample”值可能很重要,因为 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;
    }
    

    【讨论】:

    • 嗨,杰夫。这是我使用的命令:arecord --format=S16_LE --max-file-time=60 --rate=16000 --file-type=wav test.wav
    【解决方案2】:

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

    【讨论】:

    • arecord --format=S16_LE --max-file-time=60 --rate=16000 --file-type=wav test.wav
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多