读代码 判断音频是否有声音

 注释  杠 * 杠  coding 冒号  utf 杠 8  杠 * 杠 
import os
import wave
from time import sleep
import numpy as np

 s u c c e s s = 0
 f A i l = 1

 注释  需要添加录音互斥功能能 逗号 某些功能开启的时候录音暂时关闭
 定义方法 Z c r 括号 cur frame 括回  冒号 
     注释  过零率
    tmp1 = cur frame 方括号  冒号  杠 1 方括回 
    tmp2 = cur frame 方括号 1 冒号  方括回 
    sings =  括号 tmp1 * tmp2 <= 0 括回 
    diffs =  括号 tmp1  杠  tmp2 括回  > 0 点 02
    zcr = np 点 sum 括号 sings * diffs 括回 
    return zcr


 定义方法  s t e 括号 cur frame 括回  冒号 
     注释  短时能量
    amp = np 点 sum 括号 np 点 abs 括号 cur frame 括回  括回 
    return amp


 定义对象  vad 括号 object 括回  冒号 
     定义方法  划  划 init 划  划  括号 self 括回  冒号 
         注释  初始短时能量高门限
        self 点 amp1 = 140
         注释  初始短时能量低门限
        self 点 amp2 = 120
         注释  初始短时过零率高门限
        self 点 zcr1 = 10
         注释  初始短时过零率低门限
        self 点 zcr2 = 5
         注释  允许最大静音长度
        self 点 maxsilence = 100
         注释  语音的最短长度
        self 点 minlen = 40
         注释  偏移值
        self 点 offsets = 40
        self 点 offsete = 40
         注释  能量最大值
        self 点 max 划 en = 20000
         注释  初始状态为静音
        self 点 status = 0
        self 点 count = 0
        self 点 silence = 0
        self 点 frame 划 len = 256
        self 点 frame 划 inc = 128
        self 点 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 =  空对象 

     定义方法 clean 括号 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 =  false

     定义方法 go 括号 self 括回  冒号 
        self 点 wait 划 flag =  false

     定义方法 wait 括号 self 括回  冒号 
        self 点 wait 划 flag =  true

     定义方法 stop 括号 self 括回  冒号 
        self 点 on =  false

     定义方法 add 括号 self 逗号  frame 逗号  wait= true 括回  冒号 
        if wait 冒号 
            print 'wait'
            frame = self 点 cache + frame

        while len 括号 frame 括回  > self 点 frame 划 len 冒号 
            frame 划 block = frame 方括号  冒号 self 点 frame 划 len 方括回 
            self 点 cache 划 frames 点 append 括号 frame 划 block 括回 
            frame = frame 方括号 self 点 frame 划 len 冒号  方括回 
        if wait 冒号 
            self 点 cache = frame
        else 冒号 
            self 点 cache = ""
            self 点 cache 划 frames 点 append 括号  杠 1 括回 

     定义方法 run 括号 self 逗号 has num 括回  冒号 
        print "开始执行音频端点检测"
        step = self 点 frame 划 len  杠  self 点 frame 划 inc
        num = 0
        while 1 冒号 
             注释  开始端点
             注释  获得音频文件数字信号
            if self 点 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 = Z c r 括号 data 括回 
             注释  获得音频的短时能量 逗号  平方放大
            amp =  s t e 括号 data 括回  ** 2
             注释  返回当前音频数据状态
            res = self 点 speech 划 status 括号 amp 逗号  zcr 括回 

            if res == 2 冒号 
                has num += 1

            if has num > 10 冒号 
                print '+++++++++++++++++++++++++有声音++++++++++++++++++++++++'
                break
            num = 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
            if self 点 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

     定义方法 speech 划 status 括号 self 逗号  amp 逗号  zcr 括回  冒号 
        status = 0
         注释  0= 静音, 1= 可能开始 逗号  2=确定进入语音段
        if self 点 cur 划 status in  方括号 0 逗号  1 方括回  冒号 
             注释  确定进入语音段
            if amp > self 点 amp1 冒号 
                status = 2
                self 点 silence = 0
                self 点 count += 1
             注释  可能处于语音段
            elif amp > self 点 amp2 or zcr > self 点 zcr2 冒号 
                status = 1
                self 点 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 += 1
                status = 2
             注释  语音将结束
            else 冒号 
                 注释  静音还不够长,尚未结束
                self 点 silence += 1
                if self 点 silence < self 点 maxsilence 冒号 
                    self 点 count += 1
                    status = 2
                 注释  语音长度太短认为是噪声
                elif self 点 count < self 点 minlen 冒号 
                    status = 0
                    self 点 silence = 0
                    self 点 count = 0
                 注释  语音结束
                else 冒号 
                    status = 3
                    self 点 silence = 0
                    self 点 count = 0
        return status


 定义方法 read 划 file 划 data 括号 filename 括回  冒号 
     注释 
    输入 冒号 需要读取的文件名
    返回 冒号 (声道,量化位数,采样率,数据 括回 
     注释 
    read 划 file = wave 点 open 括号 filename 逗号  "r" 括回 
    params = read 划 file 点 getparams 括号  括回 
    nchannels 逗号  sampwidth 逗号  framerate 逗号  nframes = params 方括号  冒号 4 方括回 
    data = read 划 file 点 readframes 括号 nframes 括回 
    return nchannels 逗号  sampwidth 逗号  framerate 逗号  data

 定义对象  file parser 括号  vad 括回  冒号 
     定义方法  划  划 init 划  划  括号 self 括回  冒号 
        self 点 block 划 size = 256
         vad 点  划  划 init 划  划  括号 self 括回 
     定义方法 read 划 file 括号 self 逗号  filename 括回  冒号 
        if not os 点 path 点 isfile 括号 filename 括回  冒号 
            print "文件%s不存在" % filename
            return  f A i l
        datas = read 划 file 划 data 括号 filename 括回  方括号  杠 1 方括回 
        self 点 add 括号 datas 逗号   false 括回 

if  划  划 name 划  划  == " 划  划 main 划  划 " 冒号 
    stream 划 test =  file parser 括号  括回 

    filename = 'sf 划 id001 划 2017 杠 01 杠 11 划 10 划 53 划 56 点 wav'
    result = stream 划 test 点 read 划 file 括号 filename 括回 
    if result  不等于   f A i l 冒号 
        stream 划 test 点 run 括号 0 括回 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值