简单学习语音唤醒

目录

一、总体介绍

二、来到讯飞开放平台

​三、代码修改

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.查看唤醒效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/496747.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MWC 2024丨美格智能推出5G RedCap系列FWA解决方案,开启5G轻量化新天地

2月27日,在MWC 2024世界移动通信大会上,美格智能正式推出5G RedCap系列FWA解决方案。此系列解决方案具有低功耗、低成本等优势,可以显著降低5G应用复杂度,快速实现5G网络接入,提升FWA部署的经济效益。 RedCap技术带来了…

BOOT电路

本质:BOOT电路本质上是单片机的引脚 作用:BOOT电路的作用是用于确定单片机的启动模式 使用方法:在单片机上电或者复位时给BOOT管脚设置为指定电平即可将单片机设置为指定启动模式。 原理:单片机上电或复位后会先启动内部晶振&a…

202434读书笔记|《繁星·春水》——残花缀在繁枝上,鸟儿飞去了,撒得落红满地,生命也是这般的一瞥么?

202434读书笔记|《繁星春水》——残花缀在繁枝上,鸟儿飞去了,撒得落红满地,生命也是这般的一瞥么? 繁星春水 《繁星春水》冰心著,共300多首小诗,并不是惊艳,就那么平凡而朴实的看完了。 繁星 黑…

QT C++实战:实现用户登录页面及多个界面跳转

主要思路 一个登录界面,以管理员Or普通用户登录管理员:一个管理员的操作界面,可以把数据录入到数据库中。有返回登陆按钮,可以选择重新登陆(管理员Or普通用户普通用户:一个主界面,负责展示视频…

如何使用chartGPT——提问词MarkDown

一.如何使用chartGPT GPT 生成的答案质量,完全取决于你『问它』,以及『引导它』的方式,如果你能问得好,引导的好,那么它就会帮你生成让你惊喜的答案,反之则无价值,假大空 打造场景库&#xff…

python微信小程序uniapp+vue校园勤工俭学助学平台springboot/php/nodejs

系统功能设计是在系统开发和设计思想的总体任务的基础上完成的。该系统的主要任务是实现校园勤工助学平台管理,使学生可以通过指令完成整个校园勤工助学平台的操作。 从上面的描述中可以基本可以实现软件的功能: 1、开发实现校园勤工助学平台的整个系统…

数据分析案例-社交媒体情绪数据集可视化分析(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【vue】什么是虚拟Dom,怎么实现虚拟DOM,虚拟DOM一定更快吗

什么是虚拟Dom 虚拟 DOM 基于虚拟节点 VNode,VNode 本质上是一个对象,VDOM 就是VNode 组成的 废话,js 中所有的东西都是对象 虚拟DOM 为什么快,做了哪些优化 批量更新 多个DOM合并更新减少浏览器的重排和重绘局部更新 通过新VDO…

猫头虎分享已解决Bug || 依赖问题:DependencyNotFoundException: Module ‘xyz‘ was not found 问题

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

MATLAB_ESP32有限脉冲响应FIR无限脉冲响应IIR滤波器

要点 ESP32闪烁LED,计时LEDESP32基础控制:温控输出串口监控,LCD事件计数器,SD卡读写,扫描WiFi网络,手机控制LED,经典蓝牙、数字麦克风捕捉音频、使用放大器和喇叭、播放SD卡和闪存MP3文件、立体…

pdf怎么合并在一起?

pdf怎么合并在一起?在日常工作和学习中,我们常常需要处理大量的PDF文件。有时候,我们可能希望将多个PDF文件合并成一个文件,以便于管理和分享。这时候,PDF文件合并工具就能派上用场了。PDF文件合并是一种将多个PDF文件…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的活体人脸检测系统(Python+PySide6界面+训练代码)

摘要:本篇博客详细讲述了如何利用深度学习构建一个活体人脸检测系统,并且提供了完整的实现代码。该系统基于强大的YOLOv8算法,并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比,展示了其在图像、视频、实时视频流和批量文件处…