一、前言

不知道有没有人和我一样看的官方示例一脸蒙,什么采样率除以时间,看到就头大,还是英文头更大了

好了废话结束,上翻译改编版

二、人话翻译版代码

如果你问我有些行为什么没有注释?

-

import collections
import contextlib
import sys
import wave
import os
import webrtcvad#读取wav判断能否继续
def read_wave(path):#以二进制方式堆区音频数据with contextlib.closing(wave.open(path, 'rb')) as wf:#获取声道数,为1时继续执行num_channels = wf.getnchannels()assert num_channels == 1#采样字节长度,为2时继续执行sample_width = wf.getsampwidth()assert sample_width == 2#获取采样率,当采样率为8000,16000,32000时继续执行sample_rate = wf.getframerate()assert sample_rate in (8000, 16000, 32000)pcm_data = wf.readframes(wf.getnframes())#返回wav的二进制数据与采样率return pcm_data, sample_ratedef write_wave(path, audio, sample_rate):with contextlib.closing(wave.open(path, 'wb')) as wf:#设置声道wf.setnchannels(1)# 设置采样字节长度wf.setsampwidth(2)# 设置采样率wf.setframerate(sample_rate)# 写入数据wf.writeframes(audio)class Frame(object):"""Represents a "frame" of audio data."""def __init__(self, bytes, timestamp, duration):self.bytes = bytesself.timestamp = timestampself.duration = durationdef frame_generator(frame_duration_ms, audio, sample_rate):#采样率*秒数*声道数=量化大小n = int(sample_rate * (frame_duration_ms / 1000.0) * 2)offset = 0timestamp = 0.0#量化大小对应的音频时间duration = (float(n) / sample_rate) / 2.0#如果offset起始量化大小加上量化大小小于音频 -->用来切分音频while offset + n < len(audio):#创建多个Frame类,用来存数据   audio[offset:offset + n]切出来的那一段数据,timestamp这段音频开始时间,duration这段音频的长度yield Frame(audio[offset:offset + n], timestamp, duration)timestamp += durationoffset += ndef vad_collector(sample_rate, buffer_size, vad, frames):# 创建一个有两端的容器,数据溢出用来排除非人声ring_buffer = collections.deque(maxlen=buffer_size)triggered = Falsevoiced_frames = []for frame in frames:# 把二进制数据和采样率交给vadis_speech = vad.is_speech(frame.bytes, sample_rate)#检测说话的开始if not triggered:# 在容器里添加一个对象(Frame类的实例,静音检测结果(True表示有人说))ring_buffer.append((frame, is_speech))#f = Frame() speech = is_speech 得到有人声音的Frame的个数num_voiced = len([f for f, speech in ring_buffer if speech])# 当说话段数量大于缓冲区的90%时认为人声开始,所以进入if时前10段有人声恰好在ring_buffer里if num_voiced > 0.9 * ring_buffer.maxlen:# 通知循环已经找到了音频开始位置triggered = True#输出当前片段的开始时间# 当有9条是人声时,那么最先放进去的一条就是起始位置sys.stdout.write('+(%s)' % (ring_buffer[0][0].timestamp,))# 把音频的二进制数据放到列表for f, s in ring_buffer:voiced_frames.append(f)#清空缓存区ring_buffer.clear()# 检测说话的结束else:# 上面清空了缓存区,所以现在开始写入有人声的数据voiced_frames.append(frame)# 把人声的数据写到列表ring_buffer.append((frame, is_speech))# 获取有多少静音段被写到了ring_buffernum_unvoiced = len([f for f, speech in ring_buffer if not speech])# 当静音段数量大于90%时执行if num_unvoiced > 0.9 * ring_buffer.maxlen:# 此时ring_buffer里有10段静音,那么第一段就是人声的结束位置sys.stdout.write('-(%s)' % (frame.timestamp + frame.duration))# 通知函数找到结束triggered = False# 暂停当前函数,并返回数据yield b''.join([f.bytes for f in voiced_frames])# 因为下次调用函数会从yield后面的语句开始所以删除上一段音频数据ring_buffer.clear()voiced_frames = []#如果到音频结束还没有找到结束时,执行到这里,把音频结束当做人声结束, 这里frame自然就是最后一个if triggered:sys.stdout.write('-(%s)' % (frame.timestamp + frame.duration))sys.stdout.write('\n')#列表部为空返回所有数据if voiced_frames:yield b''.join([f.bytes for f in voiced_frames])def main():path = r"./"files = os.listdir(path)files = [path + "\\" + f for f in files if f.endswith('.wav')]con = 1for i in range(len(files)):args = [3, files[i]]#二进制数据,采样率audio, sample_rate = read_wave(args[1])# 创建VAD实例,并设置模式vad = webrtcvad.Vad(int(args[0]))#切分数据并返回一堆用来存放数据的Rrame类的生成器frames = frame_generator(30, audio, sample_rate)frames = list(frames)#获取人声段的二进制数据 10决定缓冲区大小segments = vad_collector(sample_rate, 10, vad, frames)# 给列表加上一个索引(多条音频时使用,segments被)for j, segment in enumerate(segments):path = './data/' + 'chunk-%002d.wav' % (con,)print(' Writing %s' % (path,))write_wave(path, segment, sample_rate)con += 1if __name__ == '__main__':main()

谷歌VAD静音检测py-webrtcvad使用详解相关推荐

  1. 谷歌 NAS + 目标检测:SpineNet论文详解

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:bearbee 知乎链接:https://zhuanlan.zhihu.co ...

  2. python setting.py_python基础教程:Django框架的中的setting.py文件说明详解

    这篇文章主要介绍了Django框架的中的setting.py文件说明详解,这个文件包含了所有有关这个Django项目的配置信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.加载数据库,数据库 ...

  3. 目标检测算法YOLO-V1算法详解

    ❝ 前面我们一起学了SSD算法的相关知识,如下: SSD目标检测算法必须知道的几个关键点 目标检测算法SSD结构详解 ❞ 今天我们学习另一系列目标检测算法YOLO(You Only Look Once ...

  4. Django框架的中的setting.py文件说明详解

    这篇文章主要介绍了Django框架的中的setting.py文件说明详解,这个文件包含了所有有关这个Django项目的配置信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.加载数据库,数据库 ...

  5. python基础教程:Django框架的中的setting.py文件说明详解

    这篇文章主要介绍了Django框架的中的setting.py文件说明详解,这个文件包含了所有有关这个Django项目的配置信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.加载数据库,数据库 ...

  6. 目标检测模型YOLO-V1损失函数详解

    ❝ 上期我们一起学习了YOLOV1算法的原理框架,如下: 目标检测算法YOLO-V1算法详解 今天我们深入一步,一起学习下关于YOLO-V1算法的损失函数和优缺点. ❞ YOLO-V1损失函数 从上期 ...

  7. python---webRTC~vad静音检测-学习笔记

    参考: https://blog.csdn.net/u012123989/article/details/72771667 webRTC~vad 1. mode 0 ---- quality mode ...

  8. 【动手学PaddlePaddle2.0系列】目标检测理论与YOLOv4详解

    对计算机而言,能够"看到"的是图像被编码之后的数字,所以它很难理解高层语义概念,比如图像或者视频帧中出现的目标是人还是物体,更无法定位目标出现在图像中哪个区域.目标检测的主要目的是 ...

  9. Python 将.py转换为.exe详解

    本文是由@熊猫大哥大的博客修改而来(所以就不能说是"原创"了) 原博客链接:Python学习笔记(15)-Python代码转换为exe可执行程序详解(下面会提到本文与其的一点不同) ...

  10. 目标检测网络之SPP-net详解

    SPP-net详解: 简要概述:SPP-net网络是基于R-CNN结构改进,且仅在候选区域特征提取,以及特征向量大小转化两个方面做出改进,如详细理解SPP-net请先阅读目标检测开山之作R-CNN详解 ...

最新文章

  1. wpf scrollviewer 两个事件相互影响_WPF绘制3D效果显示密集立体集装箱
  2. 看漫画学python电子书-看漫画学Python(有趣有料好玩好用全彩版)
  3. 学python就业要看哪些书-编程0基础自学Python,踩完这些坑,我才成功就业!
  4. 【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )
  5. [cpp]c++中的 _t 类的数据类型
  6. 元宇宙这把火开始烧向打工人
  7. daocloud创建mysql_GitHub - DaoCloud/php-apache-mysql-sample
  8. CSS3 FlexBox布局入门简析
  9. Visual Studio Online 终于公开上线了
  10. 群体智能优化算法之和声搜索(Harmony Search,HS)-附源码
  11. JAVA_JDK下载与安装教程
  12. 云服务器搭建京东签到,在路由器上实现jd京东每日自动签到、自动领京豆,并将签到结果推送至微信...
  13. 现在主流的(大多数人用的)3DMAX是哪个版本?
  14. 【spring mvc】annotation-driven 配置详解
  15. 辰信领创携手天津麒麟全力保障国产操作系统安全
  16. android 发送短信例子
  17. 大厂Java岗春招必看:论一个面渣逆袭之路上必学得那些知识点
  18. Processing Arduino 音频频谱显示
  19. vue后台管理upload(图片上传)
  20. Handlebars 介绍

热门文章

  1. 51单片机数码管静态显示
  2. Android 启动过程介绍
  3. Candence学习篇(5)使用Padstack Editor制作贴片焊盘和通孔焊盘
  4. 解决Extraneous non-props attributes (border, class) were passed to component but could not be
  5. C语言实现Base64编解码(加密和解密)
  6. 使用Python对视频任意矩形区域进行裁剪
  7. 征文分享|OceanBase 对分布式事务的支持能力评测与分析
  8. 2014年值得关注的10个开源项目(下)
  9. php订单超过未支付,商城订单未支付30分钟自动取消
  10. 帝国CMS7.2重置后台密码