首页 / 专利库 / 资料储存系统 / 数字音频文件 / 音轨 / 一种基于Android去除语音聊天中杂音的实现方法

一种基于Android去除语音聊天中杂音的实现方法

阅读:631发布:2020-05-08

专利汇可以提供一种基于Android去除语音聊天中杂音的实现方法专利检索,专利查询,专利分析的服务。并且本 发明 涉及Android技术领域,特别涉及一种去除语音 聊天 中杂音的实现方法:一、接收对方发来语音;二、对音频数据进行采集;三、将获取到的音频数据流进行解码;四、进行回声消除处理;五、进行噪声消除处理;六、播放语音。本发明解决了语音聊天中接收到的声音含有杂音听不清的问题。,下面是一种基于Android去除语音聊天中杂音的实现方法专利的具体信息内容。

1.一种基于Android去除语音聊天中杂音的实现方法,其特征在于:一、接收对方发来语音;二、对音频数据进行采集;三、将获取到的音频数据流进行解码;四、进行回声消除处理;五、进行噪声消除处理;六、播放语音;从而本发明解决了语音聊天中接收到的声音含有杂音听不清的问题。
2.根据权利要求1所述的基于Android平台的一种去除语音聊天中杂音的实现方法,其特征在于:削除回声与噪声主要是依据SpeechX技术并在其基础上增添一定的算法实现;所述的方法具体包括如下步骤:
步骤一、接收对方发来语音;
步骤二、对音频数据进行采集,所述的采集主要是采用MediaRecorder进行音频捕获,相较于调用系统内置的应用程序,灵活度更高,便于在UI界面上布局,而且系统封装的很好,便于使用;
步骤三、将获取到的音频数据流进行解码,所述的解码技术:首先初始化解码器,分离视频文件的音轨和视频轨道,获得媒体文件的位置;然后启动MediaCodec,解码成PCM,获取到PCM数组,并存入PCM数据中;最后使用时从PCM数据块取出数据;
步骤四、进行回声消除处理,所述的回声消除方法:1、初始化回音消除参数;2、计算采样时长,即是10毫秒,还是20毫秒,还是30毫秒;3、调用SpeechX的AudioAECProc函数执行回音消除;4、消除完毕后退出;
步骤五、进行噪声消除处理,所述的噪声消除方法:1、初始化降噪参数;2、使用speechx_preprocess_ctl函数进行8K与16K降噪;3、释放降噪;
步骤六、最后播放语音,播放时采用AudioTrack接口,与MediaCodec对应。

说明书全文

一种基于Android去除语音聊天中杂音的实现方法

技术领域

[0001] 本发明涉及Android技术领域,特别涉及一种基于Android去除语音聊天中杂音的实现方法。

背景技术

[0002] 随着智能手机的出现与普及,Android平台以其优越的性能、美观的界面,受到越来越多的消费者的青睐,从其平台上衍生出了大量有趣实用的APP,特别如微信这类的社交软件,人们在上面除了可以和朋友、家人进行短信交流甚至还可以语音对话以及语音聊天,其逐渐替代了以往的电话交流方式,成了人们生活中不可或缺的一部分。
[0003] 语音对话与语音聊天在不同的环境下会有不同的效果,在完全密封或半封闭的环境下就会产生回声,而在人多吵杂的地方又会出现噪声,导致接收方无法听清楚。
[0004] 本发明基于SpeechX技术的基础上,通过一定的算法,基本解决了此类问题。

发明内容

[0005] 本发明解决的技术问题在于提供一种基于Android去除语音聊天中杂音的实现方法;本发明解决了语音聊天中接收到的声音含有杂音听不清的问题。
[0006] 本发明解决上述技术问题的技术方案是:一、接收对方发来语音;二、对音频数据进行采集;三、将获取到的音频数据流进行解码;四、进行回声消除处理;五、进行噪声消除处理;六、播放语音。
[0007] 所述的方法具体包括如下步骤:步骤一、接收对方发来语音;
步骤二、对音频数据进行采集,所述的采集主要是采用MediaRecorder进行音频捕获,相较于调用系统内置的应用程序,灵活度更高,便于在UI界面上布局,而且系统封装的很好,便于使用;
步骤三、将获取到的音频数据流进行解码,所述的解码技术:首先初始化解码器,分离视频文件的音轨和视频轨道,获得媒体文件的位置;然后启动MediaCodec,解码成PCM,获取到PCM数组,并存入PCM数据中;最后使用时从PCM数据块取出数据;
步骤四、进行回声消除处理,所述的回声消除方法:1、初始化回音消除参数;2、计算采样时长,即是10毫秒,还是20毫秒,还是30毫秒;3、调用SpeechX的AudioAECProc函数执行回音消除;4、消除完毕后退出;
步骤五、进行噪声消除处理,所述的噪声消除方法:1、初始化降噪参数;2、使用speechx_preprocess_ctl函数进行8K与16K降噪;3、释放降噪;
步骤六、最后播放语音,播放时采用AudioTrack接口,与MediaCodec对应。
[0008] 本发明的有益效果:对接收到的语音进行回声与降噪处理,实现了语音聊天无关环境的目的。有效地解决了语音聊天中接收到的声音含有杂音听不清的问题。附图说明
[0009] 下面结合附图对本发明进一步说明:图1为本发明的流程图

具体实施方式

[0010] 如图1所示,本发明采用如下步骤:步骤一、接收对方发来语音;
步骤二、对音频数据进行采集,所述的采集主要是采用MediaRecorder进行音频捕获,相较于调用系统内置的应用程序,灵活度更高,便于在UI界面上布局,而且系统封装的很好,便于使用;如:
public void initSoundRecord (int audioSource, int
  sampleRateInHz,  int  channelConfig,  int audioFormat,  int 
bufferSizeInBytes) {
static final int frequency = 8000;
static final int  channelConfiguration  = AudioFormat.CHANNEL_
CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
int recBufSize,playBufSize;
AudioRecord audioRecord;
recBufSize = AudioRecord.getMinBufferSize(frequency,
            channelConfiguration, audioEncoding);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency,AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, recBufSize);
}
三、将获取到的音频数据流进行AAC编码,采用AAC编码可以实现高压缩比,比一般的好很多,而且音频不失真;如:
jint Java_InitAudioEncodec( JNIEnv* env, jobject thiz,jint sampling_rate,jint audioLevel) {
 if(encodeFlag == 1 || audioLevel < 3 || audioLevel > 8 ) return 0 ;
int frame_size;
if(sampling_rate == 8000){
audio_Leval = 0;
 capAudioLength = 160;
 capAudioBitrate = 8000 ;
}else if(sampling_rate == 16000){
 audio_Leval = 1 ;
 capAudioLength = 320 ;
 capAudioBitrate = 16000;
}else if(sampling_rate == 32000){
 audio_Leval = 2 ;
 capAudioLength = 640 ;
 capAudioBitrate = 32000 ;
 }else
 return 0 ;
}
tmp_Level = audioLevel ; //设置等级 15kbit/s
speex_mode = speex_lib_get_mode(audio_Leval) ;
enc_state = speex_encoder_init(speex_mode);
speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&tmp_Level);
 return 1 ;
}
四、进行回声消除处理,所述的回声消除方法:1、初始化回音消除参数;2、计算采样时长,即是10毫秒,还是20毫秒,还是30毫秒;3、调用SpeechX的AudioAECProc函数执行回音消除;4、消除完毕后退出;如:
int Java_InitAudioAEC( JNIEnv* env,jobject thiz,jint frame_size,jint filter_length,jint sampling_rate){
if(nInitSuccessFlag == 1) return 1 ;
 nFrameSize = frame_size;
 nFilterLen = filter_length;
 nSampleRate = sampling_rate;
//计算采样时长,即是10毫秒,还是20毫秒,还是30毫秒
nTimeLong = (frame_size / (sampling_rate / 100)) * 10 ;
m_pState = speex_echo_state_init(nFrameSize, nFilterLen);
if(m_pState == NULL)
return -1 ;
m_pPreprocessorState = speex_preprocess_state_init(nFrameSize, nSampleRate);
if(m_pPreprocessorState == NULL) return -2 ;
iArg = nSampleRate;
speex_echo_ctl(m_pState, SPEEX_SET_SAMPLING_RATE, &iArg);
speex_preprocess_ctl(m_pPreprocessorState, SPEEX_PREPROCESS_SET_ECHO_STATE, m_pState);
 nInitSuccessFlag = 1 ;
 return 1 ;
}
jint Java_AudioAECProc(JNIEnv* env,jobject thiz,
jbyteArray recordArray,jbyteArray playArray,jbyteArray szOutArray ){if(nInitSuccessFlag == 0)return 0 ;
 jbyte* recordBuffer = (jbyte *)(*env)->GetByteArrayElements(env,recordArray, 0);
 jbyte* playBuffer = (jbyte *)(*env)->GetByteArrayElements(env,playArray, 
0);
 jbyte* szOutBuffer =  (jbyte *)(*env)->GetByteArrayElements(env,szOutArray, 0);
 return 1 ;
}
//退出
jint Java_ExitSpeexDsp( JNIEnv* env,jobject thiz){
if(nInitSuccessFlag == 0) return 0 ;
if (m_pState != NULL) {
speex_echo_state_destroy(m_pState);
m_pState = NULL;
}
if (m_pPreprocessorState != NULL) {
speex_preprocess_state_destroy(m_pPreprocessorState);
m_pPreprocessorState = NULL;
}
 nInitSuccessFlag = 0 ;
 return 1 ;
}
五、进行噪声消除处理,所述的噪声消除方法:1、初始化降噪参数;2、使用speechx_preprocess_ctl函数进行8K与16K降噪;3、释放降噪;如:
Java_InitAudioDeNose( JNIEnv* env, jobject thiz){
 int denoise_enabled = 1 ;
if(nInitDeNoseFlag == 1) return 0 ;
 nInitDeNoseFlag = 1 ;
 //8K降噪
audio8K = speex_preprocess_state_init(80 * (nSampleTimeLong / 10),8000);
speechx_preprocess_ctl(audio8K, SPEEX_PREPROCESS_SET_DENOISE, &denoise_enabled);
//16K降噪
audio16K = speex_preprocess_state_init(160 * (nSampleTimeLong / 10),
16000);
speechx_preprocess_ctl(audio16K, SPEEX_PREPROCESS_SET_DENOISE, &denoise_enabled);
 return 1 ;
}
//8K降噪
jint Java_AudioDeNose8K(JNIEnv* env,jobject thiz,jbyteArray recordArray){if(nInitDeNoseFlag == 0)
return 0 ;
 jbyte* recordBuffer = (jbyte *)(*env)->GetByteArrayElements(env,recordArray, 0);
 return 1 ;
}
//16K降噪
jint Java_AudioDeNose16K(JNIEnv* env,jobject thiz,jbyteArray recordArray){
if(nInitDeNoseFlag == 0)
return 0 ;
 jbyte* recordBuffer = (jbyte *)(*env)->GetByteArrayElements(env,recordArray, 0);
 return 1 ;
}
// 释放降噪
jint Java_ExitAudioDeNose( JNIEnv* env,jobject thiz){
if(nInitDeNoseFlag == 0)return 0 ;
 nInitDeNoseFlag = 0 ;
speex_preprocess_state_destroy(audio8K);
speex_preprocess_state_destroy(audio16K);
 return 1;
 }
步骤六、最后播放语音,播放时采用AudioTrack接口,与MediaCodec对应;如:
public void initPlayer(){
static final int frequency = 8000;
static final int  channelConfiguration  = AudioFormat.CHANNEL_
CONFIGURATION_MONO;
static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
 int recBufSize,playBufSize;
 AudioTrack audioPlayer ;
 playBufSize = AudioTrack.getMinBufferSize(frequency,
      channelConfiguration, audioEncoding);
 audioPlayer = new AudioTrack(AudioManager.STREAM_MUSIC,frequency,AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT) ;}。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈