4.3.29.1. HIFI5用户指南

概述

HiFi 子系统一个用于语音控制/音频处理以及 DDR 动态频率缩放子系统。该子系统集成了 HiFi5 DSP 和多个外设,例如 I2S、PDM 和 SPI。音频系统集成一些其他外设,例如定时器、I2C 和 UART。 HiFi5 DSP 处理器用于处理语音音频数据。

基础系统采用xos,驱动提供独立API,配合中间件进行开发。中间件包含语音处理系统管理部分,前者采用SSF路由软件框架,后者包含时间同步、看门狗、性能监控工具包等。应用层语音处理,可以自定义处理节点,插入现有的pipeline中,也可以直接给予xos/驱动接口进行嵌入式开发,开发自己线程处理函数中断回调等。

说明:本章涉及是 DSP 侧固件二次开发,需要获取 adsp 源码授权(未授权在 BSP 的 platform_source_code 中不到 adsp 目录)。若仅体验「ARM 侧通过 IPC 调用 DSP 算法」的完整流程,使用镜像预置固件即可,无需授权,参见 sample_dsp 使用说明

硬件架构

HIFI_HW

软件架构

Software_architecture_diagram

关键词说明:

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定义如下所示。要注意以下两点:

  1. pipeline3链路不会数据送给alsa,如果使用arecord命令测试,alsa框架在10s无数据触发超时用户空间返回异常。

  2. pipeline2链路数据依赖history buffer送出来数据,单独启动pipeline2不会控制配置i2s驱动,alsa框架10s后触发超时用户空间返回异常。

pipeline

关于pipeline详细功能介绍、A core语音唤醒以及低功耗休眠唤醒相关介绍,请参阅语音休眠唤醒示例

手动环境部署

  1. 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
    
  2. 设置firmware名称。用户根据实际fw名称加载fw之前进行调整

    echo <adsp> > /sys/class/remoteproc/remoteproc0/firmware
    

    注意:<>尖括号需要附加,<>中间内容/usr/hobot/lib/firmware路径需要加载固件文件名。

  3. 加载firmware

    echo start > /sys/class/remoteproc/remoteproc0/state
    //测试...
    
  4. 卸载firmware

    echo stop > /sys/class/remoteproc/remoteproc0/state