使用 sox 进行语音检测和流式传输

Using sox for voice detection and streaming

目前,我是这样使用sox的:

sox -d -e u-law --endian little -b 8 -c 1 -r 8000 -t ul - silence 1 0.3 1% 1 0.3 1%

作为参考,这是从默认麦克风录制音频并以 8 位和 8k 速率输出小端、ulaw 格式的音频。效果过滤器会修剪音频,直到噪音达到阈值 0.3 秒,然后继续录制直到有 0.3 秒的静音。所有这些流式传输到我用来流式传输到远程服务器的标准输出。

我正在使用所有这些来录制一些声音,并在我说完后结束。为了触发 sox,我使用专门的硬件来触发记录的开始。我可以切换到使用几乎任何音频格式或编解码器,只要它支持即时 formatting/encoding。我的目标平台是 raspberry pi 2 B 上的 raspbian。

我理想的解决方案是在用户说完后使用 vad 停止录音。我希望这即使在有背景聊天的情况下也能奏效。但是,关于 vad 效果的 sox 文档指出:

The use of the norm effect is recommended, but remember that neither reverse nor norm is suitable for use with streamed audio.

我无法将参数拼凑在一起以使 vad 和流式传输正常工作。是否可以使用 vad 效果停止音频录制,同时仍保持 stdin->sox->stdout 管道?有更好的选择吗?

Is it possible to use the vad effect to stop the recording of audio while still maintaining the stdin->sox->stdout piping?

没有。 vad 效果可以 trim 仅从音频的前面静音。所以你只能用它来检测录制开始,而不是结束和暂停。

reversenorm 过滤器在输出任何数据之前需要所有输入数据,这就是它们不能与流式处理一起使用的原因。

关键是 select 是 silence 过滤器的良好阈值,因此它采用 "background chatter" 作为静音。

您也可以在 silence 之前使用 noisered(使用基于以前录音的配置文件)来减少触发录音的噪音,但这也会影响输出并且可能不会占用 "background chatter" 作为噪声。