目录
一、总体介绍
二、来到讯飞开放平台
三、代码修改
1.ivw_sample.cpp代码修改
(1)库的导入
(2)宏定义编辑
(3)定义
(4)修改OnOutput编辑
(5)添加一个读取录音的函数
(6)修改ivwIns函数
修改
添加代码
2.将bin中的resource文件夹提出,提出linuxrec
3.修改build.sh
4.编译build.sh文件,生成可以执行的demo。
5.查看唤醒效果
一、总体介绍
用到的技术:科大讯飞的语音唤醒
操作系统:ubuntu16.04(Linux)
二、来到讯飞开放平台

下载语音唤醒的SDK包,解压

_MACOSX是一个隐藏的文件夹名称,它通常出现在Mac电脑上的压缩文件中。这个文件夹实际上是用来存放压缩文件在Mac系统上解压后生成的额外元数据和资源文件的。
三、代码修改
1.ivw_sample.cpp代码修改
(1)库的导入

(2)宏定义
代码解析
{WAVE_FORMAT_PCM, // PCM编码格式1, // 单声道16000, // 采样率为16kHz32000, // 每秒传输数据量为32KB2, // 数据块对齐值(等于通道数×每个样本占用的字节数)16, // 每个样本占用的位数sizeof(WAVEFORMATEX) // 结构体大小,单位:字节
}
#define DEFAULT_FORMAT ...:定义了一个名为DEFAULT_FORMAT的宏,展开后得到一个结构体,用于描述音频数据的默认格式信息。
#define E_SR_NOACTIVEDEVICE 1:将E_SR_NOACTIVEDEVICE定义为常量1,表示没有活动音频设备。
#define E_SR_NOMEM 2:将E_SR_NOMEM定义为常量2,表示内存不足。
#define E_SR_INVAL 3:将E_SR_INVAL定义为常量3,表示无效的参数。
#define E_SR_RECORDFAIL 4:将E_SR_RECORDFAIL定义为常量4,表示录音失败。
#define E_SR_ALREADY 5:将E_SR_ALREADY定义为常量5,表示已经在录音。
(3)定义

recorder是一个指向 recorder 结构体的指针,用于处理录音相关功能的结构体,包含了与录音相关的变量和函数指针。
sleep_ms用于延时
(4)修改OnOutput
添加代码
string temp = (char *)output->node->value;if( temp.find("你好小迪") != string::npos){printf("----触发你好小迪,拦截----\n");return;}
代码分析
temp.find("你好小迪") != string::npos 是一个条件语句,用于判断字符串 temp 是否包含子串 "你好小迪"。
temp.find("你好小迪") 表示在字符串 temp 中查找子串 "你好小迪" 的位置,如果找到了,则返回该子串在 temp 中的起始位置;否则,返回 string::npos,表示没有找到该子串。
因此,当 temp 中包含子串 "你好小迪" 时,表达式 temp.find("你好小迪") != string::npos 的值为真(True);否则,表达式的值为假(False)。
在这段代码中,该条件语句用于判断是否需要拦截 AIKIT 引擎响应的结果。如果检测到输入的内容是 "你好小迪",则会触发拦截的操作,不再进行后续的处理。
(5)添加一个读取录音的函数

代码分析
这段代码是一个回调函数 iat_cb,用于读取录音内容并将其传递给创建录音的函数 create_recorder。
在该回调函数中,首先判断传入的参数 dataBuf 是否为空指针,并且判断长度 len 是否为0。如果是,则直接返回,不进行后续处理。
接下来,通过调用 AIKIT_DataBuilder::create() 创建一个数据构造器 dataBuilder,然后使用 AiAudio::get("wav")->data(dataBuf,len)->valid() 将音频数据 dataBuf 加载到构造器中,并设置音频数据类型为 WAV 格式。
通过 dataBuilder->payload(wavData) 将构造器的内容设置为音频数据。
调用 AIKIT_Write(handle,AIKIT_Builder::build(dataBuilder)) 将数据构造器的内容通过 AIKIT 引擎的写入接口写入,传递给创建录音的函数 create_recorder 进行处理。
(6)修改ivwIns函数

代码分析
AIKIT_ParamBuilder 类用于构建在启动 AIKIT 引擎时需要的参数,例如唤醒词检测的阈值、语音识别模型的路径等。通过创建 AIKIT_ParamBuilder 对象,可以向其中添加不同的参数,并使用 AIKIT_Builder::build 函数将其构建为可用于启动 AIKIT 引擎的参数对象。
AIKIT_HANDLE 类则是对 AIKIT 引擎运行状态的封装。通过调用 AIKIT_Start 函数启动 AIKIT 引擎时,会返回一个 AIKIT_HANDLE 指针,用于表示引擎的运行状态。然后,可以通过该指针调用其他 AIKIT 相关函数,如 AIKIT_Write 函数将音频数据传输给 AIKIT 引擎进行处理,或者 AIKIT_End 函数结束 AIKIT 引擎的运行。
创建了一个参数构造器 paramBuilder,然后根据默认音频格式 DEFAULT_FORMAT 设置了 WAV 文件的采样率为 16kHz。接着通过调用 AIKIT_LoadData 函数加载了一个自定义的唤醒词列表文件 ./resource/keyword-nhxd.txt,并将其命名为 "key_word" 并分配给了索引数组的第一个元素。
修改



添加代码



(7)添加 TestIVW函数

(7)main函数

2.将bin中的resource文件夹提出,提出linuxrec

3.修改build.sh

gcc -c linuxrec.c 命令用于编译 linuxrec.c 源文件,并生成相应的目标文件 linuxrec.o。选项 -c 表示只进行编译而不进行链接,生成的是目标文件而非可执行文件。

接着,g++ -g -std=c++11 -o ivw_demo ivw_demo.cpp linuxrec.o -L./libs/ -laikit -lpthread -ldl -Wl,-rpath=lib -lasound 命令用于编译 ivw_demo.cpp 源文件和 linuxrec.o 目标文件,并链接库文件以生成可执行文件 ivw_demo。选项 -o ivw_demo 表示指定输出文件名为 ivw_demo。
参数分析:
-g:生成调试信息。-std=c++11:使用 C++11 标准进行编译。-L./libs/:指定库文件搜索路径为当前目录下的libs子目录。-laikit:链接名为aikit的库文件。-lpthread:链接名为pthread的库文件。-ldl:链接名为dl的库文件。-Wl,-rpath=lib:指定运行时库搜索路径为当前目录下的lib子目录。-lasound:链接名为asound的库文件,用于提供 ALSA 音频驱动支持。
4.编译build.sh文件,生成可以执行的demo。
5.查看唤醒效果
