webrtc静音检测


webrtc静音检测二

语音检测

很多语音检测的比如科大讯飞是使用pcm或者wave传输过去进行语音识别的,流量很大,使用客户端的时候可以使用静音检测算法来减小传输流量。这样做有很多好处,在静音与静音之间的语句可以用来合并成一句话。
这里使用webrtc 的静音检测算法来检测,很有效。但是对于语音支持来讲,分为8000HZ,16000HZ,和32000HZ,并且检测并非直接支持所有方式。
文档指明可以支持10ms , 20ms, 30ms,语音检测。对应于语音可以使用160,320,480 个short 的sample去检测是否静音。如果直接输入4096字节或者2048字节检测,直接返回error -1.

代码

int ret = WebRtcVad_ValidRateAndFrameLength(16000, 480);
	int lenl = len / sizeof(short); // 2048    0-479 480+480-960  961-1441 1442
	short * start = (short *)data;         
	short * end = (short*)(start + lenl);
	int a[5] = { 0,0,0,0,0 };
	int i = 0;
	while (start < end)
	{
		a[i++] = _vadcheck.detect(start, 480);
		start += 480;
		int dlen = end - start;
		if (end - start < 480)
			break;
	}
	start = end - 480;
	a[i] = _vadcheck.detect(start, 480);
	
	OutMessage("status :%d %d %d %d %d", a[0],a[1],a[2],a[3],a[4]);

用WebRtcVad_ValidRateAndFrameLength 函数可以获取是否支持频率的字节(short字节)
如果是2048个sample,其实为4096字节。那么每480个字节检测一下,剩余字节怎么检测,就是像上文一样,可以检测,剩余不够480字节时,直接回退480字节进行剩余检测,在2048个sample中只要有一个检测为1,则该sample非静音。在这里插入图片描述
打印可以看到,说话的时候返回1,不说话的时候都是0,很有效果。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐