0

我正在开发一个软件,它可以自动记录和提取我声音中的每个单词。我使用 portaudio 库来解决它。但是我一直在检测声音:我将静音的值设置为零,所以如果有一个样本为零,它必须是声音的起点或终点。但是当我运行它时,程序创建了很多单词。我认为因为我通过portaudio读取的值是原始数据,所以不能这样处理。我对吗?我该如何解决?顺便说一句,我正在用 C++ 编码:D

4

2 回答 2

1

要检测 PCM 流中是否存在信号,您可以检测到它。正如 dprogramz 所说,您的声卡的本底噪声可能并不完美,因此会记录一些噪声信号(即使没有连接麦克风)。

解决方案是使用VOXVAD算法来检测您的声音是否存在。VOX 可能很棘手,因为在大多数消费级电子产品中,相对于信号,本底噪声只是低到足以对人耳“静音”。这意味着本底噪声和信号之间的幅度差异可能很小。如果您的声卡开​​启了 AGC,这会使它变得更加困难,因为本底噪声可能会移动。话虽如此,VOX 可以在消费级设备上成功实施。只是需要更多的努力来建立阈值。如果做得最好,则在流处于活动状态时定期计算阈值。

如果我这样做,我会实现一个 VAD 算法。由于您的目标是检测您的声音,因此无论您使用何种设备,这都应该提供可靠的结果。

于 2013-10-12T12:05:40.640 回答
0

我不认为这是因为它是 RAW 值。RAW 声音文件是频率和音量信息的比特流。

但是,该值很少(如果有的话)为零。您必须考虑到麦克风会产生少量的电噪声。找出你的麦克风的“空闲”分贝(只需在你不说话的时候测试它的电平)。然后,您需要设置一个静音阈值(对于一定数量的样本,低于一定的 dB 水平)来检测开始/结束。试图检测零值几乎是不可能的。

于 2013-10-11T18:59:14.763 回答