Android回音噪音处理Demo
来源:互联网 发布:2017淘宝电商品牌排行 编辑:程序博客网 时间:2024/05/05 22:42
这是一个开源项目,核心来自webrtc项目。
据网友测试:大多数手机上比较完美,没啥回声,但在小米上比较明显噪音。
将实现各个平台上能快速使用的音频处理库。
核心算法包括:
NS(Noise Suppression 噪声抑制)
VAD(Voice Activity Detection 静音检测)
AECM(Acoustic Echo Canceller for Mobile 声学回声消除)
AGC(Auto Gain Control 自动增益控制) 现在只有一个Android Demo 。
核心代码如下:
package net.iwebrtc.audioprocess.sdk;import android.util.Log;public class AudioProcess {private static final String TAG = "AudioProcess";static {String[] LIBS = new String[] { "audio_process" };for (int i = 0; i < LIBS.length; i++) {try {System.loadLibrary(LIBS[i]);} catch (UnsatisfiedLinkError e) {Log.e(TAG, "Couldn't load lib: " + LIBS[i] + " - " + e.getMessage());}}}private long nativeAudioProcess;public AudioProcess() {nativeAudioProcess = create();}private native long create();public native boolean init(int sample_rate, int number_bytes_per_sample, int channels);public int calculateBufferSize(int sample_rate, int number_bytes_per_sample, int channels) {return sample_rate * channels * number_bytes_per_sample / 100;}public native boolean processStream10msData(byte[] data, int length, byte[] out);public native boolean AnalyzeReverseStream10msData(byte[] data, int length);public native boolean destroy();}
地址:https://github.com/xiaomo/AudioProcess
演示Demo:http://download.csdn.net/detail/moming_2013/8209547
刚刚开始做,肯定还有不少bug,会不断完善。
音频处理模块(APM)使用翻译:
The Audio Processing Module (APM) provides a collection of voice processing components designed for real-time communications software.
音频处理模块(APM)提供了一个音频处理组件的集合,这些组件为实时通讯软件而设计。
APM operates on two audio streams on a frame-by-frame basis.
APM操作两个一帧接一帧的音频流。一个主流,一个逆向流。
Frames of the primary stream, on which all processing is applied, are passed to |ProcessStream()|.
所有的处理都将被应用到主流的帧 ,这些帧通过ProcessStream函数传递过去。
Frames of the reverse direction stream, which are used for analysis by some components, are passed to |AnalyzeReverseStream()|.
逆向流的帧被一些组件拿去分析,逆向流的帧通过AnalyzeReverseStream函数传递过去。
On the client-side, this will typically be the near-end (capture) and far-end (render) streams, respectively.
在客户端,这是典型的相互独立的近端流和远端流。
APM should be placed in the signal chain as close to the audio hardware abstraction layer (HAL) as possible.
APM在信号链中应该尽快能被放置在接近硬件抽象层的地方。
On the server-side, the reverse stream will normally not be used, with processing occurring on each incoming stream.
在服务端,逆向流通常不被使用。
Component interfaces follow a similar pattern and are accessed through corresponding getters in APM.
组件接口遵循类似的模式设计,通过APM中相应的getter函数访问。
All components are disabled at create-time, with default settings that are recommended for most situations.
所有的组件在创建时都是不可用的,在大多数情况下,推荐这种默认的设置。
New settings can be applied without enabling a component.
使一个组件可用,新的设置将会被应用到APM。
Enabling a component triggers memory allocation and initialization to allow it to start processing the streams.
使一个组件可用会触发内存分配和初始化,以允许这个组件开始处理音频流。
Thread safety is provided with the following assumptions to reduce locking overhead:
基于下面的假设,提供了线程安全,用以减少锁的开销:
1. The stream getters and setters are called from the same thread as ProcessStream(). More precisely, stream functions are never called concurrently with ProcessStream().
在ProcessStream的时候,流的getter和setters方法应该在同一个线程被调用。更确切的说,流的方法绝对不能在ProcessStream的同时被调用。
2. Parameter getters are never called concurrently with the corresponding setter.
参数的getter和setter绝不能同时条用。
APM accepts only 16-bit linear PCM audio data in frames of 10 ms. Multiple channels should be interleaved.
APM只接受10 ms帧的16位线性PCM音频数据。多声道应该是交错。
Usage example, omitting error checking:
使用示例,省略了错误检查:
AudioProcessing* apm = AudioProcessing::Create(0);
1 创建一个APM
apm->set_sample_rate_hz(32000); // Super-wideband processing.
2 设置采样率
// Mono capture and stereo render.
录音单声道,播放多声道。
apm->set_num_channels(1, 1);
3 设置主流处理的输入和输出声道数
apm->set_num_reverse_channels(2);
4 设置逆向流的声道数
apm->high_pass_filter()->Enable(true);
5 让快速通过过滤组件可用
apm->echo_cancellation()->enable_drift_compensation(false);
apm->echo_cancellation()->Enable(true);
6 设置ACE组件
apm->noise_reduction()->set_level(kHighSuppression);
apm->noise_reduction()->Enable(true);
7 设置噪音消除组件
apm->gain_control()->set_analog_level_limits(0, 255);
apm->gain_control()->set_mode(kAdaptiveAnalog);
apm->gain_control()->Enable(true);
8 设置自动增益组件
apm->voice_detection()->Enable(true);
9 设置静音检测组件
// Start a voice call...
// ... Render frame arrives bound for the audio HAL ...
apm->AnalyzeReverseStream(render_frame);
10 开始语音通话,让设备播放收到了的帧,把帧通过逆向流传给APM
// ... Capture frame arrives from the audio HAL ...
// Call required set_stream_ functions.
apm->set_stream_delay_ms(delay_ms);
apm->gain_control()->set_stream_analog_level(analog_level);
apm->ProcessStream(capture_frame);
11 从设备采集帧,然后必须调用设置流的方法set_stream_delay_ms和set_stream_analog_level,然后处理采集的帧。
// Call required stream_ functions.
analog_level = apm->gain_control()->stream_analog_level();
has_voice = apm->stream_has_voice();
12 然后调动流的方法stream_analog_level和stream_has_voice是有必要的
// Repeate render and capture processing for the duration of the call...
// Start a new call...
apm->Initialize();
13 开始一个新的会话,然后调用Initialize。
// Close the application...
delete apm;
14 结束app,删除amp
音频处理模块(APM)提供了一个音频处理组件的集合,这些组件为实时通讯软件而设计。
APM operates on two audio streams on a frame-by-frame basis.
APM操作两个一帧接一帧的音频流。一个主流,一个逆向流。
Frames of the primary stream, on which all processing is applied, are passed to |ProcessStream()|.
所有的处理都将被应用到主流的帧 ,这些帧通过ProcessStream函数传递过去。
Frames of the reverse direction stream, which are used for analysis by some components, are passed to |AnalyzeReverseStream()|.
逆向流的帧被一些组件拿去分析,逆向流的帧通过AnalyzeReverseStream函数传递过去。
On the client-side, this will typically be the near-end (capture) and far-end (render) streams, respectively.
在客户端,这是典型的相互独立的近端流和远端流。
APM should be placed in the signal chain as close to the audio hardware abstraction layer (HAL) as possible.
APM在信号链中应该尽快能被放置在接近硬件抽象层的地方。
On the server-side, the reverse stream will normally not be used, with processing occurring on each incoming stream.
在服务端,逆向流通常不被使用。
Component interfaces follow a similar pattern and are accessed through corresponding getters in APM.
组件接口遵循类似的模式设计,通过APM中相应的getter函数访问。
All components are disabled at create-time, with default settings that are recommended for most situations.
所有的组件在创建时都是不可用的,在大多数情况下,推荐这种默认的设置。
New settings can be applied without enabling a component.
使一个组件可用,新的设置将会被应用到APM。
Enabling a component triggers memory allocation and initialization to allow it to start processing the streams.
使一个组件可用会触发内存分配和初始化,以允许这个组件开始处理音频流。
Thread safety is provided with the following assumptions to reduce locking overhead:
基于下面的假设,提供了线程安全,用以减少锁的开销:
1. The stream getters and setters are called from the same thread as ProcessStream(). More precisely, stream functions are never called concurrently with ProcessStream().
在ProcessStream的时候,流的getter和setters方法应该在同一个线程被调用。更确切的说,流的方法绝对不能在ProcessStream的同时被调用。
2. Parameter getters are never called concurrently with the corresponding setter.
参数的getter和setter绝不能同时条用。
APM accepts only 16-bit linear PCM audio data in frames of 10 ms. Multiple channels should be interleaved.
APM只接受10 ms帧的16位线性PCM音频数据。多声道应该是交错。
Usage example, omitting error checking:
使用示例,省略了错误检查:
AudioProcessing* apm = AudioProcessing::Create(0);
1 创建一个APM
apm->set_sample_rate_hz(32000); // Super-wideband processing.
2 设置采样率
// Mono capture and stereo render.
录音单声道,播放多声道。
apm->set_num_channels(1, 1);
3 设置主流处理的输入和输出声道数
apm->set_num_reverse_channels(2);
4 设置逆向流的声道数
apm->high_pass_filter()->Enable(true);
5 让快速通过过滤组件可用
apm->echo_cancellation()->enable_drift_compensation(false);
apm->echo_cancellation()->Enable(true);
6 设置ACE组件
apm->noise_reduction()->set_level(kHighSuppression);
apm->noise_reduction()->Enable(true);
7 设置噪音消除组件
apm->gain_control()->set_analog_level_limits(0, 255);
apm->gain_control()->set_mode(kAdaptiveAnalog);
apm->gain_control()->Enable(true);
8 设置自动增益组件
apm->voice_detection()->Enable(true);
9 设置静音检测组件
// Start a voice call...
// ... Render frame arrives bound for the audio HAL ...
apm->AnalyzeReverseStream(render_frame);
10 开始语音通话,让设备播放收到了的帧,把帧通过逆向流传给APM
// ... Capture frame arrives from the audio HAL ...
// Call required set_stream_ functions.
apm->set_stream_delay_ms(delay_ms);
apm->gain_control()->set_stream_analog_level(analog_level);
apm->ProcessStream(capture_frame);
11 从设备采集帧,然后必须调用设置流的方法set_stream_delay_ms和set_stream_analog_level,然后处理采集的帧。
// Call required stream_ functions.
analog_level = apm->gain_control()->stream_analog_level();
has_voice = apm->stream_has_voice();
12 然后调动流的方法stream_analog_level和stream_has_voice是有必要的
// Repeate render and capture processing for the duration of the call...
// Start a new call...
apm->Initialize();
13 开始一个新的会话,然后调用Initialize。
// Close the application...
delete apm;
14 结束app,删除amp
0 0
- Android回音噪音处理Demo
- Android 平台语音通话及回音消除、噪音消除研究
- 回音消除、噪音抑制的原理
- Android噪音检测系统
- Android 测试环境噪音分贝
- 报告论文:数字图像噪音处理研究
- android Loopback回路测试有啸叫,回音
- Android上用speex做回音消除
- Android上用speex做回音消除
- Android上用speex做回音消除
- 回音消除原理解析及Android应用
- 论android等平台回音消除解决方案
- Android 使用AudioRecord 录音只有噪音
- android AudioRecord 音频录制 噪音消除
- Android PCM 播放全是噪音滋滋滋
- 一个简单的Android图片处理Demo
- Android demo-->界面无操作超时处理
- Speex 回音消除 在android 平台上 初见成效
- 程序员将面临再次洗牌,你作何选择?
- 第14周项目 5-体会棋盘游戏中的数据存储
- nfs:server is not responding,still trying原因与解决方案
- Linux线程局部存储
- JournalDev 博客的 Java 教程集合(JournalDev Java Tutorials Collections)
- Android回音噪音处理Demo
- this指针以及类的数组
- 播布客教学视频_C学习笔记_9.1_整形转字符串
- SharePoint Debug - This file is not a valid presentation file or contains multiple slides...
- K.Bro Sorting(杭电5122)(2014ACM/ICPC亚洲区北京站)
- 播布客教学视频_C学习笔记_9.2_整形转字符串(函数实现)
- 播布客教学视频_C学习笔记_10.1_约瑟夫环问题
- struts的相关概念
- 解决问题必搜站汇总