GEC6818科大讯飞离线语音识别

news2024/11/26 20:36:34

GEC6818科大讯飞离线语音识别

文章目录

  • GEC6818科大讯飞离线语音识别
    • 一、 下载科大讯飞离线语音SDK
    • 二、 解压文件夹后
    • 三、与GEC6818开发板一起使用
      • 3.1 使用科大讯飞的离线语音在ubantu中运行,作为服务端进行关键字的识别
      • 3.2 call.bnf-->hehe.bnf
      • 3.3 asr_offine_sample.c文件修改

一、 下载科大讯飞离线语音SDK

在下载SDK时需要注意选择Linux的版本!!

在这里插入图片描述

在官网下载离线语音的包,解压后可以得到下面的一些文件夹:

在这里插入图片描述

二、 解压文件夹后

解压后你需要知道自己命令放在下面的文件夹中
在这里插入图片描述

关于Make file文件:
在这里插入图片描述

关于asr_offline_sample.c文件:
在这里插入图片描述

asr_offline_sample.c文件是我们更改为自己的逻辑的文件,但是也不需要都了解清楚只要会改就行。

更改完asr_offline_sample.c文件后,在ubantu里面运行makefile文件后会有一些警告,这些都是定义的问题,可以不用管,但是在./asr_offline_sample运行的时候会报错找不到库,所以我们需要将资料包里面文件复制到lib目录下,具体如下:
需要移动的文件:
在这里插入图片描述

执行命令:

cp ./libmsc.so /lib

注意前面的`./libmsc.so`是相对路径,可以根据自己的当前路径进行更改,后面是移动到根目录下的lib目录下。

然后再执行就不会报错了。

三、与GEC6818开发板一起使用

3.1 使用科大讯飞的离线语音在ubantu中运行,作为服务端进行关键字的识别

需要更改的重要的两个文件就是bin/call.bnfsamples/asr_offine_sample/asr_offine_sample.c.这两个文件,第一个文件是修改我们需要识别的字眼,第二个文件是C 语言代码,可以在官方的基础上修改为自己所需要的逻辑

3.2 call.bnf–>hehe.bnf

我自己将官方自带的call.bnf复制了一份修改名字为hehe.bnf,在新的基础上进行的修改,更改了这个文件后,需要在后面的例程中的.c文件中修改这个文件。

例如:
在这里插入图片描述

注意我们这里使用对应的ID是非常重要的,因为我后后续进行语音识别后就是根据这个ID来判断识别到的内容,然后在执行相应的操作。

3.3 asr_offine_sample.c文件修改

上面有提到过的修改了离线语法文件后在.c文件中也需要修改相应的文件名
在这里插入图片描述

修改后的代码–当然也可以不用这样大幅度的修改,只是将官方的代码进行了规整。

//服务器
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "asr_offline_sample.h" //科大讯飞


//全局的套接字
int sockfd = -1;


//将套接字创建好  并且绑定 监听
//将ip地址和端口号传进来 端口号释放需要时间(轮询机制)
void TcpInit(const char * ipaddr,unsigned short port)
{
    //1 创建套接字 ---- 神马都是文件,因此你的网络通信也是一个文件
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("server socket error");
        exit(1);//没有必要运行了
    }
    //2 我们需要将服务器的IP地址绑定到套接字
    struct sockaddr_in sa;
    sa.sin_family = AF_INET;//协议族
    sa.sin_port = htons(port);//端口号  内存是小端的 我们要转大端
    sa.sin_addr.s_addr = inet_addr(ipaddr);//将我们点分式的ip地址转换为一个大端整数
    //printf("ipaddr = %x port = %x\n",inet_addr(ipaddr),htons(port));
    int r = bind(sockfd,(struct sockaddr *)&sa,sizeof(sa));
    if(-1 == r)
    {
        perror("server bind error");
        exit(2);//没有必要运行了
    }

    //3 监听连接 ---- 创建一个监听队列   建立5个10个可以了
    listen(sockfd,5);

}

//接收客户端发过来的文件内容
void SaveFile(int accceptfd,int filesize)
{
 //每一次都是重复的覆盖hehe.pcm
 int fd = open("wav/hehe.pcm",O_RDWR | O_TRUNC|O_CREAT,0644);//截短这个文件
 if(-1 == fd)
 {
  send(accceptfd,"error!!!",9,0);//失败发送这个错误
  return;
 }
 send(accceptfd,"next!!!!",9,0);//发送下一步的指令
 unsigned char buf[1024] = {0};
 int size = 0;
 //接收文件的内容
 while(1)  
 {
  int r = recv(accceptfd,buf,1024,0);
  if(-1 == r)
        {
            perror("recv error");
            break;
        }
        else if(0 == r)//客户端已经断了
        {
            printf("对方断开连接了\n");
            break;
        }
        else//接收到信息了
        {
            //将文件的内容写入到文件
   write(fd,buf,r);
   //做完之后要退出
   size += r;
   if(size >= filesize)
    break;
   
        }
 }
 
 
 
 
 close(fd);
}


//专门用于去服务一个客户的线程
void * ClinetFunction(void * arg)
{
    
    pthread_detach(pthread_self());//将其分离

    int * accceptfd = (int *)arg;
    printf(" * accceptfd = %d\n", * accceptfd);
 int filesize = 0;
    //你发什么信息过来  我就在这个信息之前加上一节 然后回发给你
    while(1)
    {
  printf("\t\t等待客户端传文件过来........\n");
        int r = recv(*accceptfd,&filesize,4,0);//阻塞等待数据过来
        if(-1 == r)
        {
            perror("recv error");
            break;
        }
        else if(0 == r)//客户端已经断了
        {
            printf("对方断开连接了\n");
            break;
        }
        else//接收到信息了
        {
            //文件大小
   
   SaveFile(* accceptfd,filesize);
   
   int id = GetFlayId();//文件接收完毕  那么我们就放过去识别即可
   //给客户端返回id
   send(* accceptfd,&id,4,0);
            
        }
    }
    close(*accceptfd);
    free(accceptfd);
 return NULL;
}

//等待客户端的连接 
void waitconnect(void)
{
    //我们要基于这个连接套接字去通信
    struct sockaddr_in sa;
    socklen_t addrlen = sizeof(sa);
    while(1)
    {
        printf("一直等待对方的连接.......\n");
        int * accceptfd = malloc(4);//避免释放 因此我们要动态内存分配才可以
        *accceptfd = accept(sockfd,(struct sockaddr *)&sa,&addrlen);
        printf("连接者为:%s %d\n",inet_ntoa(sa.sin_addr),ntohs(sa.sin_port));
        //开一个线程出去  让它去服务与我的连接
        pthread_t thread;
        if(pthread_create(&thread,NULL,ClinetFunction,(void *)accceptfd) != 0)
        {
            perror("create thread error");
            continue;
        }
    }
    
    close(sockfd);
}

//通过main函数的参数 我们将这个ip地址和端口给进去
//./a.out 192.168.31.251 8888
int main(int argc,char * argv[])
{
    if(argc < 3)
    {
        printf("参数都不齐\n");
        return -1;
    }
 
 //初始化科大讯飞的库
 FlayInit();
 
 
    TcpInit(argv[1],atoi(argv[2]));

    waitconnect();

    return 0;
}

完整的工程大家可以在我的gitee上进行下载
下载地址:GEC6818智能语音家居系统

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

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

相关文章

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…

什么是软件安全性测试?如何进行安全测试?

一、什么是软件安全性测试&#xff1f; 软件安全性测试是指对软件系统中的安全漏洞进行检测和评估的过程。其目的是为了确保软件系统在面对各种安全威胁时能够保持其功能的完整性、可用性和机密性。 二、软件安全性测试可以通过以下几个步骤来进行&#xff1a; 1. 需求分析&a…

强化学习8——在冰壶环境中使用策略迭代和价值迭代算法

冰壶环境 环境介绍 OpenAI Gym库中包含了很多有名的环境&#xff0c;冰湖是 OpenAI Gym 库中的一个环境&#xff0c;和悬崖漫步环境相似&#xff0c;大小为44的网格&#xff0c;每个网格是一个状态&#xff0c;智能体起点状态S在左上角&#xff0c;目标状G态在右下角&#xf…

计算机毕业设计----SSM BBS论坛

项目介绍 本项目包含前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,删除或者编辑用户的帖子,后台管理,友情链接管理,用户管理,版块管理,网站设置,用户设置,版块主题管理等功能。 用户角色…

fpmarkets盘点成功交易者的十个习惯(一)

在交易中能够盈利一次&#xff0c;fpmarkets认为这种情况100%的交易者都会做到&#xff0c;但是要做到每次交易都能盈利&#xff0c;即使是巴菲特也做到&#xff0c;我们只需要做到整体盈利就可以了&#xff0c;那么如何做到呢&#xff1f;今天fpmarkets就总结一下成功交易者的…

斑马斑马跳

欢迎来到程序小院 斑马斑马跳 玩法&#xff1a;行走的斑马&#xff0c;点击鼠标左键斑马左右跳动&#xff0c;左右两侧有大树&#xff0c;和移动的小鸟&#xff0c; 撞到大树和小鸟游戏结束&#xff0c;统计分数&#xff0c;快去斑马跳吧^^。开始游戏https://www.ormcc.com/pl…

2024农历新年是什么时候?电脑如何设置农历新年提醒

元旦的钟声已经远去&#xff0c;2024年的阳历新年就这样悄无声息地开始了。但对于我们很多人来说&#xff0c;真正的“过年”氛围&#xff0c;还得等到农历新年的到来。那么&#xff0c;今年的农历新年究竟是什么时候呢&#xff1f;答案是2月10日。 每当想到农历新年&#xff…

浅析进程优先级(上)

什么是进程优先级&#xff1f; 进程优先级&#xff1a;将处理器资源分配给进程的先后顺序 Linux 中每个进程都有相应的优先级 (优先级可能动态改变) 进程优先级决定进程 何时执行 和 获得处理器的时间 进程优先级通常表现为一个整数值 (数值大小决定优先级高低) Linux 中的…

寻找两个相交链表的相交节点

分析&#xff1a; 如图所示&#xff0c; A 长度为mkB长度为nk张三&#xff0c;李四两人分别从A和B的起始点相同速度出发&#xff0c;无论谁到达终点时&#xff0c;都从另一条队列的起点再次出发。假定起始&#xff0c;张三沿着A走&#xff0c;李四沿着B走。当李四到达终点后&a…

计算机毕业设计选题分享-node.js旅游景点分享网站03796(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

node.js旅游景点分享网站 摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。旅游景点分享网站设计&#xff0c;主要的模块包括查看后台首页、轮播图&#xff08;轮播图管理&#xff09;、网站公告…

list-watch和节点亲和性和node亲和性

k8s的集群调度 scheduler:负责调度资源&#xff0c;把pod调度到node节点 预算策略 优先策略 1、list-watch k8s集群当中&#xff0c;通过list-watch的机制进行每个组件的协作&#xff0c;保持数据同步&#xff0c;每个组件之间解耦 kubectl配置文件&#xff0c;向APIserv…

城堡世界定制

城堡世界是一款移动应用程序&#xff0c;通常在手机上使用。 该游戏的主要功能丰富多样&#xff0c;用户可以通过购买不同的城堡卡来开启自己的城堡&#xff0c;这不仅可以满足玩家对个性化的追求&#xff0c;还可以让玩家在游戏中获得更多的乐趣。 作为一家专注于互联网领域的…

Linux进程通信——system V进程间通信

目录 system V共享内存 共享内存的原理 共享内存的建立与释放 共享内存的创建 shmget 共享内存的释放 shmctl 共享内存的关联 shmat 共享内存的去关联 shmdt 用共享内存实现serve和client的简单通信 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的…

分治法:分而治之

排序算法中的快速排序&#xff0c;归并排序都用了分治思想 题目描述&#xff1a; 题目地址&#xff1a;LeetCode 50 数组中的第K个最大元素 题目描述&#xff1a; 题目地址&#xff1a;LeetCode 215

基于ssm的高校智能培训管理系统分析与设计论文

摘 要 如今的年代&#xff0c;已经是步入信息社会了&#xff0c;不仅信息更新速度频繁&#xff0c;信息量也大&#xff0c;在信息时代必须有相应的处理信息的方法&#xff0c;如果还采用以前的结绳记事或者笔写纸记&#xff0c;不仅是信息录入效率上赶不上节奏&#xff0c;在信…

Superset二次开发之提高Charts下载图片分辨率

需求:图片变高清 现状:Charts下载图片功能,下载的图片分辨率太差,用户体验不友好 源码分析 路径1:superset-frontend/src/dashboard/components/SliceHeaderControls/index.tsx接口1:DOWNLOAD_AS_IMAGE路径2:superset-frontend/src/utils/downloadAsImage.ts接口2:d…

VmWare虚拟机的安装

VmWare官方最新版下载地址 vmware官方下载地址 安装流程 安装成功验证 安装完成之后&#xff0c;打开网络中心&#xff0c;一定要确认这里多出两个网络连接&#xff0c;才证明Vmware已经安装成功

静态网页设计——千姿百色旅游网(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1oe411m7kH/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.co…

编码数据集生成框架 UnitGen 0.4.0:代码文档生成、测试代码生成

UnitGen 是我们从 UnitEval 拆分出来的代码数据集生成项目&#xff0c;旨在为基于开源模型供的私有化部署提供更好的编码数据集。 在结合开源模型 AutoDev 插件之后&#xff0c;你可以使用 UnitGen 结合企业内部现有的代码生成微调数据集&#xff0c;以让模型生成的代码更适合…

【大数据进阶第三阶段之Hive学习笔记】Hive安装

目录 1、环境准备 2、下载安装 3、配置环境变量 4、配置文件 4.1、配置hive-env.sh ​编辑4.2、配置hive-site.xml 5、上传配置jar 6、启动 1、环境准备 安装hadoop 以及 zookeeper、mysql 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 《z…