首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webRTC :如何通过从WAV文件获取的示例在音频上应用webRTC的VAD

webRTC :如何通过从WAV文件获取的示例在音频上应用webRTC的VAD
EN

Stack Overflow用户
提问于 2017-06-09 11:55:19
回答 1查看 8.1K关注 0票数 6

目前,我正在解析wav文件并将示例存储在std::vector<int16_t> sample中。现在,我想对这些数据应用VAD (语音活动检测)来找出语音的“区域”,更具体地说,找出words的开始和结束。

解析的wav文件是16 The,16位PCM,mono。我的代码在C++中。

我已经搜索了很多关于webRTC的VAD功能的文档,但是找不到合适的文档。

据我所发现,我需要使用的函数是WebRtcVad_Process()。它的原型如下所示:

代码语言:javascript
复制
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);

这是合理的:

代码语言:javascript
复制
1 sample = 2B = 16 bits  
SampleRate = 16000 sample/sec = 16 samples/ms  
For 10 ms, no of samples    =   160  

因此,在此基础上,我实施了以下措施:

代码语言:javascript
复制
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?
  • 有可能把口语区分开来吗?
  • 检查我得到的输出是否正确的最好方法是什么?
  • 如果没有,完成这项任务的最佳方法是什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-09 17:16:53

我首先要说的是,不,我不认为你能用VAD将一个话语分割成单独的单词。来自维基百科关于语音切分的文章

人们可能会想到,许多书面语言(如英语或西班牙语)所使用的单词间空间与他们的口语版本中的停顿相对应,但只有在非常缓慢的演讲中才是如此,当演讲者故意插入这些停顿时才是如此。在正常的言语中,人们通常会发现有许多连续的单词被说出来,它们之间没有停顿,通常一个单词的最后一个声音会平滑地融合或与下一个单词的初始音融合。

话虽如此,我会尽力回答你的其他问题。

  1. 在运行VAD之前,您需要将可以压缩的WAV文件解码为原始的PCM音频数据。参见例如用C/C++读取和处理WAV文件数据。或者,在运行代码之前,您可以使用类似于sox的东西将WAV文件转换为原始音频。此命令将任何格式的WAV文件转换为16 KHz,16位PCM,格式为WebRTCVAD所期望的格式: sox my_file.wav -r 16000 -b 16 -c 1 -e符号-整数-B my_file.raw
  2. 看起来你使用的是正确的函数。更具体地说,您应该这样做: #包括"webrtc/common_audio/vad/include/webrtc_vad.h“// .VadInst *vad;WebRtcVad_Create(&vad);WebRtcVad_Init(vad);const int16_t * temp = sample.data();for(int i= 0,ms = 0;i< sample.size();i += 160,ms += 10) { int isActive = WebRtcVad_Process(vad,16000,temp,160);//10 ms窗口:std:cout << ms <<“ms:”<< isActive <<::endl;temp = temp + 160;// 160个样本(320字节)}
  3. 要查看它是否有效,可以运行已知的文件,并查看是否得到了预期的结果。例如,您可以从处理沉默开始,并确认您从未(或很少--此算法不完美)看到从WebRtcVad_Process返回的浊音结果。然后,您可以尝试一个文件,除了中间的一个简短的语句外,其他的文件都是静默的。如果您想要与现有的测试进行比较,py-webrtcvad模块有一个单元测试,可以这样做;请参见函数
  4. 要进行字级切分,您可能需要找到一个语音识别库来完成这个任务,或者允许您访问所需的信息。在Kaldi邮件列表上的这个线程似乎在谈论如何逐字逐句地分割。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44457162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档