Rockchip语音通话3A算法集成说明
:::info 文档信息
文档标识:RK-SM-YF-391 · 发布版本:V1.1.0 · 发布日期:2021-04-06 · 页数:19 · 语言:中文
原始文档:Rockchip_Introduction_Linux_Audio_3A_Algorithm_CN.pdf
:::
章节大纲
- Rockchip语音通话3A算法集成说明(P1)
- 简介(P4)
- 原理简要(P4)
- 测试说明(P4)
- 指标(P5)
- 客观指标(P5)
- 主观指标(P5)
- API集成说明(P6)
- RKAP_3A_Init()(P6)
- RKAP_3A_Destroy()(P6)
- RKAP_3A_Process()(P6)
- RKAP_3A_DumpVersion()(P7)
- demo示例(P7)
- 参数说明(P8)
- 基本参数(P8)
- AEC参数(P8)
- AEC基本参数(P8)
- ERLE参数(P9)
- ANR参数(P9)
- AGC参数(P10)
- EQ参数(P11)
- Peak滤波器(P11)
- 高低通滤波器(P13)
- shelf滤波器(P14)
- CNG参数(P16)
- 硬件测试(P17)
- 音频指标AP测试(P17)
- 音频指标简易测试(P17)
- 硬件结构(P18)
- 密封性测试(P19)
- 简介(P4)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
1. 简介
扬声器的声音多次反馈到麦克风引起的一段时间后人耳听到延迟的原音称作回声。回声的产生框图以及3A算法基本工作原理如下图。
1.1 原理简要
在上图中,TX表示发送端,即从近端(near-end)发送数据给远端(far-end);RX表示接收,即从远端接收信号到近端。在扬声器播放的情况下,扬声器播放的远端声音通过空气传播到近端的麦克风中去,如果不对其进行回声消除(Acoustic Echo Cancellation,AEC),远端在听到近端声音的同时也能够听到自己刚刚的说话声,更恶劣的情况是,在远端也使用免持设备的时候,两端声音互相激励,容易产生啸叫。因此需要通过AEC算法,将回声进行衰减,AEC算法主要包括两个部分:AF(Adaptive Filter)和NLP(Nonlinear Process ), 其中AF表示自适应滤波器,通过模拟回声路径,计算近端信号中回声的成分;NLP表示非线性处理,经过AF处理之后,近端信号中还有残留回声,需要通过NLP算法对其进行抑制。从图中可以看出,麦克风采集到的信号,除了近端说话声音以及回声之外,还有环境噪声,因此还需要进行语音降噪(Audio Noise Reduce, ANR)去除环境噪声;在近端麦克风采集的信号中,消除回声和噪声之后,保留的有用声音增益较低,因此引入自动增益控制算法(Audio Gain Control, AGC)对有用信号进行增益;最后,使用EQ(Equalizer)和CNG(Comfort Noise Generation)增加声音的舒适度,发送到远端。
1.2 测试说明
从1.1节的描述中,可以知道,在双端通话的时候,有以下三种情况:
近端说话,远端不说话
在这种情况下,系统处于近端单讲状态,远端没有说话(近端扬声器没有声音),那么也就不存在回声,此时实际相当于麦克风采集到的只有近端声音和噪声,相当于自适应滤波器不工作。
近端不说话,远端说话
在这种情况下,系统处于远端单讲状态,远端声音通过近端扬声器播放,再被麦克风采集回去(麦克风输入包含回声和噪声),该状态下自适应滤波器在一定时间的收敛之后达到稳定状态。
近端和远端同时说话
在这种情况下,系统处于双讲状态,该状态下自适应滤波器容易发散,导致回声消除力度减小。因此,在测试回声消除效果的时候,需要以上三个情况同时测试。
1.3 指标
1.3.1 客观指标
ITU G.168中提到,回声损耗(Echo Return Loss,ERL):从回声抵消器的接收口至发送口信号的衰减。指在回声通道中(近端)的损耗,即远端出来的声音经过回声路径再到麦克输入的衰减。
回声损耗增强(Echo Return Loss Enhancement,ERLE):当回声信号通过回声抵消器的发送通道传送时的衰减。
使用ERLE来衡量回声消除的效果,可以看作是在一段时间内实现回声衰减的平均值。ERLE值越大,说明效果越好,并且可以从时间上记录该值来统计收敛时间:
其中,为近端信号,为误差信号,即为输出信号。
1.3.2 主观指标
ITU-TP.800和P.830定义MOS分(Mean Opinion Score)的主观测试方法:由不同的人分别对原始语料和经过系统处理之后的语料进行主观感觉对比,分别打出MOS分,最后求平均值,这是一种纯主观的定性测量。ITU选取在很宽的听觉范围内,不同的年龄、性别和语言组别的相同得分,作出语音质量的评价标准。
| MOS分 | 主观意见 | 听觉感受 |
|---|---|---|
| 4-5分 | 优秀(excellent) | 很好,听的清楚,延迟小, 交流流畅 |
| 3-4分 | 良好(good) | 稍差,听的清楚,延迟小, 交流欠缺顺畅,有点杂音 |
| 2-3分 | 一般(fair) | 还可以,听不太清,延迟较大, 交流重复多次 |
| 1-2分 | 差(poor) | 勉强,听不太清,延迟较大, 交流重复多次 |
| 1分以下 | 很差(bad) | 极差,听不懂,延迟大, 交流不通畅 |
2. API集成说明
2.1 RKAP_3A_Init()
| 函数原型 | RKAP Handle RKAP 3A Init(RKAP AEC State *st, _ _ _ _ _ RKAP AEC TRANS ENUM transType); _ _ _ |
|---|---|
| 输入参数 | st结构体输入一些基本参数; transType 为TX或者RX表示当前处理流程 |
| 返回值 | TX或者RX处理过程的句柄 |
| 函数功能说明 | 对3A算法进行初始化 |
说明: 结构体RKAP_AEC_State各参数的取值范围如下:
| 1 typedef struct RKAP AEC State S _ _ _ 2 { 3 /* Basic info */ 4 int swSampleRate; /*表示采样率,只支持8k或者16k;*/ 5 int swFrameLen; /* 表示帧长,只支持16ms或者20ms */ 6 const char *pathPara; /* 导入参数bin文件的路径 */ 7 } RKAP AEC State; _ _ | |
|---|---|
| 1 2 3 4 5 6 7 | typedef struct RKAP AEC State S _ _ _ { /* Basic info */ int swSampleRate; /*表示采样率,只支持8k或者16k;*/ int swFrameLen; /* 表示帧长,只支持16ms或者20ms */ const char *pathPara; /* 导入参数bin文件的路径 */ } RKAP AEC State; _ _ |
2.2 RKAP_3A_Destroy()
| 函数原型 | void RKAP 3A Destroy(RKAP Handle handle); _ _ _ |
|---|---|
| 输入参数 | 句柄 |
| 返回值 | 无 |
| 功能说明 | 反初始化 |
2.3 RKAP_3A_Process()
| 函数原型 | int RKAP 3A Process(RKAP Handle handle, short *pfSigIn, _ _ _ short *pfSigRef, short *pfSigOut); |
|---|---|
| 输入参数 | handle表示初始化的TX或者RX句柄; pfSigIn表示近端信号; pfSigRef表示远端信号,也叫参考信号; pfSigOut表示输出信号 |
| 返回值 | 0表示正确返回,其余表示错误返回 |
| 功能说明 | 3A算法处理 注意:一般TX和RX是共存的,因此需要分别初始化并处理 |
2.4 RKAP_3A_DumpVersion()
| 函数原型 | void RKAP 3A DumpVersion(void); _ _ |
|---|---|
| 输入参数 | 无 |
| 返回值 | 无 |
| 功能说明 | 打印当前使用算法库版本号 |
2.5 demo示例
参考external/rkmedia/examples/rkmedia_audio_test.c
3. 参数说明
以下带TX标识的表示TX流程调参,RX同理。涉及到的调参模块比较多,因此使用Windows工具RKAP_3A_Para_Tool对相关参数进行保存。
3.1 基本参数
| 参数名称 | Index | 取值范围 | 默认参数 | 描述 |
|---|---|---|---|---|
| SampleRate | 0 | 8k或16k | 无 | 采样率 |
| Mic Num _ | 5 | 1~8 | 1 | 麦克风的个数 |
| Speaker Num _ | 6 | 1~2 | 1 | 回采通道数 |
| Linear Gain | 7 | -90~90 (dB) | 0 | 对TX输入信号进行线性增益,单位dB |
工具界面如下图:
3.2 AEC参数
3.2.1 AEC基本参数
| 参数名称 | Index | 取值范 围 | 默认 值 | 描述 |
|---|---|---|---|---|
| AEC Enabled | 10 | 0或1 | 1 | 回声消除使能:0-off;1-on |
| AEC Delay Enabled | 11 | 0或1 | 0 | 自动延时估计使能(一般软件回采的时候 使用) |
| Default Delay Samples | 12 | 0~4096 | 0 | 在自动延时估计没有使能,mic跟ref信号 有 固定时延的情况下,该值表示时延的样本 数 |
| AEC NLP Level | 13 | 0~4 | 2 | AEC NLP的抑制程度,0-4抑制力度逐渐 加大 |
说明:AEC NLP Level为非线性处理对残留回声的抑制力度,其中:Level 0表示关闭NLP模块,即只对回声做自适应滤波处理,该情况适用于近端信号和远端信号为线性关系的场景中;
Level 1表示轻力度抑制残留回声,适用于喇叭质量较高,腔体密封性好,整机震动引入的非线性不多,结构较好的场景;
Level 2表示中等力度抑制残留回声,该情况适用于喇叭、腔体以及结构等基本符合要求,但是线性度不够的情况;
Level 3表示最高力度抑制回声,该情况适用于喇叭廉价,腔体情况糟糕,音频指标较差的场景,使用Level 3能够消除回声,但是容易产生过削、切音等情况,对语音理解产生影响。
工具界面如下图:
3.2.2 ERLE参数
| 参数名称 | Index | 取值范 围 | 默认 值 | 描述 |
|---|---|---|---|---|
| ERLE Enabled | 450 | 0或1 | 0 | ERLE压制使能 |
| ERLE Smooth | 451 | 0~1 | 0.92 | ERLE压制平滑系数 |
| ERLE Thd | 452 | 0~1 | 0.05 | ERLE压制门限值,低于门限值进行ERLE压制 |
| ERLE Con Thd | 453 | 1~20 | 1 | ERLE门限触发帧数,连续N帧高于ERLE门限 值,则触发 |
3.3 ANR参数
| 参数名称 | Index | 取值范围 | 默认值 | 描述 |
|---|---|---|---|---|
| TX ANR Enabled | 120 | 0或1 | 1 | TX降噪使能:0-off;1-on |
| TX ANR Gmin | 121 | -50~-5 (dB) | -20 | Gmin表示噪声门限值, 即不存在语音时候的噪声能量值; |
| RX ANR Enabled | 125 | 0或1 | 1 | RX降噪使能:0-off;1-on |
| RX ANR Gmin | 126 | -50~-5 (dB) | -20 | 同TX ANR Gmin |
说明:Gmin取值越小,噪声消的越干净,但是同时,能量较小的语音可能被过消。
工具界面如下图:
3.4 AGC参数
| 参数名称 | Index | 取值范围 | 描述 |
|---|---|---|---|
| TX AGC Enabled | 130 | 0或1 | TX AGC使能:0-off;1-on |
| TX AGC Limiter Enabled | 131 | 0或1 | TX AGC限幅器使能:0-off;1-on |
| TX AGC Target Level | 132 | 0~90(dB) | 当限幅器使能的时候,target level表示要限幅的 增益的(-1)倍 |
| TX AGC Add Gain | 133 | -90~90(dB) | AGC增益幅度 |
| RX AGC Enabled | 150 | 0或1 | RX AGC使能:0-off;1-on |
| RX AGC Limiter Enabled | 151 | 0或1 | RX AGC限幅器使能:0-off;1-on |
| RX AGC Target Level | 152 | 0~30(dB) | 当限幅器使能的时候,target level表示要限幅的 增益的(-1)倍 |
| RX AGC Add Gain | 153 | -90~90(dB) | AGC增益幅度 |
下图为target Level为 3dB,RX AGC Add Gain为10dB时候的输入输出对比图:工具界面如下图:
3.5 EQ参数
3.5.1 Peak滤波器
本算法中的EQ(Equalizer)为简单的3段EQ,旨在3A算法处理之后的语音舒适度。具体参数如下表格:
| 参数名称 | Index | 取值范围 | 描述 |
|---|---|---|---|
| TX EQ Enabled | 160 | 0或1 | TX EQ使能:0-off;1-on |
| TX EQ Freq0 | 170 | (0,Fs/2) | 第1段EQ的中心频率 |
| TX EQ Gain0 | 171 | [-12,12] (dB) | 第1段EQ的增益,单位:dB |
| TX EQ Q0 | 172 | (0,10] | 第1段EQ的品质因子 |
| TX EQ Freq1 | 180 | (0,Fs/2) | 第2段EQ的中心频率 |
| TX EQ Gain1 | 181 | [-12,12] (dB) | 第2段EQ的增益,单位:dB |
| TX EQ Q1 | 182 | (0,10] | 第2段EQ的品质因子 |
| TX EQ Freq2 | 190 | (0,Fs/2) | 第3段EQ的中心频率 |
| TX EQ Gain2 | 191 | [-12,12] (dB) | 第3段EQ的增益,单位:dB |
| TX EQ Q2 | 192 | (0,10] | 第3段EQ的品质因子 |
| RX EQ Enabled | 300 | 0或1 | RX EQ使能:0-off;1-on |
| RX EQ Freq0 | 310 | (0,Fs/2) | 第1段EQ的中心频率 |
| RX EQ Gain0 | 311 | [-12,12] (dB) | 第1段EQ的增益,单位:dB |
| RX EQ Q0 | 312 | (0,10] | 第1段EQ的品质因子 |
| RX EQ Freq1 | 320 | (0,Fs/2) | 第2段EQ的中心频率 |
| RX EQ Gain1 | 321 | [-12,12] (dB) | 第2段EQ的增益,单位:dB |
| RX EQ Q1 | 322 | (0,10] | 第2段EQ的品质因子 |
| RX EQ Freq2 | 330 | (0,Fs/2) | 第3段EQ的中心频率 |
| RX EQ Gain2 | 331 | [-12,12] (dB) | 第3段EQ的增益,单位:dB |
| RX EQ Q2 | 332 | (0,10] | 第3段EQ的品质因子 |
工具界面如下图:
下图为Freq = 4000Hz,Gain = 2dB,Q分别为2.5和 6的PEAK滤波器示例:
3.5.2 高低通滤波器
| 参数名称 | Index | 取值范围 | 描述 |
|---|---|---|---|
| TX HPF Fc | 200 | 0~Fs/2 | TX高通滤波器截止频率 |
| TX LPF Fc | 201 | 0~Fs/2 | TX低通滤波器截止频率 |
| RX HPF Fc | 340 | 0~Fs/2 | RX高通滤波器截止频率 |
| RX LPF Fc | 341 | 0~Fs/2 | RX低通滤波器截止频率 |
说明:Fc设置为0或者Fs/2的时候,表示该滤波器不使能。
下图为截止频率2000Hz的低通滤波器示例:下图为截至频率为200hz的高通滤波器示例:
3.5.3 shelf滤波器
shelf滤波器是指对低频(low shelf)或者高频(high shelf)进行整体的增益抬升或者降低,适用于低频或者高频频响不足的情况。
参数表格如下:
| 参数名称 | Index | 取值范围 | 描述 |
|---|---|---|---|
| TX HSF Fc | 202 | 0~Fs/2 | TX high shelf滤波器截止频率 |
| TX HSF Gain | 203 | -12~12 | TX high shelf滤波器增益 |
| TX LSF Fc | 204 | 0~Fs/2 | TX low shelf滤波器截止频率 |
| TX LSF Gain | 203 | -12~12 | TX low shelf滤波器增益 |
| RX HSF Fc | 342 | 0~Fs/2 | RX high shelf滤波器截止频率 |
| RX HSF Gain | 343 | -12~12 | RX high shelf滤波器增益 |
| RX LSF Fc | 344 | 0~Fs/2 | RX low shelf滤波器截止频率 |
| RX LSF Gain | 345 | -12~12 | RX low shelf滤波器增益 |
说明:Fc设置为0或者Fs/2的时候,表示该滤波器不使能。
下图为截至频率为300hz,增益分别为±12dB的highshelf滤波器示例:
下图为截至频率为1000hz,增益分别为±12dB的highshelf滤波器示例:
3.6 CNG参数
| 参数名称 | Index | 取值范围 | 描述 |
|---|---|---|---|
| TX CNG Enabled | 440 | 0或1 | TX CNG使能:0-off;1-on |
| TX CNG Ratio | 441 | 施加舒适噪声比例 | |
| TX CNG Amp | 442 | 施加舒适噪声幅度 |
4. 硬件测试
4.1 音频指标AP测试
测试环境:音频分析仪器(AP)测试语料:扫频信号测试目的:测试音频指标,指标越差,调参效果越差测试方法:使用AP灌入信号源,回采信号出测试电信号指标判定标准:远端信号(回采信号):THD+N < 5%
特别说明: 若使用RK809或者RK817, 推荐使用hpout+PA,不推荐使用SPK。如果一定要用请注意以下两点:
(1)RK809和RK817 codec的classD主要是按照8ohm设计,因此使用其他规格阻抗,会导致音频指标恶化。
(2) RK809和RK817 codec的classD输出回采不能够使用单端,因此,如果使用RK809或者RK817请使用外置codec回采,或者使用pdm mic。否则音频指标不能达到调参要求。
4.2 音频指标简易测试
该测试作为没有音频分析仪时的替代测试方案
测试环境:样机,安静环境测试预料:扫频信号测试目的:测试音频指标测试方法:使用样机自播自录,命令如下,
| 1 arecord -D hw:0,0 -c 2 -f S16 LE -r 16000 /tmp/sweep.wav _ 2 sox -b 16 -r 16000 -c 2 -n -t alsa hw:0,0 synth 20 sine 20:8000 // 采样率 16kHz,播放20Hz~8kHz扫频 | |
|---|---|
| 1 2 | arecord -D hw:0,0 -c 2 -f S16 LE -r 16000 /tmp/sweep.wav _ sox -b 16 -r 16000 -c 2 -n -t alsa hw:0,0 synth 20 sine 20:8000 // 采样率 16kHz,播放20Hz~8kHz扫频 |
或
| 1 arecord -D hw:0,0 -c 2 -f S16 LE -r 8000 /tmp/sweep.wav _ 2 sox -b 16 -r 8000 -c 2 -n -t alsa hw:0,0 synth 20 sine 20:4000 //采样率8kHz,播 放20Hz~4kHz扫频 | |
|---|---|
| 1 2 | arecord -D hw:0,0 -c 2 -f S16 LE -r 8000 /tmp/sweep.wav _ sox -b 16 -r 8000 -c 2 -n -t alsa hw:0,0 synth 20 sine 20:4000 //采样率8kHz,播 放20Hz~4kHz扫频 |
将sweep.wav pull出来,分别观察回采信号和mic信号的扫频谐波以及底噪。如果音频指标较差,可能会导致滤波器收敛时间慢,漏回声,过削等各种问题。下图为扫频信号不符合调参预期的示例:
说明:在使RK809/RK817 Codec播放和录音之前,需要根据硬件连接,确认打开播放和录音的通路。
配置相应的播放通路:
| 1 amixer -c 0 sset 'Playback Path' SPK // 打开Codec ClassD通路 | |
|---|---|
| 1 | amixer -c 0 sset 'Playback Path' SPK // 打开Codec ClassD通路 |
或者:
| 1 amixer -c 0 sset 'Playback Path' HP // 打开Codec HPOUT通路 | |
|---|---|
| 1 | amixer -c 0 sset 'Playback Path' HP // 打开Codec HPOUT通路 |
配置录音通路:
| 1 amixer -c 0 sset 'Capture MIC Path' 'Main Mic' // 打开Codec MIC通路 | |
|---|---|
| 1 | amixer -c 0 sset 'Capture MIC Path' 'Main Mic' // 打开Codec MIC通路 |
4.3 硬件结构
麦克风和扬声器无遮挡,扬声器不对着墙体桌面等物体;麦克风和扬声器不要在同一个面板上,距离尽量远,不产生共振;麦克风的拾音孔不能正对着扬声器,需要用隔音棉之类的材料隔开。
4.4 密封性测试
测试环境:消音室测试语料:0dBFS白噪声测试目的:通过测试,保证MIC器件拾音孔的密封性测试方法:把测试音源放置在MIC外接平面的法线方向50cm处,用橡皮泥或者其他东西堵住MIC的进音孔,用高保真播放设备播放白噪声信号,音量级为94dBA,待测样机进行录音,测量每一个MIC声道堵住音孔的RMS大小,比对堵住和不堵住音孔的功率差判定标准:堵住和不堵住音孔的RMS差20dB以上