简单学习语音唤醒

目录

一、总体介绍

二、来到讯飞开放平台

​三、代码修改

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,          // 采样率为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 音频驱动支持。

4.编译build.sh文件,生成可以执行的demo。

5.查看唤醒效果

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值