概述
目录
一、语音识别模块
1、服务器模块
2、客户端模块
二、QT
1、登录界面
2、精彩视频播放器
最近学校实习做了一个智能家居项目,完成之后再次基础上自己做了一个关于csgo的项目,功能包括语音识别、登录界面、游戏精彩视频播放器、互动类视频游戏四个模块。
主要技术栈:QT、C++编程、linux网络编程、语音识别
项目演示视频:https://www.bilibili.com/video/BV1QZ4y1a7v5?share_source=copy_web
项目开源地址:https://github.com/xhcstudy/csgo
一、语音识别模块
语音识别模块采用的是科大讯飞库,能够识别到你说的话并将内容转化为id传入,根据id执行对应操作。
1、服务器模块
语音识别模块主要是根据CS架构实现的,在项目文件中x86binasr_record_demo为服务器代码,想要修改想要语音识别的内容可以修改x86bincmd.bnf下的内容,文件格式如下:
2、客户端模块
客户端模块代码在newer6818voicectl.c下,代码如下:
//
//
// Copyright(C), 2013-2017, GEC Tech. Co., Ltd.
//
// File name: GPLE/voicectl.c
//
// Author: GEC
//
// Date: 2017-01
//
// Description: 获取语音指令,根据指令完成相应动作
//
//
//
#include "common.h"
#include <sys/ioctl.h>
#define TEST_MAGIC 'x' //定义幻数
#define TEST_MAX_NR 2 //定义命令的最大序数
//定义LED的魔幻数
#define LED1 _IO(TEST_MAGIC, 0)
#define LED2 _IO(TEST_MAGIC, 1)
#define LED3 _IO(TEST_MAGIC, 2)
#define LED4 _IO(TEST_MAGIC, 3)
//#define REC_CMD "./arecord -d4 -c1 -r16000 -traw -fS16_LE cmd.pcm"
#define REC_CMD "arecord -d3 -c1 -r16000 -traw -fS16_LE cmd.pcm"
#define PCM_FILE "./cmd.pcm"
/* -d:录音时长(duration)
-c:音轨(channels)
-r:采样频率(rate)
-t:封装格式(type)
-f:量化位数(format) */
int said=0;
void catch(int sig)
{
if(sig == SIGPIPE)
{
printf("killed by SIGPIPEn");
exit(0);
}
}
int main(int argc, char const *argv[]) // ./wav2pcm ubuntu-IP
{
signal(SIGPIPE, catch);
int id_num=0;
if(argc != 2)
{
printf("Usage: %s <ubuntu-IP>n", argv[0]);
exit(0);
}
//初始化一个网络的端口(基于TCP协议)
int sockfd = init_sock(argv[1]); //tcp
while(1)
{
// 1,调用arecord来录一段音频
printf("please to start REC in 3s...n");
// 在程序中执行一条命令 “录音的命令”
system(REC_CMD);
// 2,将录制好的PCM音频发送给语音识别引擎
send_pcm(sockfd, PCM_FILE);
// 3,等待对方回送识别结果(字符串ID)
xmlChar *id = wait4id(sockfd);
if(id == NULL)
{
//said = 0;
continue;
}
id_num=atoi((char *)id);
if(id_num == 999)
{
printf("bye-bye!n");
system("madplay ../mp3/退出.mp3");
goto exit;
}
if(id_num == 100)
{
printf("你好,主人!有什么吩咐n");
said = 1; //唤醒它
system("madplay /mnt/hgfs/share/mp3/我在.mp3"); // 放一个语音文件
}
if(said == 1 && id_num != 100 )
{
//通过网络发送数据到8266WIFI模块
send_data_to_8266(id_num);
printf("id: %dn",id_num);
if(id_num == 1)
{
system("madplay ../mp3/开窗.mp3");
}
if(id_num == 2)
{
system("madplay ../mp3/开门.mp3");
}
if(id_num == 3)
{
system("madplay ../mp3/开灯.mp3");
}
if(id_num == 4)
{
system("madplay ../mp3/关窗.mp3");
}
if(id_num == 5)
{
system("madplay ../mp3/关门.mp3");
}
if(id_num == 6)
{
system("madplay ../mp3/关灯.mp3");
}
if(id_num == 7)
{
system("madplay ../mp3/天气.mp3");
}
if(id_num == 8)
{
system("madplay ../mp3/闪光弹.mp3");
}
if(id_num == 9)
{
system("madplay ../mp3/退出.mp3");
}
if(id_num == 10)
{
system("madplay ../mp3/白给.mp3");
}
if(id_num == 11)
{
system("madplay ../mp3/胜利.mp3");
}
if(id_num == 12)
{
system("madplay ../mp3/打开steam.mp3");
}
}
}
exit:
close(sockfd);
return 0;
}
服务器端和客户端主要的连接是通过网络发送数据(id)到8266WIFI模块,然后根据id执行不同的命令,主函数中主要是可以播放对应id的音频和通过socket连接到服务器端
下面是WIFI8266模块对于id的处理函数:
可以修改x86bincmd.bnf文件内容,和该函数switch内容传送不同的内容到qt代码中。
二、QT
qt想要接受传输的内容,需要先连接到服务器端
槽函数datarecv()用来根据不同id执行不同操作,即完成了语音控制qt的目的
1、登录界面
界面设计如下:
登录界面的界面设计学过qt的应该都会,主要是记住密码功能的实现
记住密码功能实现
主要是通过check box模块配合进入steam按钮、密码框槽函数来实现这个功能
①首先我定义了三个全局变量
check1 = 0;
QString remUser="";
QString remPassword="";
用来保存我需要记住的用户名和密码,一开始置为空
②每次点击steam按钮弹出登录界面的时候需要将账户名和密码的文本框内容改为remUser 和 remPassword
③密码框槽函数
如果用户名和密码不为空,且勾选上了记住密码,则会将remUser保存为你输入的内容,如果密码正确则会将你的密码也保存住
④check box模块
每次点击check box 模块会进入槽函数check1++,勾选上的时候正常记住密码,取消勾选的时候将记住的账户名和密码重置为空
2、精彩视频播放器
该播放器能够自选想要播放的文件,并且能够通过语音进行控制各种操作,包括选择文件、播放、暂停、经验、恢复音量、快进、快退等等操作,并且进度条是根据视频实时显示的,这个是基于智能家居项目改进的,我说一下我遇到的几个问题
① 视频暂停之后一开始进度条没有暂停
解决办法:我们是采用的mplay播放视频,然后我们获取进度条是根据将读到的信息通过字符串分割函数处理得到百分比,然后显示在通过ui->progressBar_2->setValue()来显示得到的百分比,但是我们想要实时更新进度条需要通过一个定时器,然后这个定时器我们暂停的时候并没有关掉,所以导致了仍然在不断的读取并更新,所以我们需要在按下暂停按钮的时候关掉定时器,恢复播放的时候重新打开定时器
定时器函数:不断读取mplay的信息,得到百分比信息并分割,分割之后转化为整形通过ui->progressBar_2->setValue()让进度条实时更新
暂停按钮槽函数:通过一个全局变量n来完成暂停和恢复播放的功能,暂停时关闭定时器并且将按钮样式更换,恢复播放时重新打开定时器并将按钮样式更换回去
更多详细信息可以自己看开源代码,在github上有项目全部文件
最后
以上就是纯情心锁为你收集整理的基于语音识别的QT设计的csgo互动类视频游戏一、语音识别模块二、QT的全部内容,希望文章能够帮你解决基于语音识别的QT设计的csgo互动类视频游戏一、语音识别模块二、QT所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复