¿Alguna implementación simple de VAD?

3 minutos de lectura

Estoy buscando algún código C/C++ para VAD (Detección de actividad de voz).

Básicamente, mi aplicación lee marcos PCM del dispositivo. Me gustaría saber cuando el usuario está hablando. No estoy buscando ningún algoritmo de reconocimiento de voz, sino solo detección de voz.

Me gustaria saber cuando el usuario esta hablando y cuando termina:

bool isVAD(short* pcm,size_t count);

Avatar de usuario de John Wiseman
Juan sabio

código abierto de Google WebRTC El código tiene un módulo VAD escrito en C. Utiliza un modelo de mezcla gaussiana (GMM), que suele ser mucho más efectivo que un simple detector de umbral de energía, especialmente en una situación con niveles dinámicos y tipos de ruido de fondo. En mi experiencia, también es mucho más efectivo que el VAD de Moattar-Homayounpour que Gilad menciona en su comentario.

El código VAD es parte del repositorio mucho más grande de WebRTC, pero es muy fácil extraerlo y compilarlo por sí solo. Por ejemplo, el webrtcvad Python wrapper incluye solo la fuente VAD C.

La API WebRTC VAD es muy fácil de usar. En primer lugar, el audio debe ser mono PCM de 16 bits, con una frecuencia de muestreo de 8 KHz, 16 KHz o 32 KHz. Cada cuadro de audio que envíes al VAD debe tener una duración de 10, 20 o 30 milisegundos.

Aquí hay un resumen de un ejemplo que asume audio_frame es 10 ms (320 bytes) de audio a 16000 Hz:

#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);

  • Lo porté a iOS, pero no sé por qué puse algo (audio diferente, tengo mucho fondo y voces), devolverá 1.

    – Tinytont

    18/09/2016 a las 11:00

  • Mi problema está resuelto, resultó que este código solo funciona en little-endian LPCM, cambie a eso y ¡todo listo! Gracias.

    – Tinytont

    20 sep 2016 a las 17:15

  • @Tinyfool, ¿ha publicado su puerto iOS en algún lugar?

    – Chris Raethke

    31 de enero de 2017 a las 6:47

  • El VAD de WebRTC está diseñado para detectar voces reales, pero a veces necesita tiempo/ejemplos para adaptarse. Intente hablar con él primero, luego deje caer un libro y vea si clasifica el ruido de caída como voz.

    – John Wisemann

    20/11/2017 a las 20:50

  • Hola John, estoy agregando el módulo webRTC VAD de: – github.com/wiseman/py-webrtcvad. Ahora tengo un problema de compilación en mi aplicación existente. Estoy usando iOS 12+ mi aplicación en Objective-C. Sugiera si hay algún código de muestra que haya escrito para que lo use iOS.

    –Shashank Gupta

    9 oct 2020 a las 12:09

Hay implementaciones de código abierto en los proyectos Sphinx y Freeswitch. Creo que todos son detectores basados ​​​​en energía, no necesitarán ningún tipo de modelo.

Esfinge 4 (Java pero debería ser fácil de portar a C/C++)

Esfinge de bolsillo

Cambio libre

  • Gracias por los enlaces, Freeswitch me parece el mejor enfoque (C), pero aún parece estar vinculado a un marco más complejo. He encontrado una implementación de python (github.com/shriphani/Listener/blob/master/VAD.py) que parece más simple, pero dado que mi habilidad con Python está por debajo del promedio, sigo buscando una implementación de C/C++.

    – Gilad Novik

    23 de marzo de 2011 a las 6:07


Avatar de usuario de Charles
Charles

Qué tal si LibVAD? www.libvad.com

Parece que eso hace exactamente lo que estás describiendo.

Divulgación: soy el desarrollador detrás de LibVAD

  • Charles, he intentado ponerme en contacto contigo, pero hasta ahora no he tenido suerte.

    – joelittlejohn

    4 de septiembre de 2017 a las 14:28

  • @Charles ¿El sitio www.libvad.com está inactivo desde hace mucho tiempo?

    – CedricSoubrie

    21 oct 2019 a las 17:15

¿Ha sido útil esta solución?