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


    重要假设/基础:采集到的音频在起始处有一小段静音,长度为几百毫秒,这是我们估计静音阈值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中。

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

    天狼啸月
  • 相关阅读:
    web 后台返回json格式数据的方式(status 406)
    消息队列比较
    CAP
    Redis分布式锁的正确实现方式
    idea 快捷键
    给web请求加遮罩动画
    java动态代理实现与原理详细分析(代码层面解释了AOP的实现)
    Spring框架IOC和AOP的实现原理(概念)
    springboot后台控制重定向
    消息队列如何保证幂等性?
  • 原文地址:https://www.cnblogs.com/yuyongsheng1990/p/9531058.html
Copyright © 2020-2023  润新知