4.3.30.2. 语音休眠唤醒示例
示例功能概述
A core侧的示例,通过tinyalsa录音,使用HIFI5中间件定义的不同device节点,获取DSP侧处理的音频。 共有四个pipeline,满足原始音频、降噪后3通道唤醒音频、降噪后单通道asr音频的使用需求。
搭配A core智能语音唤醒算法,能够实现低功耗唤醒二次校验、正常功耗降噪唤醒、asr音频vad裁剪等功能。
示例源码结构
sample_wakeup目录结构如下所示:
.
├── CMakeLists.txt # 编译所需cmake文件
├── hobot_speech_x5_sdk # 算法目录
│ ├── example # 算法示例
│ ├── hrsc # 配置文件
│ ├── include # 算法头文件
│ │ └── horizonspeechsdk
│ │ └── hrsc_sdk.h
│ ├── lib # 算法库文件
│ │ ├── libhisf.so
│ │ ├── libhisfvad.so
│ │ └── libhrsc.so
│ └── ReadMe.txt
├── i2c_control.sh # 音频版配置脚本
├── include # 示例头文件
│ ├── HrscAudioRecorder.h
│ └── HrscDemo.h
├── README.md
├── src # 示例源文件
│ ├── hobot_speech_device_test.cpp # 音频device测试
│ ├── HrscAudioRecorder.cpp # tinyalsa封装实现
│ ├── HrscDemo.cc # 通用函数和回调函数实现
│ ├── hrsc_sdk_demo_files.cc # 文件测试实现
│ ├── hrsc_sdk_demo_lp_to_normal.cc # 进入低功耗,语音唤醒并进入正常功耗唤醒实现
│ ├── hrsc_sdk_demo_pipeline0.cc # 原生音频送入A core,在A core处理降噪和唤醒实现
│ ├── hrsc_sdk_demo_pipeline1.cc # 低功耗asr音频获取实现(废弃)
│ ├── hrsc_sdk_demo_pipeline2.cc # 低功耗唤醒词音频获取实现,唤醒后可获取asr音频
│ └── hrsc_sdk_demo_pipeline4.cc # 正常功耗下,DSP进行降噪前处理,A core进行唤醒实现
├── x5audio_init.sh # 环境搭建脚本
└── xbuild.sh # 编译脚本
编译依赖
首先要编译SDK的bsp源码,选择相应开发板的版本。详情见环境搭建及编译说明,并刷机。
其次编译adsp的firmware,详情见快速开始。
之后在/adsp/sample_wakeup目录下运行
./xbuild.sh
即可在当面目录下打包out目录,结构如下:
.
├── adsp # firmware
├── hrsc # 算法配置文件目录
│ ├── asr_vad
│ │ ├── DGRU_ECNR.meanvar
│ │ ├── DGRU_ECNR.params
│ │ └── hisf_config.ini
│ ├── CRGRU_SUBBAND_HIOK_reset_hx_-1.meanvar
│ ├── CRGRU_SUBBAND_HIOK_reset_hx_-1.params
│ ├── hesr_conf.txt
│ ├── hisf_config_encrypt.ini
│ ├── hrsc_config.cfg # Log打印及保存、音频保存等
│ ├── libmono.so
│ ├── meanvar_prior
│ ├── mxfeats_v36_okyiko.pack
│ ├── phone_strs
│ ├── tree-out2
│ └── wakeup_graph.bin
├── hobot_speech_device_test # 音频device测试可执行文件
├── hrsc_sdk_demo_files # 音频文件离线测试可执行文件
├── hrsc_sdk_demo_lp_to_normal # 低功耗->正常功耗全通路测试可执行文件
├── hrsc_sdk_demo_pipeline0 # pipeline0语音唤醒测试可执行文件
├── hrsc_sdk_demo_pipeline1 # pipeline1语音唤醒测试可执行文件
├── hrsc_sdk_demo_pipeline2 # pipeline2语音唤醒测试可执行文件
├── hrsc_sdk_demo_pipeline4 # pipeline4语音唤醒测试可执行文件
├── i2c_control.sh # 音频版配置脚本
├── lib # 算法库
│ ├── libhisf.so
│ ├── libhisfvad.so
│ └── libhrsc.so
└── x5audio_init.sh # 环境配置脚本
语音唤醒步骤
环境配置
见环境部署
可以通过asound命令录音,即表示环境正确。
测试命令
-i:音频文件测试时,音频文件地址。
-ch:音频文件测试时,测试音频通道数的设置。当测试4通道原始音频时,ch需要设置为4。
-switch:音频保存开关,1为开,0为关。
-o:输出路径,包括switch置为1后输出的经过vad裁剪后的asr音频、唤醒词音频等。示例给出在可执行文件上级目录的log文件夹中。
-cfg:配置文件路径。
注意:测试demo无设定运行时长,需要手动Ctrl+C结束运行
# device 0测试。可选0、1、2、4,对应四个pipeline
chmod 777 hobot_speech_device_test
export LD_LIBRARY_PATH=./lib
./hobot_speech_device_test 0
chmod 777 hrsc_sdk_demo_files
export LD_LIBRARY_PATH=./lib
./hrsc_sdk_demo_files -i ./audio.pcm -o ../log -cfg ./hrsc -ch 2 -switch 1
chmod 777 hrsc_sdk_demo_pipeline0
export LD_LIBRARY_PATH=./lib
./hrsc_sdk_demo_pipeline0 -o ../log -cfg ./hrsc -switch 1
chmod 777 hrsc_sdk_demo_pipeline1
export LD_LIBRARY_PATH=./lib
./hrsc_sdk_demo_pipeline1 -o ../log -cfg ./hrsc -switch 1
chmod 777 hrsc_sdk_demo_pipeline2
export LD_LIBRARY_PATH=./lib
./hrsc_sdk_demo_pipeline2 -o /mnt/log -cfg ./hrsc -switch 1
chmod 777 hrsc_sdk_demo_pipeline4
export LD_LIBRARY_PATH=./lib
./hrsc_sdk_demo_pipeline4 -o ../log -cfg ./hrsc -switch 1
chmod 777 hrsc_sdk_demo_lp_to_normal
export LD_LIBRARY_PATH=./lib
./hrsc_sdk_demo_lp_to_normal -o ../log -cfg ./hrsc -switch 1
hobot_speech_device_test为音频device测试程序,将指定的device音频进行录音,并保存到同级目录。录音测试使用。
hrsc_sdk_demo_files为离线音频测试程序,将指定的音频作为输入源,对算法准确性进行验证。
hrsc_sdk_demo_pipeline0为纯A core算法验证程序,从i2s获取原始3+1音频到A core,在A core进行降噪前处理和语音唤醒算法。
hrsc_sdk_demo_pipeline1为dsp端低功耗算法输出的单通道asr音频测试程序。将此音频录音到A core后,进行vad裁剪。
hrsc_sdk_demo_pipeline2为dsp端低功耗算法输出的双通道enhance唤醒词音频,音频的前2秒中包含低功耗唤醒的唤醒词音频。用以二级唤醒校验。
hrsc_sdk_demo_pipeline4为dsp端正常功耗算法输出的四通道音频测试程序,前三通道为enhance唤醒词音频,用以3麦语音识别算法,第四通道为asr音频,给vad进行裁剪,保存到本地。
hrsc_sdk_demo_lp_to_normal为正常业务通路测试。A core进入litesleep状态,进行在dsp侧进行一级唤醒。唤醒后的唤醒词音频通过pipeline2传给A core做二级校验。校验成功后获取单通道ASR音频进行vad裁剪,并保存到本地(业务上,可能为送到云端或端侧ASR引擎进行语音识别)。当前ASR音频是复用pipeline2第二通道,以节省带宽和存储空间。
算法调试说明
在sample_wakeup/hobot_speech_x5_sdk/hrsc/hrsc_config.cfg文件中,修改如下参数可进行log保存和音频保存。
以下为一个示例,保存log和音频文件,到可执行目录上层目录同级的log目录下:
[HRSC_CONFIG]
# HRSC SDK CONFIG FILE
[LOG]
LOG_LEVEL=2 # log等级,1:debug,2:info,3:warning,4:error,一般建议3
SAVE_LOG_PATH="/mnt/log/log.txt" # log保存路径,绝对路径
SAVE_LOG_FLAG=1 # log保存开关,1为开,0为关
[DATA]
# save data mode, 0 is new mode, 1 is previous mode
SAVE_DATA_MODE=0 # 音频保存模式,无需修改
# switch flag 1
SAVE_DATA_FLAG1="./hobot_speech_device_test" # 任意存在的文件的路径,例如可执行文件的路径,包含文件名
# file name 1
SAVE_DATA_PATH1="../log" # 音频保存路径,绝对路径或者可执行文件的相对路径
# switch flag 2
SAVE_DATA_FLAG2=""
# file name 2
SAVE_DATA_PATH2=""
# valid if only SAVE_DATA_MODE is 1
SAVE_AUDIO_FLAG=""
# valid if only SAVE_DATA_MODE is 1
SAVE_AUDIO_PATH=""
# limit file size, support G,M,K, default K
PER_FILE_LIMIT_SIZE=0K
[ASR]
SAVE_ASR_FLAG=""
SAVE_ASR_PATH=""
[CPU]
CPU_THRESHOLD_FREQ="1008000"
[TCP TEST]
TCP_TEST_FLAG=0
TEST_IP=""
TEST_PORT=""
[WAKERESULT]
SAVE_WAKE_RESULT_FLAG=0
SAVE_WAKE_RESULT_PATH=""
[THREAD_ID]
THREAD_ID_FILE=""
[AUTH]
ACTIVATE_DEVICE_SN=""
AUTH_PATH="/data/"
AUTH_CHECK_TIME=5
[VERSION]
VERSION="x5-0.0.5" # 算法版本号
运行结果展示
测试pipeline4,且log_level为3结果如图所示:

log及音频保存如图所示:

wkp_x.pcm和asr_x.pcm分别为单通道唤醒词音频和裁剪后的ASR音频,x数字代表第几次唤醒。
hrsc_asr.pcm是保存的单通道asr音频。
hrsc_enhance.pcm是三通道降噪后音频,用以语音唤醒。
hrsc_raw.pcm是四通道音频,根据输入的音频不同,内容会有所差异,为送入算法的所有音频的集合,不满四通道的音频会补充到四通道。例如,送入单通道ASR音频,则raw文件的第一通道是送入的单通道音频数据,后三通道补0。
hrsc_vad.vadvad标识,0和1,算法效果调试使用。
log_xxx.txtlog.txt为log保存配置设置的文件名,xxx为系统时间戳。
process.pcm音频为处理音频,即送入算法处理的源音频。