目前,我正在解析wav文件并将示例存储在std::vector<int16_t> sample中。现在,我想对这些数据应用VAD (语音活动检测)来找出语音的“区域”,更具体地说,找出words的开始和结束。
解析的wav文件是16 The,16位PCM,mono。我的代码在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为10 ms (320字节)的16000 Hz音频的示例: 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
}现在,我不太确定这是否正确。另外,我也不确定这是否给了我正确的输出。
所以,
发布于 2017-06-09 17:16:53
我首先要说的是,不,我不认为你能用VAD将一个话语分割成单独的单词。来自维基百科关于语音切分的文章
人们可能会想到,许多书面语言(如英语或西班牙语)所使用的单词间空间与他们的口语版本中的停顿相对应,但只有在非常缓慢的演讲中才是如此,当演讲者故意插入这些停顿时才是如此。在正常的言语中,人们通常会发现有许多连续的单词被说出来,它们之间没有停顿,通常一个单词的最后一个声音会平滑地融合或与下一个单词的初始音融合。
话虽如此,我会尽力回答你的其他问题。
sox的东西将WAV文件转换为原始音频。此命令将任何格式的WAV文件转换为16 KHz,16位PCM,格式为WebRTCVAD所期望的格式:
sox my_file.wav -r 16000 -b 16 -c 1 -e符号-整数-B my_file.rawWebRtcVad_Process返回的浊音结果。然后,您可以尝试一个文件,除了中间的一个简短的语句外,其他的文件都是静默的。如果您想要与现有的测试进行比较,py-webrtcvad模块有一个单元测试,可以这样做;请参见函数。https://stackoverflow.com/questions/44457162
复制相似问题