有没有简单的语音活动检测实现?

17

我正在寻找一些用于VAD(语音活动检测)的C/C ++代码。

基本上,我的应用程序正在从设备读取PCM帧。我想知道用户何时在说话。我不是在寻找任何语音识别算法,而只是想要声音检测。

我想知道用户何时在说话以及何时结束:

bool isVAD(short* pcm,size_t count);

3个回答

25

谷歌开源的WebRTC代码中包含一个用C语言编写的VAD模块。它使用了高斯混合模型(GMM),在动态背景噪声水平和类型情况下通常比简单的能量门限检测器效果更好。根据我的经验,它也比Gilad在他们的评论中提到的Moattar-Homayounpour VAD更有效。

VAD代码是WebRTC存储库中非常庞大的一部分,但很容易将其拆分并单独编译。例如,webrtcvad Python封装程序仅包括VAD C源代码。

WebRTC VAD API非常易于使用。首先,音频必须是8 KHz、16 KHz或32 KHz采样率下的单声道16位PCM。您发送给VAD的每个音频帧必须为10毫秒、20毫秒或30毫秒长。

以下是一个示例概要,假设audio_frame是16000 Hz下10毫秒(320字节)的音频数据:

#include "webrtc/common_audio/vad/include/webrtc_vad.h"
// ...
VadInst *vad;
WebRtcVad_Create(&vad);
WebRtcVad_Init(vad);
int is_voiced = WebRtcVad_Process(vad, 16000, audio_frame, 160);

4
我的问题已经解决了,结果发现这段代码只适用于小端的LPCM,改为小端后一切都搞定了!谢谢。 - Tinyfool
@Tinyfool,你把你的iOS移植版发布在哪里了吗? - chris raethke
2
WebRTC VAD旨在检测真实的声音,但有时需要时间/示例来适应。请先尝试与它交谈,然后放下一本书,看看它是否将掉落的噪音分类为声音。 - John Wiseman
将小端点加1。使您的recordFormat为kAudioFormatLinearPCM,并且mFormatFlags &= ~kLinearPCMFormatFlagIsBigEndian,然后像平常一样设置标志mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked。最后,使用小端音频格式。WAVE非常适合。 - user3857868
1
嗨John,我正在从以下网址添加webRTC VAD模块:https://github.com/wiseman/py-webrtcvad。现在我在我的现有应用程序中遇到了编译问题。我正在使用iOS 12+和Objective-C编写我的应用程序。 请问您是否编写过用于iOS的示例代码? - Shashank Gupta
显示剩余3条评论

8
在Sphinx和Freeswitch项目中有开源实现。我认为它们都是基于能量的探测器,因此不需要任何模型。 Sphinx 4(Java,但应易于移植到C / C ++) PocketSphinx Freeswitch

4
谢谢提供链接。Freeswitch 似乎是我更适合的选择(使用 C),但它仍然似乎与一个更复杂的框架相关联。我找到了一个 Python 实现(https://github.com/shriphani/Listener/blob/master/VAD.py),它似乎更简单,但由于我的 Python 技能低于平均水平,我仍在寻找一个 C/C++ 实现。 - Gilad Novik

2
如何使用LibVADwww.libvad.com 看起来它正好符合你所描述的需求。
声明:我是LibVAD的开发者。

Charles,我一直在尝试联系你,但迄今为止没有成功。 - joelittlejohn
2
@Charles 网站www.libvad.com已经挂了很长时间了? - CedricSoubrie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接