Linux语音控制 项目

本文详细介绍了如何在Linux ARM平台上基于科大讯飞语音识别平台开发一个语音控制系统。项目涉及Linux(如Ubuntu 14.04)与ARM A8架构的硬件配合,实现了语音搜索图片、音乐、拍照、语音交互等功能。通过socket通信,客户端录制音频并通过网络发送到服务端,服务端进行语音识别。同时,文章还分享了解决音频传输、语音识别错误等问题的经验,以及科大讯飞离线语音识别SDK的编译和使用方法。
摘要由CSDN通过智能技术生成

本人是基于粤嵌的GEC210和ubuntu14.04开发的,源代码过长,需要的可以去这里下载:

https://download.csdn.net/download/weixin_42116930/10807763

语音交互平台框架:

平台:Linux+armA8+科大讯飞语音识别平台

功能:

1、通过文件检索可以将固定的目录下的三种类型的图片和音乐给检索出来,然后再利用libjpeg库和libpng库来对jpeg图片和png图片进行解码,

再通过直接操作framebuffer来将图片显示在LCD屏上,还可以使用触摸屏来切换图片。而播放音乐就要移植madplay库并使用当中的命令来播放音乐,

也可以使用触摸屏来切换音乐。

2、拍照功能,利用V4L2来实现采集一帧的图像并把它显示在LCD屏上。

3、语言交互功能,首先在客户端实现录音功能,并将录制的音频数据通过socket传输到服务端中,服务端就先进行语法构建然后再进行语法识别,

最后将识别的结果保存在xml文件中,再通过socket将xml文件传输到客户端中,客户端再对这个文件进行解析,并得到识别的id号,

然后再根据id进行相应的操作,如操作上述两个功能。

遇到问题的解决方法:通过debug来调试和上网查找一些资料来分析。

 

流程图:

打开LCD屏

刷屏刷成白色

眨眼

socket初始化

摄像头初始化

while循环里

触摸

进行语音识别

根据语音识别做出相关操作

退出循环

关闭LCD

 

 

客户端:

开机先显示几幅BMP图片,然后建立SOCKET连接,之后调用system函数来开始录音,并将录音好的音频保存为cmd.pcm文件,

向服务器发送我们录好的音频文件cmd.pcm(因为在Linux系统中,一切皆是文件,所以在发送函数里我们是用open打开cmd.pcm文件,

然后读取该文件数据,并将数据保存在我们申请的动态内存中,然后再将之发送给服务端),然后等待服务端那边发送数据过来,

发送过来的是xml结果,然后再将这个数据保存在我们的本地文件中(result.xml),之后就是分析xml文件获得ID号并返回ID号。然后就在根据ID号进行一些其他的工作。

 

服务端:

先设置登录参数,然后再建立SOCKET连接,然后在while循环里先进行登录,服务端每识别一次都要先登录,识别完后要登出,

所以每次识别的时候都要重复这个过程。(因为识别完一次语音,onResult都会被占用,需要通过登出再登陆才能释放占用资源)。

然后再构建语法网络,获取语法ID。之后进行语法识别,识别完之后最后登出。

 

其中遇到的困难:

之前进行语音识别的时候识别错误,总是不能够识别,一开始我认为是我们录制的音频的问题,

因为录制的音频不能够播放出来,所以我就往这方面排查,先单独进行录制音频,然后把音频利用socket连接传输到我们的ubuntu上。

一开始录制的是wav音频,利用socket传输到ubuntu上然后使其保存在另一个音频文件,但是奇怪的是服务器虽然接收到了同样大小的数据,

但是却不能播放保存的音频文件,打开音频文件来看看,发现数据非常少,跟原版的不一样,于是发现这里有问题,通过排查,

原因是我在服务器的程序中,用数组来接收数据,这是不行的,具体原因我也不清楚,改成用动态内存来保存发送过来的数据就ok了。

于是这个问题就解决了,音频能够传输了。最后在对比下这个成功的例子,发现原来是我进行语言识别的客户端的发送的程序漏了一行代码,

就是在计算音频文件大小完的时候,忘记把指针移到一开始的地方,所以导致我们发送的数据是空,也就不能识别了。

 

语音交互平台总结:

 

1、显示图片

 

2、要让开发板能够播放音乐,首先开发板得要有声卡驱动,这个取决于内核。由于我是用九鼎制作的内核的,该内核已经有声卡驱动了,

所以不需要我们去弄。所以我们只需在开发板上安装一个播放器madplay,进行移植,具体步骤如下:

首先,我们移植madplay需要三个库文件:

madplay-0.15.2b.tar.gz

libmad-0.15.1b.tar.gz

libid3tag-0.15.1b.tar.g

下载地址为: http://sourceforge.net/project/showfiles.php?group_id=12349

下载完之后,我们开始进行移植

①:在root目录上创建一个文件夹madplayer,然后将这三个压缩文件放在这个文件夹里,然后再进行解压。如下所示:

tar -xvf madplay-0.15.2b.tar.gz

tar -xvf libmad-0.15.1b.tar.gz

tar -xvf libid3tag-0.15.1b.tar.g

 

②:解压完之后,我们先检查下自己的ubuntu里面有没有zlib库,如果没有的话就要安装下,(新手)建议都安装下(不管有没有)。

首先也是从网上找到zlib库(http://www.zlib.net/),然后也将其放置到文件夹madplayer中,解压:

tar -xvf zlib-1.2.8.tar.gz

然后进行配置:

export CC=arm-linux-gcc

./configure -shared --prefix=/opt/libdecode

(这个是我们指定安装的目录,可以自己随意指定。因为我们ubuntu中的/opt目录中是没有libcode这个文件夹的,所以我们得要先在opt目录下创建这个文件夹)

之后进行编译和安装:

make 和 make install

 

安装完之后,我们还得在ubuntu上敲如下三个命令:

export LDFLAGS="-L/opt/libdecode/lib"

export CFLAGS="-I/opt/libdecode/include"

export CPPFLAGS="-I/opt/libdecode/include"

这是用来导出环境变量的,如果我们不导出,那么等下我们在配置其他库时会出错,提示找不到这个头文件等等。

 

③:进入到libid3tag-0.15.1b.tar.g解压完之后的目录libid3tag-0.15.1b中,

然后进行配置:

./configure --host=arm-linux --enable-shared --enable-static --prefix=/opt/libdecode

配置完之后会得到一个Makefile,检查下Makefile,看看交叉编译设置是否正确(一般默认的都不是交叉编译,所以我们得在Makefile中做修改):

CC=gcc 改为 CC=arm-linux-gcc

AR=ar 改为 AR=arm-linux-ar

RANLIB=ranlib 改为  RANLIB=arm-linux-ranlib

之后进行编译和安装:

make 和 make install

 

④:进入到libmad-0.15.1b.tar.gz解压完之后的目录libmad-0.15.1b中,

然后进行配置:

./configure --host=arm-linux --enable-shared --enable-static --prefix=/opt/libdecode

配置完之后会得到一个Makefile,检查下Makefile,看看交叉编译设置是否正确(一般默认的都不是交叉编译,所以我们得在Makefile中做修改):

CC=gcc 改为 CC=arm-linux-gcc

AR=ar 改为 AR=arm-linux-ar

RANLIB=ranlib 改为  RANLIB=arm-linux-ranlib

之后进行编译和安装:

make 和 make install

 

⑤:进入到madplay-0.15.2b.tar.gz解压完之后的目录madplay-0.15.2b中,

然后进行配置:

./configure --host=arm-linux --enabl

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值