【发布时间】:2017-06-09 11:55:19
【问题描述】:
目前,我正在解析 wav 文件并将 samples 存储在 std::vector<int16_t> sample 中。现在,我想对这些数据应用 VAD(语音活动检测)来找出语音的“区域”,更具体地说,是单词的开头和结尾。
解析的 wav 文件为 16KHz、16 位 PCM、单声道。我的代码是 C++。
我对此进行了很多搜索,但找不到有关 webRTC 的 VAD 功能的适当文档。
根据我的发现,我需要使用的函数是WebRtcVad_Process()。它的原型写在下面:
int WebRtcVad_Process(VadInst* handle, int fs, const int16_t* audio_frame,
size_t frame_length)
从我在这里找到的:https://stackoverflow.com/a/36826564/6487831
您发送到 VAD 的每一帧音频的长度必须为 10、20 或 30 毫秒。 下面是假设 audio_frame 是 16000 Hz 的 10 毫秒(320 字节)音频的示例大纲:
int is_voiced = WebRtcVad_Process(vad, 16000, audio_frame, 160);
有道理:
1 sample = 2B = 16 bits
SampleRate = 16000 sample/sec = 16 samples/ms
For 10 ms, no of samples = 160
所以,基于我已经实现了这个:
const int16_t * temp = sample.data();
for(int i = 0, ms = 0; i < sample.size(); i += 160, ms++)
{
int isActive = WebRtcVad_Process(vad, 16000, temp, 160); //10 ms window
std::cout<<ms<<" ms : "<<isActive<<std::endl;
temp = temp + 160; // processed 160 samples
}
现在,我不确定这是否正确。另外,我也不确定这是否给了我正确的输出。
所以,
- 是否可以使用直接从 wav 文件解析的样本,还是需要一些处理?
- 我是否正在寻找正确的函数来完成这项工作?
- 如何使用该函数对音频流正确进行VAD?
- 是否可以区分口语?
- 检查我得到的输出是否正确的最佳方法是什么?
- 如果不是,那么完成这项任务的最佳方法是什么?
【问题讨论】:
标签: c++ audio webrtc speech-recognition voice-recognition