Speex语音的前置处理(一)

1.简介

语音在采集和传输过程中,由于语音源的差异、信道的衰减、噪声的干扰以及远近效应,导致信号幅度相差很大。所有在语音处理之前我们需要对语音数据进行前置处理,包括预处理(AGC、VAD、回音消除)、重采样和噪声抑制。

所有的代码都是基于speex开源库,具体内容可以参考http://speex.org/

本开发手册暂时只提供AGC的接口和测试代码,其他陆续添加进来。

2.接口说明

2.1  介绍

预处理模块包括自动增益控制、静音检测和回音消除。以下是接口函数,具体参考speex\ speex_preprocess.h。

 


函数名称


功能简介


speex_preprocess_state_init


创建预处理器


speex_preprocess_state_destroy


销毁预处理器


speex_preprocess_run


处理一帧数据


speex_preprocess


处理一帧数据(废弃的)


speex_preprocess_estimate_update


更新预处理器


speex_preprocess_ctl


设置和读取预处理器的参数

 

2.1.1  speex_preprocess_state_init


函数原形


SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate);


功能


创建预处理器


参数


Frmae_size   [in]每帧的大小(建议帧长为20ms)

Sample_rate  [in]采样率(支持8k、16k、44k)


返回值


成功返回预处理器指针,失败返回NULL


说明


加入是16k的语音数据,帧长20ms等于320个采样

 

2.1.2  speex_preprocess_state_destroy


函数原形


void speex_preprocess_state_destroy(SpeexPreprocessState *st);


功能


销毁预处理器


参数


St           [in]处理器指针


返回值


Void


说明


 

 

2.1.3  speex_preprocess_run


函数原形


int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x);


功能


处理一帧语音数据


参数


St           [in]处理器指针

X            [in|out]数据缓存,处理后的数据也存入该缓存中


返回值


如果VAD打开,返回值为1表示有语音,为0表示静音或者噪音


说明


 

 

2.1.4  speex_preprocess


函数原形


int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo);


功能


处理一帧语音数据(废弃的函数,简介调用speex_preprocess_run)


参数


St           [in]处理器指针

X            [in|out]数据缓存,处理后的数据也存入该缓存中     


返回值


 


说明


 

 

2.1.5  speex_preprocess_estimate_update


函数原形


void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x);


功能


更新预处理器,不会计算输出语音


参数


St           [in]处理器指针

X            [in]数据缓存


返回值


Void


说明


 

 

2.1.6  speex_preprocess_ctl


函数原形


int speex_preprocess_ctl(SpeexPreprocessState *st, int request, void *ptr);


功能


设置预处理器的参数


参数


St           [in]处理器指针

Request      [in]参数的类型(由宏来代表不同的参数)

Ptr          [in|out]参数的值(设置参数时为in,获得参数参数时为out,这个由宏决定)


返回值


成功返回0,失败返回-1(表明未知的请求参数)


说明


以下数标识参数类型的宏

/** Set preprocessor denoiser state */

#define SPEEX_PREPROCESS_SET_DENOISE 0

/** Get preprocessor denoiser state */

#define SPEEX_PREPROCESS_GET_DENOISE 1

 

/** Set preprocessor Automatic Gain Control state */

#define SPEEX_PREPROCESS_SET_AGC 2

/** Get preprocessor Automatic Gain Control state */

#define SPEEX_PREPROCESS_GET_AGC 3

 

/** Set preprocessor Voice Activity Detection state */

#define SPEEX_PREPROCESS_SET_VAD 4

/** Get preprocessor Voice Activity Detection state */

#define SPEEX_PREPROCESS_GET_VAD 5

 

/** Set preprocessor Automatic Gain Control level (float) */

#define SPEEX_PREPROCESS_SET_AGC_LEVEL 6

/** Get preprocessor Automatic Gain Control level (float) */

#define SPEEX_PREPROCESS_GET_AGC_LEVEL 7

 

/** Set preprocessor dereverb state */

#define SPEEX_PREPROCESS_SET_DEREVERB 8

/** Get preprocessor dereverb state */

#define SPEEX_PREPROCESS_GET_DEREVERB 9

 

/** Set preprocessor dereverb level */

#define SPEEX_PREPROCESS_SET_DEREVERB_LEVEL 10

/** Get preprocessor dereverb level */

#define SPEEX_PREPROCESS_GET_DEREVERB_LEVEL 11

 

/** Set preprocessor dereverb decay */

#define SPEEX_PREPROCESS_SET_DEREVERB_DECAY 12

/** Get preprocessor dereverb decay */

#define SPEEX_PREPROCESS_GET_DEREVERB_DECAY 13

 

/** Set probability required for the VAD to go from silence to voice */

#define SPEEX_PREPROCESS_SET_PROB_START 14

/** Get probability required for the VAD to go from silence to voice */

#define SPEEX_PREPROCESS_GET_PROB_START 15

 

/** Set probability required for the VAD to stay in the voice state (integer percent) */

#define SPEEX_PREPROCESS_SET_PROB_CONTINUE 16

/** Get probability required for the VAD to stay in the voice state (integer percent) */

#define SPEEX_PREPROCESS_GET_PROB_CONTINUE 17

 

/** Set maximum attenuation of the noise in dB (negative number) */

#define SPEEX_PREPROCESS_SET_NOISE_SUPPRESS 18

/** Get maximum attenuation of the noise in dB (negative number) */

#define SPEEX_PREPROCESS_GET_NOISE_SUPPRESS 19

 

/** Set maximum attenuation of the residual echo in dB (negative number) */

#define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS 20

/** Get maximum attenuation of the residual echo in dB (negative number) */

#define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS 21

 

/** Set maximum attenuation of the residual echo in dB when near end is active (negative number) */

#define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE 22

/** Get maximum attenuation of the residual echo in dB when near end is active (negative number) */

#define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE 23

 

/** Set the corresponding echo canceller state so that residual echo suppression can be performed (NULL for no residual echo suppression) */

#define SPEEX_PREPROCESS_SET_ECHO_STATE 24

/** Get the corresponding echo canceller state */

#define SPEEX_PREPROCESS_GET_ECHO_STATE 25

 

/** Set maximal gain increase in dB/second (int32) */

#define SPEEX_PREPROCESS_SET_AGC_INCREMENT 26

 

/** Get maximal gain increase in dB/second (int32) */

#define SPEEX_PREPROCESS_GET_AGC_INCREMENT 27

 

/** Set maximal gain decrease in dB/second (int32) */

#define SPEEX_PREPROCESS_SET_AGC_DECREMENT 28

 

/** Get maximal gain decrease in dB/second (int32) */

#define SPEEX_PREPROCESS_GET_AGC_DECREMENT 29

 

/** Set maximal gain in dB (int32) */

#define SPEEX_PREPROCESS_SET_AGC_MAX_GAIN 30

 

/** Get maximal gain in dB (int32) */

#define SPEEX_PREPROCESS_GET_AGC_MAX_GAIN 31

 

/*  Can't set loudness */

/** Get loudness */

#define SPEEX_PREPROCESS_GET_AGC_LOUDNESS 33

 

/*  Can't set gain */

/** Get current gain (int32 percent) */

#define SPEEX_PREPROCESS_GET_AGC_GAIN 35

 

/*  Can't set spectrum size */

/** Get spectrum size for power spectrum (int32) */

#define SPEEX_PREPROCESS_GET_PSD_SIZE 37

 

/*  Can't set power spectrum */

/** Get power spectrum (int32[] of squared values) */

#define SPEEX_PREPROCESS_GET_PSD 39

 

/*  Can't set noise size */

/** Get spectrum size for noise estimate (int32)  */

#define SPEEX_PREPROCESS_GET_NOISE_PSD_SIZE 41

 

/*  Can't set noise estimate */

/** Get noise estimate (int32[] of squared values) */

#define SPEEX_PREPROCESS_GET_NOISE_PSD 43

 

/* Can't set speech probability */

/** Get speech probability in last frame (int32).  */

#define SPEEX_PREPROCESS_GET_PROB 45

 

/** Set preprocessor Automatic Gain Control level (int32) */

#define SPEEX_PREPROCESS_SET_AGC_TARGET 46

/** Get preprocessor Automatic Gain Control level (int32) */

#define SPEEX_PREPROCESS_GET_AGC_TARGET 47

 

3.实例代码

3.1  AGC


#define NN 320

/*

    语音数据为单通道、16bit、16k

*/

int _tmain(int argc, _TCHAR* argv[])

{

 

     short in[NN];

     int i;

     SpeexPreprocessState *st;

     int count=0;

     float f;

 

     st = speex_preprocess_state_init(NN, 16000);

    

     i=1;

     speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC, &i);

     f=16000;

     speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC_LEVEL, &f);

 

 

     while (1)

     {

         int vad;

         fread(in, sizeof(short), NN, stdin);

         if (feof(stdin))

              break;

         vad = speex_preprocess_run(st, in);

         //fprintf (stderr, "%d\n", vad);

         fwrite(in, sizeof(short), NN, stdout);

         count++;

     }

     speex_preprocess_state_destroy(st);

 

     return 0;

}

时间: 2024-09-11 01:37:18

Speex语音的前置处理(一)的相关文章

语音 matlab仿真-语音的matlab仿真问题

问题描述 语音的matlab仿真问题 请问语音的matlab仿真改如何实现,具体是怎样的流程?目前想实现speex语音压缩编解码的matlab仿真,该怎么实现呢?

网易推出游戏内置语音聊天工具“网易CC”

"网易CC"是网易杭州研究院自主研发出一款专为MMORPG游戏服务的语音聊天工具,此产品致力于为广大游戏玩家.在线语聊爱好者提供安全稳定.语音流畅.音质清晰的语音服务. 内置版本抢先上市 据网易CC产品负责人介绍说,此语音客户端软件永久免费,并包含游戏内置和独立客户端两种版本.游戏内置版本在游戏内即可启动CC进行语聊,不用下载安装,玩家可以在<天下贰>11月4日的版本更新后接触到这一功能. 内置语音系统安全放心 内置模式给玩家带来很多看得见的好处,网吧玩家无需下载客户端就可

微信电话本虎口夺食:再次挑战运营商

微信电话本虎口夺食:再次挑战运营商 时间:2014-11-12 16:45 来源:创事记 作者:广州阿超 文/罗超 11月11日,就在阿里双十一热火朝天地推行到下半程.最终撞到571亿的销售额红线时,微信出乎意料地放出了大招,正式推出了"微信电话本"应用,微信一键登录之后便可与微信好友直接通话, 整体交互界面.流程和体验与手机打电话别无二致,且是免费的,这是要与阿里抢头条的节奏呀. 继逐步消灭短信之后,微信虎口再夺食 距离微信与OTT之争已经过去一年半,彼时运营商哭诉微信会严重增加网络

微信出乎意料地放出了大招

11月11日,就在阿里双十一热火朝天地推行到下半程.最终撞到571亿的销售额红线时,微信出乎意料地放出了大招(或许是其能放出的终极大招),正式推出了微信电话本,微信一键登录之后便可与微信好友直接通话,整体交互界面.流程和体验与手机打电话别无二致,且是免费的,这显然是要与阿里抢头条的节奏. 继逐步消灭短信之后,微信虎口再夺食 距离微信与OTT之争已经过去一年半,彼时运营商哭诉微信会严重增加网络负荷,意图要对微信进行收费,腾讯一度被推上风口浪尖.最终因为三大运营商声音不一致,在腾讯高层斡旋.经历多轮

android-关于speex转换语音格式的问题

问题描述 关于speex转换语音格式的问题 请问一下,使用speex怎么可以把语音的amr转成aac格式的语音.在这里下载的demo大部分不能用,谢谢你们!!! 解决方案 [多媒体] 用SPEEX将PCM音频编码成AAC 虽然格式不满足你的要求,但是还是希望你能借鉴它的部分.

XP系统前置音频没有声音是怎么回事

  XP系统前置音频没有声音是怎么回事 1.插在电脑机箱后置音频接口有声音则说明电脑声卡以及驱动是一切都正常的,至于电脑前置机箱没有声音主要有3种可能.首先要分析下前置机箱音频接口的构造,机箱的前置音频就扣是有一组音频线的,装机的时候,需要将这组标有Audio插口线连接到主板音频输出端口方可,因此如果机箱前置音频输出口没有声音,可能是这根音频线没有插到主板对应输出接口位置导致的. 2.另外如果系统中设置禁用前置音频接口,也会导致前面没声音的情况,而且笔者遇到很多系统,默认是禁用了前置音频接口,而

QT语音声卡调试教程

  操作教程 1.先在QT进房后的界面上点击"话筒"右边的倒三角符号 选择语音检测 2.在声音输入选择合适的声卡,并说话 如果QT显示系统成功检测到声音输入,选择下一步. 3.在声音输出选择合适的声卡,并点击播放测试音按钮对已选播放设备进行测试 如果您能听到QT播放的测试音,那么恭喜,您的扬声器是正常的,点击关闭按钮开始正常语音吧. XP系统 如果您的系统是XP系统,双击右下角系统的小喇叭,在选项那里选择属性 把所有音量控制都点上 把所有音量都静音,然后分别打开并听一下效果,也可以调节

AI与大众最近的接触——智能语音交互

互联网的变迁过程 互联网的变迁主要体现在内容.入口.人机界面三个方面. 互联网内容的变迁 图一 互联网内容的变迁 时至今日,互联网的内容已经发生了很多变迁,早期的互联网以获取信息为主,例如人们通过Email收发信息.在BBS上灌水.通过门户网站了解新闻等等.阿里巴巴的起点也是从Alibaba.com开始,最初仅是为国外买家获取信息.购买国内供应商的产品起到牵线搭桥的作用. 随着网络的发展,互联网不仅仅再局限于获取信息,消费者逐渐可以通过淘宝.天猫.聚划算等网站购买生活必须品:现在,除了提供信息和

Speex手册----Speex编/解码API的使用(libspeex)

he libspeex library contains all the functions for encoding and decoding speech with the Speex codec. When linking on a UNIX system, one must add -lspeex -lm to the compiler command line. One important thing to know is that libspeex calls are reentra