【发布时间】:2021-01-19 11:00:07
【问题描述】:
我需要一个 JAVA 中的函数,如下所示:
输入:.wav 文件(或 byte[] fileBytes) 输出:真/假(文件只包含静音)
最好的方法是什么?
谢谢。
更新:
-
我用来录制的命令:
arecord --format=S16_LE --max-file-time=60 --rate=16000 --file-type=wav randomvalue_i.wav
-
静音 = 完全没有声音
【问题讨论】:
我需要一个 JAVA 中的函数,如下所示:
输入:.wav 文件(或 byte[] fileBytes) 输出:真/假(文件只包含静音)
最好的方法是什么?
谢谢。
更新:
我用来录制的命令:
arecord --format=S16_LE --max-file-time=60 --rate=16000 --file-type=wav randomvalue_i.wav
静音 = 完全没有声音
【问题讨论】:
嗯,简短的回答是您需要扫描 .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;
}
【讨论】:
您可以拥有一个您认为“静音”的 .wav 文件,并将其与另一个 .wav 文件进行比较,看看它们是否具有相同的频率。
【讨论】: