Android实现静音检测功能

本文实例为大家分享了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)

相关推荐

  • Android EasyPlayer声音自动停止、恢复,一键静音等功能

    Android EasyPlayer声音自动停止.恢复,一键静音等功能 我们在开发播放器时,可能会需要静音或者降低音量的功能.比如说某款音乐播放器,当在后台播放时,如果此时有另外的系统通知声音发出,可能播放器会把音量降低,系统声音结束后,再调高:如果有来电了,播放器可能会把音乐暂停,等通话结束后再继续播放.还有,比方说我们在某个场合放个视频,不料音量很大,会引来很多目光(很尴尬),这时候可能我们需要一键静音的功能.那这些功能我们应该如何实现呢? Android播放声音的类为AudioTrack,

  • Android实现定时自动静音小助手

    定时静音助手的实现方法,供大家参考,具体内容如下 背景 突发奇想,刚好这学期刚上安卓课程,想设计一个时间助手.工作.学习中经常会被突如其来的电话所打扰,在上班,上课时这突如其来的铃声会惹来别人的反感,而只靠人们的记性是很难在准确的时间记得静音.如果一直静音,那么在休息时间又有可能漏接重要的电话.基于这种考虑,设计了这样一自动静音小助手,来帮助人们在忙碌的生活中定时静音,定时开启正常模式,简单方便. 界面设计 <?xml version="1.0" encoding="u

  • Android实现静音检测功能

    本文实例为大家分享了Android实现静音检测的具体代码,供大家参考,具体内容如下 一.背景 做语音评测的时候需要在用户不说话的时候自动停止,这时候就需要判断什么时候不说话处于静音的状态. 二.原理 每次录音的时候可以根据录音的数据计算出音强,设定一个音强值为上限,当音强超过这个值的时候判断为非静音当小于这个值的时候判断为静音,当静音次数连续达到一定的次数的时候就停止录音. 三.代码实现 1.计算音强 /**   * 计算音量   *   * @param buffer 录音数据   * @re

  • Android 中使用 dlib+opencv 实现动态人脸检测功能

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用矩形框描绘出来.具体实现原理如下: 采用双层 View,底层的 TextureView 用于预览,程序从 TextureView 中获取预览帧数据,然后调用 dlib 库对帧数据进行处理,最后将检测结果绘制在顶层的 SurfaceView 中. 2 项目配置 由于项目中用到了 dlib 与 open

  • Android应用自动更新功能实现的方法

    本文给大家分享Android里应用版本更新功能这一块的实现. 一个好的应用软件都是需要好的维护,从初出版本到最后精品,这个过程需要版本不停的更新,那么如何让用户第一时间获取最新的应用安装包呢?那么就要求我们从第一个版本就要实现升级模块这一功能. 自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语:最新版本的url等).然后我们给出提示框,用户点击开始下载,下载完成开始覆盖安装程序,这样用户的应

  • Android程序自动更新功能模块的实现方法【附完整demo源码下载】

    本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更新模块检测服务器上存放的版本号跟当前程序的版本号如果大于当前版本号,弹出更新对话框,如果用户选择更新,则显示当前更新状态,然后替换当前程序. 程序调用版本更新检测: private UpdateManager updateMan; private ProgressDialog updateProgr

  • Android Studio常用快捷键功能说明

    Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似 EcliPSe ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试,基于Gradle的构建支持. Android Studio常用快捷键 Ctrl+D: 集合了复制和粘贴两个操作,如果有选中的部分就复制选中的部分,并在选中部分的后面 粘贴出来,如果没有选中的部分,就复制光标所在的行,并在此行的下面粘贴出来. Ctrl+空格: 输入代码时按此组合键会列出与之相匹配

  • Android动态人脸检测的示例代码(脸数可调)

    人脸检测 这里的人脸检测并非人脸识别,但是却可以识别出是否有人,当有人时候,你可以将帧图进行人脸识别(这里推荐Face++的sdk),当然我写的demo中没有加入人脸识别,有兴趣的朋友可以追加.face++ android自带的人脸检测 这里我们用到了人脸检测类为 FaceDetector.这个类提供了强大的人脸检测功能,可以方便我们进行人脸的侦测,因此我们使用他来进行动态的人脸检测,实现原理,其实也挺简单,主要是通过Carmen的回调PreviewCallback 在其中对帧图进行操作,并通过

  • Android 实现悬浮窗功能

    前言 我们大多数在两种情况下可以看到悬浮窗,一个是视频通话时的悬浮窗,另一个是360卫士的悬浮球,实现此功能的方式比较多,这里以视频通话悬浮窗中的需求为例.编码实现使用Kotlin.Java版本留言邮箱即可. 业务场景 以微信视频通话为例,在视频通话时,我们打开其他应用或点击Home键退出时或点击缩放图标,悬浮窗会显示在其他应用之上,给人的假象是通话页面变小了,点击悬浮窗回到通过页面,悬浮窗消失.退出通话页面悬浮窗消失. 业务场景技术分析 在编码之前,我们必须将流程整理好,这样更有利于编码的实现

  • 浅谈Android Studio3.6 更新功能

    前言 下载google CodeLab的程序时,提示要更新3.6版本才能运行程序,于是更新了一下,看看有什么新功能. 界面设计工具 这次更新了一些设计工具,比如Layout Editor 和 Resource Manager. 现在,在XML或设计工具的颜色选择器中,Android Studio会在您的应用程序中填充颜色资源,以便您快速选择和替换颜色资源值. 拆分视图并放大设计编辑器 设计编辑器(例如,布局编辑器和导航编辑器)现在提供一个拆分视图,使您可以同时查看UI的"设计"视图和&

  • Android中实现ping功能的多种方法详解

    使用java来实现ping功能. 并写入文件.为了使用java来实现ping的功能,有人推荐使用java的 Runtime.exec()方法来直接调用系统的Ping命令,也有人完成了纯Java实现Ping的程序,使用的是Java的NIO包(native io, 高效IO包).但是设备检测只是想测试一个远程主机是否可用.所以,可以使用以下三种方式来实现: 1. Jdk1.5的InetAddresss方式 自从Java 1.5,java.net包中就实现了ICMP ping的功能. 使用时应注意,如

随机推荐