Skip to main content

P3510-2MIC_调试笔记

概要

本文档主要是指引用户在使用P3510-2MIC配套提供的固件不能满足需求时,如何进行自行配置P3510-2MIC的参数(寄存器),如何自行更新自制的固件。

P3510-2MIC预留了较多的控制和DSP算法参数可供用户进行配置,以实现用户最终需求。这些可以参数都体现在XMOS官方文档XVF3510-User-Guide中,本文档鉴于官方文档,根据木瓜电子内部技术工程师和其他的用户的真实案例,整理调试笔记,提供给用户作为参考借鉴。

前提

  • 用户需拥有P3510-2MIC评估板,并且根据查阅P3510-2MIC的硬件使用文档能够实现使用Audacity进行录音
  • 用户在windows系统上已经安装了XMOS Control的驱动,XMOS Control设备枚举主要是用来对P3510-2MIC进行指令控制,包含了DSP算法参数调整和XVF3510的固件更新
  • 用户已经获取了P3510-2MIC评估板的资料包,并且已经自行下载安装python 3, 用户生成自制的XVF3510固件需要有python的环境支持。
  • 用户需要明确需求,使用P3510-2MIC评估板是作为语音识别(ASR,Automatic Speech Recognition )还是会议通话(Comms, communication and conferencing)测试使用,还是两者都需要。

DSP 概念

AEC(Acoustic Echo Cancellation, 回音消除),回音消除的作用主要是消除本设备(类似P3510-2MIC)麦克风拾取到来自远端的声音在本设备扬声器(喇叭)播放出来的声音,即形同于扬声器播放的声音不要再被麦克风设备重新采集。AEC算法过程中需要远端音频声源作为参考信号给到P3510-2MIC设备,才能消除扬声器播放的回声声音,形象理解为需要消除哪些声音,就提供对应声音信号作为参考信号给P3510-2MIC设备。

VAD (Voice Activity Detection , 人声活动检测),人声检测的作用是实时判断环境中是否有人声存在。

IC(Interference Cancellation,干扰源消除),干扰源消除的作用主要是消除环境中固定的位置点发出的干扰声音信号,该信号视为为干扰信号被P3510-2MIC消除。IC算法不需要接入参考信号,但会存在一个收敛时间过程,在干扰源信号的位置和P3510-2MIC的位置相对固定,并且有VAD人声检测后即可实现收敛消除。

NS (Noise Suppression, 噪声抑制),噪声抑制的作用主要是抑制抑制来自其频率特性不会随时间瞬时变化的噪声源。其中包括散射的背景噪声和固定噪声源,类似于稳态噪声和非稳态噪声。

AGC(Automatic Gain Control,自动增益控制),自动增益的作用主要是可以动态调整音频增益,或设定固定增益,使声音保持所需的输出电平。

工具

vfctrl_usb工具是使用来进行写入和读取P3510-2MIC的DSP参数(寄存器)或者其他控制参数,如XVF3510内置的立体声回音消除(AEC) , 点噪消除(IC),噪声抑制(NS)和自动增益(AGC)算法参数数值,或者设定具体的功能与参数,最终达到所需要的音频效果。

dfu_usb工具是使用来进行对P3510-2MIC进行固件DFU更新(Device Firmware Update ),如更新P3510-2MIC的配套固件和用户自制的固件。

在windows系统上,以上两个工具的使用前提都需要安装XMOS Control的驱动,依托windows系统的cmd工具运行。快捷键WIN+R ,输入cmd ,确认打开cmd界面,使用cd指令进入到vfcrtl_usb工具的存放路径,类似键入指令如下后,进行使用vfctrol_usb工具

cd /d D:\XVF3510\XVF3510-UA Unqualified Release_4.4.0\host\Win32\bin

DSP算法及声音流框图

参考XMOS官方文档XVF3510-User-Guide可以得到其DSP和声源流框图如下:

上图所示,PDM MIC,AEC,IC,NS, AGC都是可以通过使用vfctrol_usb工具进行调整其对应的DSP参数的,并且整体XVF3510的DSP算法音频流程如下:

  1. 两路PDM麦克风音频信号进行输入XVF3510
  2. 对采集到的信号传输给回音消除(AEC)来消除扬声器的回声
  3. 再经过干扰源消除(IC)对干扰源噪声(如洗衣机,收音机的噪声)进行消除
  4. 经过噪声抑制(NS)抑制环境稳态噪声(例如空调声)
  5. 通过自动增益(AGC)实现远距离拾音,或者调整声音大小
  6. 最终输出两种音频效果,分别为语音识别(ASR)和会议通话(Comms),可选其一。

需要注意的是,在默认的固件下,我们是使用USB立体声音轨中的ch0音轨输出ASR音频效果,使用ch1音轨输出Comms音频效果。在下文的算法调整中,ch0的相关参数代表与ASR输出有关,ch1的相关参数代表与Comms输出有关。如下图

AGC 算法参数调整示例

P3510-2MIC评估板的AGC对应参数数值的设置直接影响了拾音距离,也是用户较关注的算法板块。其中AGC算法参数说明如下表,初步看评估板可以调整的参数有如下。

SET_GAIN_CH1_AGC
SET_ADAPT_CH1_AGC
SET_LC_ENABLED_CH1_AGC
SET_MAX_GAIN_CH1_AGC
SET_UPPER_THRESHOLD_CH1_AGC
SET_LOWER_THRESHOLD_CH1_AGC
SET_INCREMENT_GAIN_STEPSIZE_CH1_AGC
SET_DECREMENT_GAIN_STEPSIZE_CH1_AGC
危险

P3510-2MIC USB输出的立体声中,其中在ch0输出ASR音频效果,在ch1输出Comms音频效果。在下文的算法调整中,ch0的相关参数代表与ASR输出有关,ch1的相关参数代表与Comms输出有关。

这里以ch1为例,所以调整所列的参数与Comms输出有关。在设定每个AGC参数值前,都是可以使用GET 来代替SET来读出当时的状态值。如想要设定配置AGC最大增益值(SET_MAX_GAIN_CH1_AGC)前,先看下当前状态(GET_MAX_GAIN_CH1_AGC),键入指令如下和打印出获取结果如下。

vfctrl_usb GET_MAX_GAIN_CH1_AGC
GET_MAX_GAIN_CH1_AGC: 999.9847

通过下面分类讲解来阐述上述的列出的8个参数的相互关联关系。

设定为固定增益

设定固定增益则代表AGC增益不需要变动,那么关联的参数有,通过SET_ADAPT_CH1_AGC来关闭自适应调整(幅值为0),通过SET_GAIN_CH1_AGC的值来确定所需的增益值。示例如下操作,和得到的录音效果。

vfctrl_usb SET_ADAPT_CH1_AGC 0
vfctrl_usb SET_GAIN_CH1_AGC 100

设定为自适应增益(远距离拾音)

设定为自适应增益,则代表AGC的增益值时刻在变动,期望最终是输出的音频信号保持平缓,保持声音大小在同一水平上。

首先需要设定 SET_ADAPT_CH1_AGC 打开自适应调整(幅值为1),并且 SET_GAIN_CH1_AGC 将会失效,无论设置什么值都会被调整。由于是远距离拾音,设定 SET_MAX_GAIN_CH1_AGC 为1000,以确保有足够的增益值。

然后通过设定 SET_UPPER_THRESHOLD_CH1_AGC 和 SET_LOWER_THRESHOLD_CH1_AGC 音频信号的上限阈值和下限阈值来保持输出期望的声音水平。其中UPPER和LOWER示例如下,在upper和lower 扶着的框内就是用户期望的输出声音信号大小水平(desired level),如果输出的声音不在该框内,则会不断自动调整增益值,使其达到框内的输出水平。

AGC增益值变动是步进的方式,使其声音大小变化处于渐变的方式。所以XVF3510提供了AGC增益上升和减小的的步进参数。该参数一般情况下建议使用默认值,使声音大小变动是平缓过度的。但是,步进过小,则意味者收敛的时间过长。

SET_INCREMENT_GAIN_STEPSIZE_CH1_AGC
SET_DECREMENT_GAIN_STEPSIZE_CH1_AGC

所以设定为远距离拾音的自适应增益,如下的参数值为提供参考,键入如下指令,与其效果如下。其中需要说明的是: SET_LC_ENABLED_CH1_AGC 需要赋值为1,以确保人声之后的声音底噪保持尽可能小。

Upper_thereshold的值一定要大于Lower_threshold的值,不建议设置upper过大,使用Lower_threshold来保持声音不小于范围即可, 同时不建议Lower_threshold过大,否则把底噪同样增大。

vfctrl_usb SET_ADAPT_CH1_AGC 1
vfctrl_usb SET_LC_ENABLED_CH1_AGC 1
vfctrl_usb SET_MAX_GAIN_CH1_AGC 1000
vfctrl_usb SET_UPPER_THRESHOLD_CH1_AGC 0.7
vfctrl_usb SET_LOWER_THRESHOLD_CH1_AGC 0.4
vfctrl_usb SET_INCREMENT_GAIN_STEPSIZE_CH1_AGC 2
vfctrl_usb SET_DECREMENT_GAIN_STEPSIZE_CH1_AGC 0.98

附参数说明如下表,详细深入的说明,则建议用户查看XVF3510-User-Guide的章节4.4.6(page 55)

命令描述说明
SET_ADAPT_CH0_AGC
SET_ADAPT_CH1_AGC
[0,1]是否需要打开AGC自适应调整,如没有打开,AGC的值为固定
0:代表关闭AGC增益值自适应调整
1:代表打开AGC增益值会自适应调整(默认值)
SET_LC_ENABLED_CH0_AGC SET_LC_ENABLED_CH1_AGC[0,1]是否需要打开损失控制,主要体现在是否需要丢弃人声之后的底噪
0:代表关闭(ch0默认值)
1:代表打开损失控制(ch1默认值)
SET_GAIN_CH0_AGC
SET_GAIN_CH1_AGC
[0~32767]设定AGC的增益值,值越大,则输出的声音信号越大,默认值为 500
SET_MAX_GAIN_CH0_AGC SET_MAX_GAIN_CH1_AGC[0~32767]设定AGC的最大的增益值,要求AGC的值永远不会超过该设定的最大增益值,默认值为 1000
SET_UPPER_THRESHOLD_CH0_AGC SET_UPPER_THRESHOLD_CH1_AGC[0~1]设定输出声音大小期望水平的上限阈值,满口框为1,默认值为0.6
SET_LOWER_THRESHOLD_CH0_AGC SET_LOWER_THRESHOLD_CH1_AGC[0~1]设定输出声音大小期望水平的下限阈值,默认值为0.3
SETINCREMENT_GAIN_STEPSIZE CH0AGC SET_INCREMENT_GAIN_STEPSIZE CH1_AGC[0~32767]设定AGC值在增加时的步进值大小,值越大,则AGC值变大越快。
SETDECREMENT_GAIN_STEPSIZE CH0AGC SET_INCREMENT_GAIN_STEPSIZE CH1_AGC[0~1]设定AGC值在减小时的步进值大小,值越大,则AGC值变小越快。

为AEC 选择参考信号

ACE算法板块的作用类似等同于防止P3510-2MIC的麦克风再录制到本地扬声器(喇叭)播放的声音,AEC回音消除需要有参考信号(Ref)才能起效果,类似copy一份扬声器的声源给到P3510-2MIC。其效果举例如下

P3510-2MIC为其AEC算法板块提供所需的参考信号(Ref)有两种方式:

  • USB侦听方式:Host(电脑操作系统) 通过USB 输出的方式提供给P3510-2MIC
  • 模拟回采方式:通过模拟回采(copy)喇叭的模拟信号提供给插入P3510-2MIC的3.5mm耳机孔

该两种方式都可以通过vfctrl_usb工具去配置XVF3510的参数实现。在配置之前, 通过指令先读取现在的音频流的矩阵映射情况,键入指令与查看其打印结果如下:

vfctrl_usb get_io_map_and_shift
GET_IO_MAP_AND_SHIFT:
target: USB_FROM_DEVICE_0, source: PIPELINE_OUT_0 output shift: NONE
target: USB_FROM_DEVICE_1, source: PIPELINE_OUT_1 output shift: NONE
target: I2S_FROM_DEVICE_0, source: PIPELINE_OUT_0 output shift: NONE
target: I2S_FROM_DEVICE_1, source: USB_TO_DEVICE_0 output shift: NONE
target: REF_TO_PIPELINE_0, source: USB_TO_DEVICE_0 output shift: NONE
target: REF_TO_PIPELINE_1, source: USB_TO_DEVICE_1 output shift: NONE

由上的打印情况的最后两行可以得知,USB_TO_DEVICE(电脑USB输出到P3510-2MIC)的声音源,给到REF_TO_PIPELINE(参考信号)作为AEC的参考信号(Ref)。

USB侦听方式

USB侦听方式,我们也称为通过USB提供AEC的参考信号。其硬件连接仅只有USB线即可,同时需要在windows进行音频声卡设备设置,查看P3510-2MIC的声卡设备设置

注意

完成配置之后,即说明电脑自带的声卡播放的声音会copy传递一份到“立体声混音”中,勾选侦听“立体声混音”的声音,通过XVF3510(UAC1.0)Adaptive声卡通过USB输送到P3510-2MIC作为AEC参考信号

P3510-2MIC出厂配套默认固件中已经支持了通过USB侦听方式获取AEC参考信号,支持的固件如下:

data_xvf3510_usb_aec_ref_48K_v4_4_0.dfu
data_xvf3510_usb_aec_ref_16K_v4_4_0.dfu

通过vfctrl_usb工具去实现USB提供AEC的参考信号,键入指令如下即可。至于为什么是SET_IO_MAP指令和4,5,7,8这些数字,参考XVF3510-User-Guide的章节Table 4-9 I/O Mapping Destination Indexes(page 42)说明。

vfctrl_usb SET_IO_MAP 4 7
vfctrl_usb SET_IO_MAP 5 8

如果测试的时候,发现AEC回音消除没有效果,确保window系统声卡设备是否设置正确,同时可以通过vfctrl_usb工具键入指令实现查看REF_TO_PIPELINE的声音是否有获取到声音查看(将USB播放的声音又通过USB录制回去),键入的指令和效果如下图。

vfctrl_usb SET_IO_MAP 0 7

模拟回采方式

模拟回采方式,我们也称为通过I2S的方式获取到AEC的参考信号。其硬件连接除了USB线连接电脑,仍需要喇叭信号分出一路通过AUX音频接入到P3510-2MIC的3.5mm耳机孔,这次不需要在windows进行音频声卡设备设置了。

P3510-2MIC配套固件中已经支持了通过模拟回采方式获取AEC参考信号,支持的固件如下:

data_xvf3510_I2S_aec_ref_48K_v4_4_0.dfu
data_xvf3510_I2S_aec_ref_16K_v4_4_0.dfu

通过通过vfctrl_usb工具去实现I2S获取AEC的参考信号

vfctrl_usb SET_IO_MAP 4 9
vfctrl_usb SET_IO_MAP 5 10

ASR和Comms输出选择说明

P3510-2MIC在USB立体声音轨中可以同时输出ASR音频效果和Comms音频效果,其中这两者的区别如下。

ASR输出,提供给语音识别云端引擎进行识别使用;ASR音频前端处理主要是为了提高云端语音识别率,所以其处理后,频谱会偏向饱满,这样尽大可能减小了音频失真。同事增强了人声,抑制了背景省和噪声。

Comms输出,提供给用户进行会议语音通话使用;Comms音频前端处理主要是为了提高人声的清晰度,同时做了较大的背景声和噪声抑制,频谱较为干净,相对ASR输出有较大的失真,不建议做语音识别用。

综上,ASR输出是属于提供给语音识别服务器使用,不需要人体感官去判断,所以整体体现噪声偏大或者背景声偏大,这样的目的主要是为了保留更加完善的频谱信息和减小失真度,以提高语音识别的识别率,所以建议做语音识别用途的话,建议选择ASR输出

而Comms输出主要是提供用户进行语音会议通话使用,所以需要较为干净的声音频谱和较低的底噪,以提高人声辨识度。所以建议做会议通话使用,建议现在Comms输出。

如果在会议通话的应用产品中,又同时需要语音识别作为语音转录文字,则ASR输出和Comms输出都需要保留。在P3510-2MIC的USB输出中,默认是在ch0作为ASR输出,ch1作为Comms输出。但是可以通过调整音频流的参数,使其ch0和ch1都输出Comms。

如下示例为设置ch0和ch1都Comms输出, 打印信息如下说明成功,也表明Comms输出在USB的ch0音轨上。

vfctrl_usb SET_IO_MAP 0 6
******* set_io_map USB_FROM_DEVICE_0 PIPELINE_OUT_1 ******

其测试情况如下图 ,可以看到USB输出的ch0和ch1都为Comms的输出内容。同时键入指令也可以查看到结果。

vfctrl_usb get_io_map_and_shift
GET_IO_MAP_AND_SHIFT:
target: USB_FROM_DEVICE_0, source: PIPELINE_OUT_1 output shift: NONE
target: USB_FROM_DEVICE_1, source: PIPELINE_OUT_1 output shift: NONE
target: I2S_FROM_DEVICE_0, source: PIPELINE_OUT_0 output shift: NONE
target: I2S_FROM_DEVICE_1, source: USB_TO_DEVICE_0 output shift: NONE
target: REF_TO_PIPELINE_0, source: USB_TO_DEVICE_0 output shift: NONE
target: REF_TO_PIPELINE_1, source: USB_TO_DEVICE_1 output shift: NONE

如果需要USB输出的ch0和ch1都为ASR输出,则键入指令为:

vfctrl_usb SET_IO_MAP 0 5
vfctrl_usb SET_IO_MAP 1 6

参考XVF3510-User-Guide的章节Table 4-9 I/O Mapping Destination Indexes(page 42)说明。

固件DFU更新

需要注意的是,使用vfctrl_usb工具调试的参数输入运行在XVF3510的RAM中,断电不保存,重上电恢复到默认值。如果用户经过vfctrl_usb工具调试到自身满意的参数时,需要通过生成用户自制的固件xx.dfu,进行DFU更新到P3510-2MIC板上,才能重新上电有效,参数已经得以固化了。

在windows系统上,用户需要确保pyphon 3和XMOS Control驱动已经正确安装了。可以通过,快捷键WIN+R ,输入cmd ,确认打开cmd界面,键入指令,pyphon 3已经正确安装版本的打印结果。

python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

P3510-2MIC配套的资料包中的文件XVF3510-UA Unqualified Release_4.4.0有一键操作的DFU更新用户自制的固件的文件P3510-2MIC_user_define_dfu_upgrade_cmd.bat。参考DFU升级生成DFU自制固件便可完成固件升级。