基于能量或过零率的实时语音分割--学习笔记

重要假设/基础:采集到的音频在起始处有一小段静音,长度为几百毫秒,这是我们估计静音阈值E0的基础,也是语音降噪的基础。

1. 能量energy

  选区一定数量的音频帧,计算其平均能量值,然后加上一个经验值或乘以一个大于1的系数,由此得到E0。

  javascript在浏览器源码页面--console模块下--输出console.log();

      取绝对值:Math.abs()

      x的y次幂:Math.pow(x,y)

      取对数: Math.log(Math, data);

  基于普天信息语音转写平台,web录音和实时语音分割

  • question1: chrome浏览器html5网页中的<script>标签代码找不到js文件及文件内定义的函数function。

  resolve: html-<script>  和 js中定义的方法/添加的语句有错误;

  • question2: chrome能找到js文件,但html5无法调用js方法,报错,而firefox浏览器可以。

  resolve: 清空浏览器历史缓存和清空js缓存(f12---network---disable cache)

  • question3: html5<script>模块程序触发运行时间可能有差距。

  window.clearInterval(clock_detection);
  clock_detection = self.setInterval("audio_detection()", 100); //100ms触发一次
  window.clearInterval(clock); //每个4s调用setInterval中定义的函数showData
  clock = self.setInterval("showData()",4000);

  resolve: console.log()输出触发时间;输出web stream input触发时间

  • question4: HZRecorder.js里buffer数据Float32Array每一位表示二进制还是十进制的语音采样数据?

  resolve: float32array里面是十进制float小数,可以转化为2个Int16Array整数。

     convert: do it directly from the arraybuffer.

     (1) var data_int16array = new Int16Array(data.buffer); //buffer里面是float32array类型数据

   或:(2) var float32 = new Float32Array(data);

        var int16 = new Int16Array(float32.buffer);

        float32: [0.12005, 0.25046, 0.101102, 0.030112]  int16: [-13107, 15823, -42142, 15588]

  javascript.Float32Array类型数组表示的是平台字节顺序为32为的浮点型数组,内容初始化为0:

    float32array.prototype.reduce()传入一个函数作为累加器,从左到右遍历,最终得到一个值

    float32array.prototype.slice()提取数组的一部分并且返回一个新数组

    float32array.prototype.some()如果数组中至少有一个元素满足测试函数的要求,则返回true

    float32array.prototype.subarray()从给定的起始位置返回一个新的float32array

    float32array.get()获取指定索引处的元素

  • question5:单个buffer元素Float32Array长度为4096,跟录音数据长度对不上。

    web api包括:input sample_rate=44100; input sample_bit=16; output sample_rate=8000; output sample_bit=32

    参见:https://developer.mozilla.org/zh-CN/docs/Web/API/AudioContext/createScriptProcessor

    web api AudioContext.createScriptProcessor()创建一个ScriptProcessorNode用于通过javascript直接处理音频

      参数:buffersize:缓存大小必须为其中一个--256, 512, 1024, 2048, 4096, 8192, 16384

  • question6: 较差的录音设备噪音较大,对录音数据有较大影响,尤其是开头静音部分。(手机录音效果不错,有麦克风阵列)

  resolve: 更换设备;外接声卡;麦克风整列;取音频数据最大值进行比较(在较大噪音环境下,效果比能量均值要好)

  • question7:一段静音内判断出多个结束端点

  resolve: 加入triggered_value,加入起始端点触发机制

  • question8: 出现40-60ms长音频

  resolve: 因为list[length] = null,导致buffer.slice(0)截取全部音频

  • question9: triggered激活后,更新audiobuffer.length,否则静音段会被截取出来。
  • question10: firefox火狐浏览器不能设置默认麦克风, can't set default microphone.

  resolve: 添加一个触发函数。在recorder.start()开始之后,激活触发函数。

2. 过零率zero

  优化:

    (1)高通滤波器,它以高于某一截止频率的频率传递信号,并衰减低于截止频率的信号。(我认为不可行,因为web录音实在html和js上,没有现成的python包调用傅里叶变换fft去获得语音频率,如果自己在js中实现,程序运行成本太高,而且也不能保证效果)

    (2)设置一个门限T,将过零率的含义修改为跨过正负门限。(减去门限)

3. 高斯高阶累积量

  《现代语音信号处理》清音、噪音符合高斯分布,高斯四阶及更高阶的累积量会将噪音值清零,只留下有效语音数据,我个人认为其计算很麻烦,我能力不够,没法有效将其实现出来,用到js中。

  -----以后如果哪位大腿实现出来,让我抱抱阿,比心