iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android实现录音静音降噪
  • 418
分享到

Android实现录音静音降噪

Android录音静音降噪Android静音降噪Android录音降噪 2022-11-13 14:11:28 418人浏览 安东尼
摘要

本文实例为大家分享了Android实现录音静音降噪的具体代码,供大家参考,具体内容如下 需求: 客户反馈产品的录音里面很多杂音(因为我们把Codec的录音增益调至最大,且电路上没有专

本文实例为大家分享了Android实现录音静音降噪的具体代码,供大家参考,具体内容如下

需求:

客户反馈产品的录音里面很多杂音(因为我们把Codec的录音增益调至最大,且电路上没有专用的音频处理芯片、CPU直接接MIC(有包地))。在外壳、硬件不能修改的情况下,软件得想想办法尝试解决问题。

首先想到的是双麦降噪,原理大概是:一个主麦克风用来做通话,另一个收集环境噪音,对音频波形分析和相位操作,叠加到主麦克风的采样波形上,形成相位抵消,就降噪了。缺点是,两个麦克风不能距离太近,并且两个麦克风距离说话人的距离不能太远,太远了角度就很小了,根本无法分辨出来,另外,根据产品使用情况,上下麦克风各自都有几率称为主麦克风。所以实验测试出来的结果并没有很好。

考虑到录音噪音在有“人声”的时候是分辨不出来的、或者说影响很小,而在静音时有明显的环境噪声,因此想使用静音降噪的方法来规避问题。

本文只是简单的静音降噪,原理如下:考虑到启动录音时,要等待一段时间(比如0.5s)才会有人声,可根据这0.5s时间来预测噪声的大小(阈值),然后以此为基础来检测“人声”的起始点。在人声到来前,把所有音频数据设置为0,也就是做静音处理,所以这里叫静音降噪。而人声到来时,返回实际的音频数据(包括里面的噪声数据)。计算阈值的方法只是简单的求和平均。

下面代码在RK平台上hardware/alsa_sound/AudiOStreamInALSA.cpp实现。

#define MUTE_NOISE_REDUCTioN
#ifdef MUTE_NOISE_REDUCTION
bool enable_reduction_noise = false;    //由属性sys.is.audiorecord.only控制

int threshold_def = 0x400;    //默认阈值
int threshold = 0;    //自适应噪声阈值
int threshold_count = 0;    //计数,超过THRESHOLD_COUNT则使用threshold来检测“人声”
#define THRESHOLD_COUNT 10

#define MUTE_DELAY_COUNT 15        //播放人声后保留的音频帧数、不静音

#define AUDIO_BUFFER_NUM 4        //缓存音频数据的帧数
#define AUDIO_BUFFER_SIZE 1024    //一帧的音频数据大小
char *audio_buffer[AUDIO_BUFFER_NUM];    //audio_buffer用于缓存音频数据
char *audio_buffer_temp;    //用于交互音频数据
int audio_buffer_pos=0;
#endif

#ifdef MUTE_NOISE_REDUCTION
    {
        unsigned int value = 0;
        int is_voice = 0;
        static int is_mute_delay_count;
        //ALOGE("in_begin_swip_num:%d in_begin_narrow_num=%d",in_begin_swip_num,in_begin_narrow_num);        

         if(enable_reduction_noise && bytes > AUDIO_BUFFER_SIZE){
            bytes = AUDIO_BUFFER_SIZE;
        }

        if(enable_reduction_noise){
            unsigned char * buffer_temp=(unsigned char *)buffer;
            unsigned int total = 0;
            unsigned int total_count=0;
            unsigned int total_temp = 0;
            short data16;
            int j = 0;
            for(j=0; j<bytes; j=j+2){
                value = buffer_temp[j+1];    //第二个字节为高位数据
                value = (value<<8)+buffer_temp[j];    //获得一个16bit的音频数据
                data16 = value&0xFFFF;
                if( (data16 & 0x8000) == 0){//正数
                    total +=data16;        //思考:会不会溢出
                    total_count++;        //计数
                }
            }

            total_temp = total/total_count;
            if(total_temp > threshold_def){
                is_voice++;        //检测到人声
            }else {    //is noise
                if(threshold_count == 0){
                    threshold = total_temp;
                }else{
                    threshold = (threshold+total_temp)/2;
                }
                threshold_count++;
                if(threshold_count >= THRESHOLD_COUNT){
                    threshold_def = threshold*2;    //更新阈值,这里的2要对产品实验来确定。
                    threshold_count = THRESHOLD_COUNT;    //此后一直用新阈值,直到停止录音
                }
            }

            //is_mute_delay_count的意义是,如果前面播放了人声,那再停止说话之后继续保留MUTE_DELAY_COUNT的音频数据,这样不会“戛然而止”。
            if( is_voice != 0 ){
                is_mute_delay_count=MUTE_DELAY_COUNT;
            }else{
                if(is_mute_delay_count != 0)
                    is_mute_delay_count--;
            }

            //audio_buffer的意义:检测到人声,要返回说话前的一小段音频数据,否则声音从静音到人声有个POP声的跳跃。
            //这里用audio_buffer来缓存AUDIO_BUFFER_NUM帧数据。
            if(is_mute_delay_count == 0){//Mute in order to remove noise
                memcpy(audio_buffer[audio_buffer_pos], (char *)buffer, bytes);    //缓存音频
                memset(buffer, 0, bytes);    //返回静音数据
            }else {
                memcpy(audio_buffer_temp, (char *)buffer, bytes);
                memcpy((char *)buffer, audio_buffer[audio_buffer_pos], bytes);    //返回旧的音频数据
                memcpy(audio_buffer[audio_buffer_pos], (char *)audio_buffer_temp, bytes);     //保存新的音频数据
            }
            audio_buffer_pos++;
            if(audio_buffer_pos>=AUDIO_BUFFER_NUM)
                audio_buffer_pos=0;
        }
    }
#endif

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Android实现录音静音降噪

本文链接: https://www.lsjlt.com/news/172217.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android实现录音静音降噪
    本文实例为大家分享了Android实现录音静音降噪的具体代码,供大家参考,具体内容如下 需求: 客户反馈产品的录音里面很多杂音(因为我们把Codec的录音增益调至最大,且电路上没有专...
    99+
    2022-11-13
    Android录音静音降噪 Android静音降噪 Android录音降噪
  • Golang与FFmpeg: 如何实现音频降噪和音量调节
    要实现音频降噪和音量调节,可以通过调用FFmpeg库来处理音频文件。在Golang中,可以使用CGO来调用C语言的FFmpeg库。首...
    99+
    2023-10-08
    Golang
  • Ubuntu怎么开启隐藏录音降噪功能
    这篇“Ubuntu怎么开启隐藏录音降噪功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Ubuntu怎么开启隐藏录音降噪功能...
    99+
    2023-07-04
  • 利用Golang和FFmpeg实现音频降噪的技巧
    要利用Golang和FFmpeg实现音频降噪,可以按照以下步骤进行:1. 安装Golang和FFmpeg:首先,确保已经在计算机上安...
    99+
    2023-10-08
    Golang
  • Android实现测试环境噪音分贝
    本文实例为大家分享了Android实现测试环境噪音分贝的具体代码,供大家参考,具体内容如下 前言: 最近做工具类项目,手机上小工具各种,有一个测量环境噪音分贝值的,个人对机车码表式显...
    99+
    2024-04-02
  • Golang与FFmpeg: 如何实现音频降噪和增益
    要在Golang中实现音频降噪和增益,您可以使用FFmpeg库来处理音频文件。首先,您需要安装FFmpeg并确保它在您的系统上可用。...
    99+
    2023-10-10
    Golang
  • Android实现音频录音与播放
    目录一、PCM 、WAV、AAC 的文件头介绍二、使用 AudioRecord 实现录音生成 PCM 文件三、PCM 转化为 WAV四、PCM 转化为 AAC 文件格式五、Audio...
    99+
    2022-11-13
    Android音频录音 Android音频播放 Android录音播放
  • python如何对音频进行降噪
    要对音频进行降噪,可以使用Python的librosa库。下面是一个简单的示例代码: import librosa import n...
    99+
    2023-10-27
    python
  • 电脑降低风扇噪音方法
    1. 清洁风扇:使用喷气罐或者细刷将风扇上的灰尘和污垢清除干净,这可以减少风扇的摩擦和噪音。2. 更换风扇:如果风扇已经老化或者损坏...
    99+
    2023-09-05
    电脑
  • Android实现静音检测功能
    本文实例为大家分享了Android实现静音检测的具体代码,供大家参考,具体内容如下 一、背景 做语音评测的时候需要在用户不说话的时候自动停止,这时候就需要判断什么时候不说话处于静音的...
    99+
    2024-04-02
  • Golang与FFmpeg: 如何实现音频格式转换和降噪
    要实现音频格式转换和降噪,可以使用Golang与FFmpeg结合的方式。首先,确保已经安装了FFmpeg并且将其添加到系统的环境变量...
    99+
    2023-10-20
    Golang
  • 电脑风扇的噪音怎么降低
    这篇“电脑风扇的噪音怎么降低”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“电脑风扇的噪音怎么降低”文章吧。笔记本风扇声音时大...
    99+
    2023-06-28
  • Android实现录音声波图
    本文实例为大家分享了Android实现录音声波图的具体代码,供大家参考,具体内容如下 图像类: package com.akm.test; import android.cont...
    99+
    2022-11-13
    Android录音声波图 Android录音声波 Android声波图
  • 电脑风扇声音太大如何降噪
    降低电脑风扇噪音的方法有以下几种:1. 清洁风扇:风扇积灰会导致噪音增大,定期清洁风扇是降低噪音的有效方法。可以使用吹气罐或软刷子清...
    99+
    2023-09-06
    电脑
  • Android如何实现录音功能
    这篇文章给大家分享的是有关Android如何实现录音功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文介绍了Android实现录音的实例代码(MediaRecorder),分享给大家,具体如下:Android...
    99+
    2023-05-30
    android
  • Android实现定时自动静音小助手
    定时静音助手的实现方法,供大家参考,具体内容如下背景突发奇想,刚好这学期刚上安卓课程,想设计一个时间助手。工作、学习中经常会被突如其来的电话所打扰,在上班,上课时这突如其来的铃声会惹来别人的反感,而只靠人们的记性是很难在准确的时间记得静音。...
    99+
    2023-05-31
    android 定时 静音
  • Android利用MediaRecorder实现录音功能
    本文实例为大家分享了Android利用MediaRecorder实现录音功能 的具体代码,供大家参考,具体内容如下 android用手机录音保存到sd卡中; 布局文件: &...
    99+
    2024-04-02
  • Android使用Flutter实现录音插件
    目录安卓部分手动注册Android和Dart的通讯安卓录音Dart module部分iOS部分手动注册插件iOS插件Dart调用部分原生提供功能,Dart module 通过 met...
    99+
    2022-11-13
    Android Flutter录音 Android 录音功能
  • Android使用AudioRecord实现录音功能
    前言 Android使用AudioRecord实现录音 提示:以下是本篇文章正文内容,下面案例可供参考 一、AudioRecord使用 Android平台可以使用AudioRecor...
    99+
    2022-11-13
    Android AudioRecord 录音
  • python实现图像降噪
    本文实例为大家分享了python实现图像降噪的具体代码,供大家参考,具体内容如下 任务描述 背景 图像在数字化和传输等过程中会产生噪声,从而影响图像的质量,而图像降噪技术可以有效地减...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作