目录
2.将bin中的resource文件夹提出,提出linuxrec
一、总体介绍
用到的技术:科大讯飞的语音唤醒
操作系统:ubuntu16.04(Linux)
二、来到讯飞开放平台
下载语音唤醒的SDK包,解压
_MACOSX是一个隐藏的文件夹名称,它通常出现在Mac电脑上的压缩文件中。这个文件夹实际上是用来存放压缩文件在Mac系统上解压后生成的额外元数据和资源文件的。
三、代码修改
1.ivw_sample.cpp代码修改
(1)库的导入
(2)宏定义
代码解析
{
WAVE_FORMAT_PCM, // PCM编码格式
1, // 单声道
16000, // 采样率为16kHz
32000, // 每秒传输数据量为32KB
2, // 数据块对齐值(等于通道数×每个样本占用的字节数)
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 音频驱动支持。