简单学习语音唤醒

目录

一、总体介绍

二、来到讯飞开放平台

​三、代码修改

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.mzph.cn/news/702565.shtml

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

相关文章

C++多态的原理

目录 函数虚表 多态原理 普通调用和多态调用的区别 函数虚表 含有虚函数的类&#xff0c;都会有一个函数虚表指针&#xff0c;指向函数虚表。 class Base{public:virtual void Func1(){cout << "Func1()" << endl;}private:int _b 1;}; _vfptr就是函…

如何在C++中实现文件操作

大家好&#xff0c;今天给大家介绍如何在C中实现文件操作&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在C中&#xff0c;实现文件操作主要涉及到 <fstream> 库&#xf…

批量删除传参那些事

接口参数&#xff1a; public Object batchDeleteUsers(RequestBody List userIds) 工具提示传参&#xff1a; { “userIds”: [] } 错误&#xff01;&#xff01;&#xff01;讨逆猴子 报错&#xff1a;JSON parse error: Cannot deserialize value of type java.util.ArrayL…

C++从入门到精通 第十七章(终极案例)

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

Yolov8有效涨点:YOLOv8-AM,添加多种注意力模块提高检测精度,含代码,超详细

前言 2023 年&#xff0c;Ultralytics 推出了最新版本的 YOLO 模型。注意力机制是提高模型性能最热门的方法之一。 本次介绍的是YOLOv8-AM&#xff0c;它将注意力机制融入到原始的YOLOv8架构中。具体来说&#xff0c;我们分别采用四个注意力模块&#xff1a;卷积块注意力模块…

Django定时任务之django_apscheduler使用

Django定时任务之django_apscheduler使用 今天在写一个任务需求时需要用到定时任务来做一部分数据处理与优化&#xff0c;于是在了解完现有方法&#xff0c;结合自己需求决定使用django_apscheduler&#xff0c;记录一下过程&#xff0c;有几篇值得参考的文章放在结尾&#xf…

大数据构建知识图谱:从技术到实战的完整指南

文章目录 大数据构建知识图谱&#xff1a;从技术到实战的完整指南一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图…

Java基础常见八股文学习总结1

Java基础常见八股文学习总结1 SPI SPI 即 Service Provider Interface &#xff0c;字面意思就是&#xff1a;“服务提供者的接口”&#xff0c;我的理解是&#xff1a;专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。SPI 将服务接口和具体的服务实现分离开来…

C语言中的数据结构选择与实现

大家好&#xff0c;今天给大家介绍C语言中的数据结构选择与实现&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 一、引言 在C语言中&#xff0c;数据结构是实现高效算法的关键。…

一个更好的IP工具箱MyIP

什么是 MyIP &#xff1f; MyIP 是一个完全开源的 IP 信息查看器&#xff0c;可以轻松检查你的 IP&#xff0c;IP 地理位置&#xff0c;检查 DNS 泄漏&#xff0c;检查 WebRTC 连接&#xff0c;速度测试&#xff0c;ping 测试&#xff0c;MTR 测试&#xff0c;检查网站可用性等…

docker 安装mysql8 实现互为主从

目录结构 先按照这个目录结构创建。 mysql.conf 配置&#xff0c;mysql的基础可以在此添加 mysql配置 mysql-master下conf配置 [mysqld] # 设置服务器唯一标识号 server-id1 # 启用二进制日志 log-binmaster-bin # 指定需要复制的数据库 binlog-do-dbtest_db # 指定二进制日…

软件游戏显示d3dx9_42.dll丢失的5种解决方法,快速解决dll问题

当计算机系统中d3dx9_42.dll文件丢失时&#xff0c;可能会引发一系列运行问题和功能异常&#xff0c;具体表现形式多样且影响范围较广。首先&#xff0c;对于依赖于DirectX 9.0c版本的各类应用程序&#xff0c;尤其是部分经典的老款游戏&#xff0c;由于d3dx9_42.dll是其中不可…

【Python】OpenCV-图片差异检测与标注

图片差异检测与标注 在图像处理领域中&#xff0c;检测两张图片之间的差异是一项重要的任务。本文将介绍一个使用OpenCV库进行图片差异检测的简单示例代码&#xff0c;并详细注释每个步骤。 1. 引言 图片差异检测是在两张图片之间寻找差异点或区域的过程。这项技术可用于监测…

顺序表知识点——顺序表的增删查改

目录 准备文件 创建顺序表蓝图 顺序表初始化函数接口 顺序表的销毁函数接口 顺序表的打印函数接口 顺序表的插入函数接口 顺序表的删除函数接口 从本节开始&#xff0c; 复习数据结构。 空间复杂度还有时间复杂度之后利用例题学习。 这节先学习顺序表的增删查改。 首…

并发编程基础

为什么开发中需要并发编程&#xff1f; 加快响应用户的时间使你的代码模块化、异步化、简单化充分利用CPU资源 基础概念 进程和线程 进程 我们常听说的应用程序&#xff0c;由指令和数据组成。当我们不运行应用程序时&#xff0c;这些应用程序就是放在磁盘上的二进制的代码…

【MATLAB】mlptdenoise信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 mlptdenoise分解算法 MLPT denoise&#xff08;Maximum Likelihood Parameter-Tuned Denoise&#xff09;是一种基于小波变换的信号分解算法&#xff0c;它可以将信号分解为多个具有不同频率特性的小波分…

Threejs 实现3D影像地图,Json地图,地图下钻

1.使用threejs实现3D影像地图效果&#xff0c;整体效果看起来还可以&#xff0c;底层抽象了基类&#xff0c;实现了通用&#xff0c;对任意省份&#xff0c;城市都可以只替换数据&#xff0c;即可轻松实现效果。 效果如下&#xff1a; 链接https://www.bilibili.com/video/BV1…

【人工智能高频面试题--基本篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;人工智能高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 人工智能高频面试题--基本篇 1.深度学习和过往的神经网络训练方法有什么区别&#xff1f;列举…

Panalog大数据日志审计系统libres_syn_delete.php命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1、产品简介 Panalog大数据日志审计系统定位于将大数据产品应用于高校…

【.xml文件匹配不到】⭐️解决使用mybatis-plus找不到对应的xml文件导致的持久层方法报错

前言 小伙伴们大家好&#xff0c;很快嗷&#xff0c;到了年后的第一周&#xff0c;最近在自己电脑上敲项目时遇到一个平时可能不怎么遇到的问题&#xff0c;就是mybatis持久层框架使用时找不到对应的xml配置文件&#xff0c;也就导致自己写的持久层方法报错 接口报错内容&…