Android 静音检测

一、背景

做语音评测的时候需要在用户不说话的时候自动停止,这时候就需要判断什么时候不说话处于静音的状态。

二、原理

每次录音的时候可以根据录音的数据计算出音强,设定一个音强值为上限,当音强超过这个值的时候判断为非静音当小于这个值的时候判断为静音,当静音次数连续达到一定的次数的时候就停止录音。

三、代码实现
1.计算音强
/**
  * 计算音量
  *
  * @param buffer 录音数据
  * @return 音强
  */
 public static double calculateVolume(byte[] buffer) {
     double sumVolume = 0.0;
     double avgVolume = 0.0;
     double volume = 0.0;

     for (int i = 0; i < buffer.length; i += 2) {
         int v1 = buffer[i] & 0xFF;
         int v2 = buffer[i + 1] & 0xFF;
         int temp = v1 + (v2 << 8);
         if (temp >= 0x8000) {
             temp = 0xffff - temp;
         }
         sumVolume += Math.abs(temp);
     }
     avgVolume = sumVolume / buffer.length / 2;
     volume = Math.log10(1 + avgVolume) * 10;
     return volume;
 }
2.静音检测
class VadManager : VadInterface {
    /**
     * vad 配置
     */
    private var mConfig: Config? = null

    /**
     * 录音取数据次数
     */
    private var mCount = 0

    /**
     * 前端点静音次数
     */
    private var mBeginMuteCount = 0

    /**
     * 前端点最大静音次数
     */
    private var mBeginMuteMaxCount = 9

    /**
     * 后端点静音次数
     */
    private var mEndMuteCount = 0

    /**
     * 后端点最大静音次数
     */
    private var mEndMuteMaxCount = 9

    companion object {
        /**
         * 收集录音时长是200毫秒
         */
        const val RECORD_DATA_TIME = 200

        /**
         * 静音值
         */
        const val MUTE_VOLUME = 18.0

        @Volatile
        private var instance: VadInterface? = null

        @JvmStatic
        fun getInstance(): VadInterface {
            if (instance == null) {
                synchronized(VadManager::class.java) {
                    if (instance == null) {
                        instance = VadManager()
                    }
                }
            }
            return instance!!
        }
    }

    override fun startVad(config: Config?) {
        mConfig = config
        mConfig?.let {
            if (it.vadEnable) {
                if (it.vadBos > 0) {
                    mBeginMuteMaxCount = it.vadBos / RECORD_DATA_TIME
                }
                if (it.vadEos > 0) {
                    mEndMuteMaxCount = it.vadEos / RECORD_DATA_TIME
                }
            }
        }

    }

    override fun canStopRecord(volume: Double): Boolean {
        L.i("volume", volume.toString())
        mCount++
        mConfig?.let {
            if (!it.vadEnable) {
                return false
            }
            if (mCount <= mBeginMuteMaxCount) {
                //前端点连续静音计数
                if (volume <= MUTE_VOLUME) {
                    mBeginMuteCount++
                } else {
                    mBeginMuteCount = 0
                }
            } else if (mCount == mBeginMuteMaxCount + 1) {
                //判断是否达到前端点最大静音次数
                if (mBeginMuteCount >= mBeginMuteMaxCount) {
                    closeVad()
                    return true
                }
            } else {
                //后端点连续静音计数
                if (volume <= MUTE_VOLUME) {
                    mEndMuteCount++
                } else {
                    mEndMuteCount = 0
                }
                //如果达到静音最大次数停止录音
                if (mEndMuteCount >= mEndMuteMaxCount) {
                    closeVad()
                    return true
                }
            }
            return false
        }
        return false
    }

    private fun closeVad() {
        mConfig = null
        mCount = 0
        mBeginMuteCount = 0
        mBeginMuteMaxCount = 9
        mEndMuteCount = 0
        mEndMuteMaxCount = 9
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
鼠标右击我的电脑,依次选择 属性 硬件 设备管理器 在设备管理器中可以查看是否有黄色的 感叹号或是问号,如果有就是硬件驱动问题,当然硬件问题也能看到。 知道了,我在知识库里查查你的情况……请稍等 请您先回答一个问题,谢谢: 设备管理器中有没有声卡设备,如果没有,请检查BIOS 中声卡是否被禁用,或恢复BIOS默认设置,不同主板BIOS会有不同。不做详细说明。 给你个诊断思路吧: 1、首先检查音箱或耳机是否正确连接到主机的音频输出接口,如接音箱要检查是否通电,将音箱音量调整到最大。 1)检查音箱或耳机设备是否正常(电源是否打开、音量是否过小、电源线是否可靠地插在市电插座中、市电插座是否有电),也可将音箱或耳机接在其它正常使用的声音设备(如MP3、其它主机等)。若不正常,怀疑硬件故障,部件:音箱或耳机。 2)察看音箱或耳机是否正确地插入主机声卡的相应插孔中。 3)是否将音箱和耳机同时使用了,如果是,拔除一个 。 2、请检查操作系统中的声音是否被静音,或音量调节得过小 附加:如果连以上方案也不能解决的话,我个人建议您先提前做好C盘的备份(包括桌面上和我的文档 里的资料),然后重新安装系统到C盘,这样一来问题解决的几率就更大了。还不行就是您系统盘的问题了呀。 看您的情况比较复杂,希望能在线和您聊聊,或是发消息到我的百度邮箱。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网小熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值