4.3.30.1. HIFI5用户指南
概述
HiFi 子系统是一个用于语音控制/音频处理以及 DDR 动态频率缩放的子系统。该子系统集成了 HiFi5 DSP 和多个外设,例如 I2S、PDM 和 SPI。音频系统中还集成了一些其他外设,例如定时器、I2C 和 UART。 HiFi5 DSP 处理器可用于处理语音和音频数据。
基础系统采用xos,驱动层提供独立API,配合中间件进行开发。中间件包含语音处理和系统管理两部分,前者采用SSF路由软件框架,后者包含时间同步、看门狗、性能监控类工具包等。应用层的语音处理,可以自定义处理节点,插入到现有的pipeline中,也可以直接给予xos/驱动层接口进行嵌入式开发,开发自己的线程处理函数和中断回调等。
硬件架构

软件架构

关键词说明:
KWS(Keyword Spotting): 唤醒词识别
VAD(Voice Activity Detection):人声检测
ASR(Automatic Speech Recognition):语音识别
AGC(Automatic Gain Control):自动增益控制
NS(Noise Suppression):噪声抑制
AEC(Acoustic Echo Cancellation):自动回声消除
DOA(Direction of Arrival):声源定位
BF(Beamforming):波束成型
ASR(Automatic Speech Recognition):语音唤醒
Speech Front-End Processing :语音前端处理
Primary Wake-up 一级唤醒
Secondary Wake-up Front-end 二级唤醒前端处理
Time Sync:时间同步
Wake-up Scheme : 唤醒方案
快速开始
源码目录结构
adsp目录包含以下内容:
├── application # HIFI5中间件入口
├── bsp_project # 驱动代码
├── core_config # xos工具链相关,编译依赖
├── custom_lsp #
├── env_hf5.sh # 环境配置脚本
├── Makefile # 编译文件
├── Makefile.in # 编译配置文件
├── output # 核心输出
├── output_sdk # sdk输出
├── sample_wakeup # A core 集成示例
├── ssf # 路由中间件
└── toolchain # 编译工具链
其中示例sample_wakeup目录包含以下内容:
├── build # 编译目录
├── CMakeLists.txt # cmake编译文件
├── hobot_speech_x5_sdk # 算法SDK
├── i2c_control.sh # 音频板加载脚本
├── include # 头文件目录
├── out # 输出目录
├── README.md # 介绍
├── src # 源文件
├── x5audio_init.sh # 板端使用的环境初始化脚本
└── xbuild.sh # 编译脚本
编译
编译依赖:首先要编译SDK的bsp源码,选择相应开发板的版本。详情见环境搭建及编译说明,并刷机;需要获取adsp编译工具链并放在adsp/toolchain目录下。
在adsp目录下执行
# firmware编译
source env_hf5.sh # 选择编译的版本,输入0编译debug版本,再输入0不需编译测试用例
make clean # 清除历史数据
make application
# 进入示例目录,编译示例文件
cd sample_wakeup
./xbuild.sh
自动环境部署
Acore dts默认使能dsp_dma,系统启动加载dma controller,影响adsp firmware语音功能测试。因此在进行adsp测试时,
在uboot下通过环境变量关闭kernel dts中dsp_dma节点。
#关闭:
setenv fdt-blacklist "/soc/dsp_apb/dma-controller@32080000"
#打开:
setenv fdt-whitelist "/soc/dsp_apb/dma-controller@32080000"
#保存设置,执行
saveenv
#setenv设置后,每次刷机后单次设置后即可
boot
#进入kernel
注意:手动关闭dsp_dma节点为临时方案
sample_wakeup编译的时候会将结果输出到sample_wakeup/out目录中。
检查板端是否有读写权限,可使用
mount / -o rw,remount
命令打开读写权限。然后即可使用adb命,将整个sample_wakeup/out目录adb push到开发板的使用目录,如/mnt下后,示例目录如下所示:
sh-5.1# pwd
/mnt/out
sh-5.1# ls
adsp hrsc_sdk_demo_lp_to_normal hrsc_sdk_demo_pipeline4
hobot_speech_device_test hrsc_sdk_demo_pipeline0 i2c_control.sh
hrsc hrsc_sdk_demo_pipeline1 lib
hrsc_sdk_demo_files hrsc_sdk_demo_pipeline2 x5audio_init.sh
执行
chmod 777 x5audio_init.sh
./x5audio_init.sh
即可完成环境部署。可以提供5个pipeline录音,1个pipeline播放的功能。
可以通过以下命令进行语音录音测试。
arecord -D hw:0,0 -c 4 -f S16_LE -r 16000 ./normal_record.wav # 未经算法处理的原生音频 3mic+1ref
arecord -D hw:0,1 -c 1 -f S16_LE -r 16000 ./asr_record.wav # 单通道asr音频
arecord -D hw:0,2 -c 2 -f S16_LE -r 16000 ./history_buffer.wav # 2通道降噪后音频,用以语音唤醒
arecord -D hw:0,3 -c 4 -f S16_LE -r 16000 ./hisf_lp.wav # 4通道低功耗降噪后音频
arecord -D hw:0,4 -c 4 -f S16_LE -r 16000 ./hisf_normal.wav # 4通道经过降噪的音频,前三通道为mic降噪音频,用以唤醒,
# 第四通道为ASR音频,用以语音识别
aplay -D hw:0,0 test.wav #支持2通道48k采样率16bit位宽的音频播放
pipeline定义如下图所示。要注意以下两点:
pipeline3链路上不会将数据送给alsa,如果使用arecord命令测试,alsa框架在10s无数据后触发超时给用户空间返回异常。
pipeline2链路上数据依赖history buffer送出来的数据,单独启动pipeline2不会控制配置i2s驱动,alsa框架10s后触发超时用户空间返回异常。

关于pipeline详细功能介绍、A core语音唤醒以及低功耗休眠唤醒相关介绍,请参阅语音休眠唤醒示例。
手动环境部署
firmware默认加载路径是:/lib/firmware V1.0.12版本acore会把firmware打包到镜像中 镜像烧写默认将firmware安装在/usr/hobot/lib/firmware路径下,因此需要执行以下命令增加可查找的firmware路径:
echo -n "/usr/hobot/lib/firmware" > /sys/module/firmware_class/parameters/path
设置firmware名称。用户可根据实际fw名称在加载fw之前进行调整
echo <adsp> > /sys/class/remoteproc/remoteproc0/firmware
注意:
<>尖括号不需要附加,<>中间的内容为/usr/hobot/lib/firmware路径下需要加载的固件文件名。加载firmware
echo start > /sys/class/remoteproc/remoteproc0/state //测试...
卸载firmware
echo stop > /sys/class/remoteproc/remoteproc0/state