# 语音休眠唤醒示例

## 示例功能概述

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`源码，选择相应开发板的版本。详情见[环境搭建及编译说明](../../bsp_develop.html)，并刷机。  

其次编译`adsp`的`firmware`，详情见[快速开始](./hifi5_01_user_guide.html#span-id-quick-start)。  

之后在`/adsp/sample_wakeup`目录下运行

```bash
./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                                 # 环境配置脚本
```

## 语音唤醒步骤

### 环境配置

见[环境部署](hifi5_01_user_guide.html#环境部署)

可以通过asound命令录音，即表示环境正确。

### 测试命令

`-i`：音频文件测试时，音频文件地址。

`-ch`：音频文件测试时，测试音频通道数的设置。当测试4通道原始音频时，ch需要设置为4。

`-switch`：音频保存开关，1为开，0为关。

`-o`：输出路径，包括`switch`置为1后输出的经过vad裁剪后的asr音频、唤醒词音频等。示例给出在可执行文件上级目录的log文件夹中。

`-cfg`：配置文件路径。

**注意：测试demo无设定运行时长，需要手动Ctrl+C结束运行**

```bash
# 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结果如图所示：

![Test_result](./_static/_images/Test_result.png)

log及音频保存如图所示：

![log_save](./_static/_images/log_save.png)

`wkp_x.pcm`和`asr_x.pcm`分别为单通道唤醒词音频和裁剪后的ASR音频，`x`数字代表第几次唤醒。

`hrsc_asr.pcm`是保存的单通道asr音频。

`hrsc_enhance.pcm`是三通道降噪后音频，用以语音唤醒。

`hrsc_raw.pcm`是四通道音频，根据输入的音频不同，内容会有所差异，为送入算法的所有音频的集合，不满四通道的音频会补充到四通道。例如，送入单通道ASR音频，则raw文件的第一通道是送入的单通道音频数据，后三通道补0。

`hrsc_vad.vad`vad标识，0和1，算法效果调试使用。

`log_xxx.txt`log.txt为log保存配置设置的文件名，xxx为系统时间戳。

`process.pcm`音频为处理音频，即送入算法处理的源音频。