#-*- coding: utf-8 -*-

importosimportwavefrom time importsleepimportnumpy as np

SUCCESS=0

FAIL= 1

#需要添加录音互斥功能能,某些功能开启的时候录音暂时关闭

defZCR(curFrame):#过零率

tmp1 = curFrame[:-1]

tmp2= curFrame[1:]

sings= (tmp1 * tmp2 <=0)

diffs= (tmp1 - tmp2) > 0.02zcr= np.sum(sings *diffs)returnzcrdefSTE(curFrame):#短时能量

amp =np.sum(np.abs(curFrame))returnampclassVad(object):def __init__(self):#初始短时能量高门限

self.amp1 = 140

#初始短时能量低门限

self.amp2 = 120

#初始短时过零率高门限

self.zcr1 = 10

#初始短时过零率低门限

self.zcr2 = 5

#允许最大静音长度

self.maxsilence = 100

#语音的最短长度

self.minlen = 40

#偏移值

self.offsets = 40self.offsete= 40

#能量最大值

self.max_en = 20000

#初始状态为静音

self.status =0

self.count=0

self.silence=0

self.frame_len= 256self.frame_inc= 128self.cur_status=0

self.frames=[]#数据开始偏移

self.frames_start =[]

self.frames_start_num=0#数据结束偏移

self.frames_end =[]

self.frames_end_num=0#缓存数据

self.cache_frames =[]

self.cache= ""

#最大缓存长度

self.cache_frames_num =0

self.end_flag=False

self.wait_flag=False

self.on=True

self.callback=None

self.callback_res=[]

self.callback_kwargs={}defclean(self):

self.frames=[]#数据开始偏移

self.frames_start =[]

self.frames_start_num=0#数据结束偏移

self.frames_end =[]

self.frames_end_num=0#缓存数据

self.cache_frames =[]#最大缓存长度

self.cache_frames_num =0

self.end_flag=False

self.wait_flag=Falsedefgo(self):

self.wait_flag=Falsedefwait(self):

self.wait_flag=Truedefstop(self):

self.on=Falsedef add(self, frame, wait=True):ifwait:print 'wait'frame= self.cache +framewhile len(frame) >self.frame_len:

frame_block=frame[:self.frame_len]

self.cache_frames.append(frame_block)

frame=frame[self.frame_len:]ifwait:

self.cache=frameelse:

self.cache= ""self.cache_frames.append(-1)defrun(self,hasNum):print "开始执行音频端点检测"step= self.frame_len -self.frame_inc

num=0while 1:#开始端点

#获得音频文件数字信号

ifself.wait_flag:

sleep(1)continue

if len(self.cache_frames) < 2:

sleep(0.05)continue

if self.cache_frames[1] == -1:print '----------------没有声音--------------'

break

#从缓存中读取音频数据

record_stream = "".join(self.cache_frames[:2])

wave_data= np.fromstring(record_stream, dtype=np.int16)

wave_data= wave_data * 1.0 /self.max_en

data=wave_data[np.arange(0, self.frame_len)]

speech_data=self.cache_frames.pop(0)#获得音频过零率

zcr =ZCR(data)#获得音频的短时能量, 平方放大

amp = STE(data) ** 2

#返回当前音频数据状态

res =self.speech_status(amp, zcr)if res == 2:

hasNum+= 1

if hasNum > 10:print '+++++++++++++++++++++++++有声音++++++++++++++++++++++++'

breaknum= num + 1

#一段一段进行检测

self.frames_start.append(speech_data)

self.frames_start_num+= 1

if self.frames_start_num ==self.offsets:#开始音频开始的缓存部分

self.frames_start.pop(0)

self.frames_start_num-= 1

ifself.end_flag:#当音频结束后进行后部缓存

self.frames_end_num += 1

#下一段语音开始,或达到缓存阀值

if res == 2 or self.frames_end_num ==self.offsete:

speech_stream= b"".join(self.frames +self.frames_end)

self.callback_res.append(self.callback(speech_stream,**self.callback_kwargs))#数据环境初始化

#self.clean()

self.end_flag =False

self.frames=[]

self.frames_end_num=0

self.frames_end=[]

self.frames_end.append(speech_data)if res == 2:if self.cur_status in [0, 1]:#添加开始偏移数据到数据缓存

self.frames.append(b"".join(self.frames_start))#添加当前的语音数据

self.frames.append(speech_data)if res == 3:print '检测音频结束'self.frames.append(speech_data)#开启音频结束标志

self.end_flag =True

self.cur_status=res#return self.callback_res

defspeech_status(self, amp, zcr):

status=0#0= 静音, 1= 可能开始, 2=确定进入语音段

if self.cur_status in [0, 1]:#确定进入语音段

if amp >self.amp1:

status= 2self.silence=0

self.count+= 1

#可能处于语音段

elif amp > self.amp2 or zcr >self.zcr2:

status= 1self.count+= 1

#静音状态

else:

status=0

self.count=0

self.count=0#2 = 语音段

elif self.cur_status == 2:#保持在语音段

if amp > self.amp2 or zcr >self.zcr2:

self.count+= 1status= 2

#语音将结束

else:#静音还不够长,尚未结束

self.silence += 1

if self.silence

self.count+= 1status= 2

#语音长度太短认为是噪声

elif self.count

status=0

self.silence=0

self.count=0#语音结束

else:

status= 3self.silence=0

self.count=0returnstatusdefread_file_data(filename):"""输入:需要读取的文件名

返回:(声道,量化位数,采样率,数据)"""read_file= wave.open(filename, "r")

params=read_file.getparams()

nchannels, sampwidth, framerate, nframes= params[:4]

data=read_file.readframes(nframes)returnnchannels, sampwidth, framerate, dataclassFileParser(Vad):def __init__(self):

self.block_size= 256Vad.__init__(self)defread_file(self, filename):if notos.path.isfile(filename):print "文件%s不存在" %filenamereturnFAIL

datas= read_file_data(filename)[-1]

self.add(datas, False)if __name__ == "__main__":

stream_test=FileParser()

filename= 'test1566606924822.wav'result=stream_test.read_file(filename)if result !=FAIL:

stream_test.run(0)

python 声音强度检测_python检测音频中的静音相关推荐

  1. java数字音频最强教程之如何检测一段音频中是否有声音

    声音检测 随着人工智能的发展,机器视觉,机器可视化也变的越来越完善,但是声音这块分析资料却比较少,有时候需要去检测一段视频或者音频中是否有声音.在某些场景中需要判断有声音则抓拍录制,当然这里只是先初步 ...

  2. python 字典 删除指定_python删除字典中的某个值

    Q1:python中字典不用了怎么删除 如果你要删除整个变量,python里面垃圾是自动收集的,不用你太去关心.一定要用,就del 变量名. 如果你是要修改一个字典的内容,比如从里面删除一个元素,一般 ...

  3. python两两组合_python – 一个列表中的两个组合列表

    我是一个Python初学者.我想从一个列表中获取两个组合列表. 例如,我有一个列表: c = [1, 2, 3, 4] 我想使用每四个项目来获得每个可能的组合来填充两个列表.将会有((2 ^ 4)/ ...

  4. python数据可视化库_python和r中用于数据可视化的前9个库

    python数据可视化库 In the rapidly growing world of today, when technology is expanding at a rate like neve ...

  5. python3123_使用sox和python,基于时间戳列表对音频区域进行静音处理

    我有一个音频文件. 我有一堆[开始,结束]时间戳段.在 我想要实现的目标: 假设音频长度为6:00分钟. 我有段是:[[0.0,4.0],[8.0,12.0],[16.0,20.0],[24.0,28 ...

  6. python 声音强度检测_怎样表达一段语音的强度(响度)?

    我希望通过一段语音分析语音的强度(响度). 因为是工科狗而非理科狗,且对于音频信号分析是外行,只简单看了下FFT,所以对于自己分析语音强度的方法没有安全感.希望这方面的高手能够指导下.非常感谢!!! ...

  7. python测试网站功能_Python检测网站链接是否已存在

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl语言一样, Pyt ...

  8. python监控服务器是否在线_python检测服务器是否正常

    #!/usr/bin/python # encoding=utf-8 # Filename: net_is_normal.py import os import socket import subpr ...

  9. python去除图片马赛克_python 检测图片是否有马赛克

    首先是canny边缘检测,将图片的边缘检测出来,参考博客 原理讲的很清晰,给原博主一个赞 边缘检测之后按照正方形检索来判定是否是马赛克内容 原理知晓了之后就很好做了 话说matlab转化为python ...

最新文章

  1. python应该安装哪一个_python安装到哪个盘
  2. 后端开发开发mac装机和开发环境指南(新手版)
  3. JavaScript——使用正则表达式提取指定格式内容
  4. take the bull by the horns blow one's own horn
  5. 让nginx支持thinkphp rewrite模式
  6. 1859. 将句子排序
  7. python文字游戏 生成数字菜单_python自学日记5——文字游戏
  8. web api添加拦截器
  9. 四川南充计算机经贸学校,四川南充工贸学校计算机应用专业秋季计划
  10. python将mongodb导出_使用python从mongodb将数据导出到csv
  11. 网上书城_前端动态加载类别and书籍显示
  12. 冒泡排序java简单实现
  13. win7 oem key
  14. spotlight搜索失效_如何阻止某些应用在iPhone上的Spotlight搜索中显示内容
  15. 简简单单批量安装windows主机
  16. 计算机网络 - 概述
  17. CSS基础(复合选择器-三大特性)
  18. 温度转换java小程序_利用easygui模块编写的华氏温度与摄氏温度转换的小程序
  19. 单片机设计 测量频率
  20. BHex宣布完成1500万美元天使轮融资

热门文章

  1. python好学吗 老程序员-学习python,难道是为了当一名苦逼的程序员吗?
  2. OD调试常见断点及原理(浓缩版)
  3. ubuntu16.04上搭建stm32f4开发环境
  4. 最低成本的ARM调试解决方案——有关于Wiggler、H-Jtag、OpenOCD、GDB
  5. vue高德地图JS API 实现海量点标记展示
  6. Redis 高级 Java 客户端 Lettuce 的用法及踩坑经验
  7. 面对职场“毕业”,PMPMO应该如何从容的应对?如何跳槽能够大幅度升职加薪?【大海午餐】
  8. 如何使用Access创建一个简单MIS管理系统_Access
  9. 改进YOLOv7系列:首发最新结合Global Context Modeling结构(附YOLOv5改进),目标检测高效涨点
  10. WARNING:tensorflow:`add_update` `inputs` kwarg has been deprecated.