【项目】—— 语音小管家Sosuke

news/2024/10/17 22:18:57/

项目简介

  • 借助图灵机器人和百度语音识别和合成等第三方平台和第三方工具
  • 使用C++编写一个智能AI对话和语音命令执行的语音管理工具
  • 除去交流功能之外还可以执行Linux下相关命令,可执行的命令支持自己配置

项目技术点

  • C++ STL中主要是map和unorder_map的使用
  • 了解http第三方库,使用http中的post接口进行http请求
  • 通过图灵机器人API接口将机器人接入Linux平台下
  • 百度语音识别和语音合成
  • Linux系统/网络编程
  • 各种第三方库和第三方工具的安装与使用

项目框架

项目框架

项目前期准备

准备需要使用的第三方库和sdk

  • 因为项目编译需要高版本的gcc,因此我们通过以下命令升级gcc
# sudo yum install centos-release-scl
# sudo yum install devtoolset-6
# scl enable devtoolset-6 bash

但是我在做项目的时候遇到一个比较麻烦的情况就是在电脑关机重启之后gcc的版本又会回到之前未升级的状态,但是经过测试发现此时只需要再执行最后一句命令即可。

  • 升级Linux系统下camke版本,通过cmake可以高效率和更简易的管理我们的项目
1、查看当前版本cmake --version
2、下载获得cmake-3.9.2源码 wget https://cmake.org/files/v3.9/cmake-3.9.2.tar.gz
3、解压、安装新版本tar -zxvf cmake-3.9.2.tar.gzcd cmake-3.9.2./configuresudo make && make install

安装camke我遇到了很多困难,首先是下载好cmake源码之后,解压时未将tar命令用对,导致解压出的文件不全,因此在安装时报了很多错误,其次是开始安装时我是在xshell中执行命令安装的,但是多次安装之后依旧找不到camke工具,最后多次测试发现只有到虚拟机下才能查看到cmake工具。

  • 下载百度C++语音识别SDK

在 http://ai.baidu.com/sdk 下载,识别、合成 RESTful API C++ SDK,后面的工具,基本都要支持C++11以上,这也就为什么我们要将gcc升级的原因

  • 安装jsoncpp,要求:>1.6.2版本,0.x版本将不被支持

在json官网:http://www.json.org/json-zh.html 官网中下载jsoncpp,其实个人更推荐使用 https://github.com/open-source-parsers/jsoncpp/releases 1.8.3版本,因为其他最新版本可能会有中文编码的问题,下载之后依据如下命令安装好

# cd jsoncpp-1.8.3
# make build
# cd build
# cmake ..
# make
# sudo make install
  • 安装openssl
# sudo yum install openssl-devel
  • 安装libcurl(为之后http请求做准备)

官网:https://curl.haxx.se/download.html
下载curl-7.64.1.tar.gz版本

# tar xzvf curl-7.64.1.tar.gz
# cd curl-7.64.1
# ./configure
# make
# sudo make install

这里需要提到一个Linux底下很好用的命令就是rz命令,但是这个命令在只能xshell中使用,作用就是将Windows下的文件导入虚拟机中,因为我们一般习惯在Windows中下载文件,其他方法将文件导入Linux中都比较麻烦,但是这个命令就很方便。

准备Centos 7的录音工具

  • 对于录音工具我们可以使用Linux自带的arecord -t wav -c 1 -r 16000 -d 5 -f S16_LE demo.wav进行录音,生成wav格式 的文件
  • aplay demo.wav 可播放对应的语音文件

安装vlc/cvlc播放器

我们在语音合成之后,直接使用aplay播放会有一定问题,我们采用第三方工具vlc/cvlc实现MP3文件播放

 # sudo yum -y install epel-release # sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm# sudo yum install vlc -y

当然除了这些准备之外,因为我们要使用图灵机器人,自然应该去注册一个自己的机器人,这个按照平台指示进行即可,值得一提的是必须进行个人认证才能使用该平台的机器人,认证时间大概是三天左右才能通过,接着我们要使用百度ai平台的语音识别和语音合成功能,自然也应该注册百度ai平台,都是一些比较简单的操作。

正式进入编码

这里我想分为三个部分来介绍实现这个项目的代码

  • 接入图灵机器人Sosuke,使其能够进行文本的交流
  • 完成录音并将语音消息转为文本消息传递给图灵机器人
  • 将图灵机器人回复的文本消息转换为语音消息并播放

接入图灵机器人Sosuke

首先我们应该仔细阅读图灵机器人API V2.0接入文档,这里我们定义一个Robot类来实现图灵机器人的接入。

  • 定义一个类之后我们来考虑一下,这个类需要哪些成员变量,通过阅读文档我们可以知道,需要一个请求接口url,需要机器人的api_key,还需要一个user_id,那我们就定义好这些成员变量
    成员变量
  • 定义好成员变量之后,写好构造函数和析构函数之后,接下来我们就应该考虑该类应该实现什么功能,那就是需要哪些成员函数来实现,我们知道机器人最重要的就是和我们进行交流,那我们定义一个Talk函数实现和机器人Sosuke的交流工作,其实接入机器人Sosuke简单的来说就是向我们创建的图灵机器人发起http请求,并取得http回复就是这么简单的操作。
    Talk
  • 我们通过API接入文档可以看到,发起http-post请求请求的参数格式是json串的格式,那我们就需要将我们输入的文本信息转换为json串的格式。那我们就知道了,和图灵机器人Sosuke交流就分为三步:1.将我们的文本信息转换为json串 2.发起http-post请求并获取http-post响应。3.从将响应的json串中获取图灵机器人给我们响应的文本信息。
    在这里插入图片描述
  • json的序列化与反序列化并不难,根据json官网以及API接入文档就可以很好的进行这两项工作,但是需要注意的点就是构建和获取Json::Value对象时必须严格根据文档要求的格式个命名进行。
  • 重点介绍一下post请求的发起,这里有两种方式发起请求,一种就是自己写一个http请求模型,再发起请求,一种是直接使用百度提供的httpclient,在百度SDK文件下的base文件夹中的http.h,这里为了方便和项目的简洁,所以我使用了后者。
    post请求
    到这我们就实现了将图灵机器人Sosuke接入Linux的操作了,我们可以通过输入文本和机器人进行交流

语音识别(ASR)

  • 接入机器人Sosuke完成文本交流功能之后,我们接下来就可以借助百度ai平台的语音识别功能将我们录制好的语音识别成文本消息发送给图灵机器人,这里我们封装一个SpeechRec类来实现语音识别的功能
  • 阅读百度语音识别C++SDK文档 通过阅读文档确定我们这个类需要的的成员变量
    C++SDK
  • 其实语音识别的最主要的功能就是通过两个接口实现的get_file_content以及我们创建的api::speech client对象调用recognize接口
    语音识别
  • 完成这些之后我们就可以通过语音和我们的机器人Sosuke交流,做完这些之后我们再多实现一个功能,就是通过语音让Sosuke替我们执行Linux下的命令,为了能够执行更多的命令,也为了不重复多次的修改代码,我们就直接创建一个命令配置文件,将我们想执行的命令对应说的话都写在配置文件中,然后在我们的代码中将配置文件加载进来即可,这里我们就要使用STL库中的unorder_map容器来存放我们的命令。
    在这里插入图片描述
  • 加载文件成功之后,我们需要的就是执行命令了,两种方法,第一:通过调用exec进程替换函数来执行相关命令,第二:调用popen函数执行命令,显然后者比较简单,我们就是用后者,先看看popen如何使用
    popen
  • 定义一个Util类实现该功能
    popen

语音合成

  • 同样是阅读百度ai平台提供的 语音识别C++SDK文档 由于需要的成员变量和语音识别的一样,所以我们也将这个功能放在我们刚刚封装的SpeechRec类中实现,语音合成最重要的接口就是text2audio
    语音合成

到这我们就基本实现了我们语音小管家的大框架代码,但是我们缺个最重要的部分,一直没说的就是将三部分代码串起来的主逻辑,我们来思考一下主逻辑无非就是:先录音,将语音转换为文本信息,判断是否为命令,是则调用Exec接口执行命令,不是则调用Talk进行与机器人Sosuke交流,调用语音合成接口将机器人返回的信息转换为语音文件,再播放语音文件即可
主逻辑

给项目录音添加一个进度条

  • 创建一个线程在执行主逻辑录音时让线程同时运行,效果会更加的好
    进度条

项目效果展示

  • 正常聊天
    聊天
  • 执行命令
    ls
  • 退出
    退出

总结

语音小管家这个项目代码其实并不难,主要是第三方平台的使用,以及前期项目准备时和环境配置比较麻烦,总体来说还是比较好实现又比较好玩的一个项目

项目源码

https://github.com/CXYhh121/VoiceButler-.git


http://www.ppmy.cn/news/402302.html

相关文章

lol全队消息怎么发_lol怎么发给所有人 LOL里面怎么给所有人发送消息

LOL发送所有人说话步骤: 1.首先进入游戏中。 2.按下回车会出现聊天界面。 3.输入/all即可实现对当前所有人发送消息。 4.如果无法成功则按键盘上的Esc键打开选项窗口。 5.切换到界面选项卡,勾选聊天栏目中的显示所有人频道的聊天信息并点击“确家是什么&…

机器人布里茨说什么_lol机器说的话

蒸汽机器人——布里茨。虽然布里茨会打败任何挡道的人,但他有一颗金子般的心,包裹在一具铁架内,一层钢壳中。喜欢他的话来看看吧!下面是学习啦小编为你搜集、整理的lol机器说的话,欢迎阅读! lol机器说的话精选: The ti…

UE4原生内置多人语音聊天

一.创建会话 1.创建 创建服务器和加入服务器的UI 2.实现创建会话和加入会话的功能 (1)创建会话功能 (2)加入会话功能 二.配置文件设置 1.DefaultEngine.ini文件配置 (1)在[OnlineSubsystem]下的bHasVoi…

内置语音合成芯片的智能语音扫地机器人方案推荐

扫地机器人行业背景: 随着现在生活水平的提高,越来越多的家庭开始选择智能家居产品。像智能电视、智能空调、智能冰箱等都是我们常见的智能家居产品。作为越来越多家庭清洁必备的吸尘器也逐渐向智能化转变,传统的老式吸尘器也逐渐被智能扫地机…

打游戏用什么蓝牙耳机好?英雄联盟手游推荐蓝牙耳机

蓝牙耳机作为手机周边产品,对于很多人来说,属于必需品。上下班的路上多得是无聊和枯燥,不看个视频或者听个音乐来打发时间,真是觉得时间会非常漫长。但公共场合如果外放音乐的话又会显得没有素质,所以出门带一幅耳机是…

调整计算机的设置怎么退出,英雄联盟怎么退出调电脑音量

1 回答 电脑英雄联盟怎么加好友? 首先进入到LOL英雄联盟中,在右侧好友列表中点击【添加好友】按钮,上面有两个添加好友的方式,点击【通过召唤师名字】这个选项,在里面添加好友即可。另外有和玩家一起玩过游戏的最近的玩家&#x…

美标与欧标耳机区别

NO是常开(NORMAL OPEN),就是通常即未通电状态下,是断开的,通电后在电磁线圈的作用下(吸合)处于闭合状态。NC是常闭(NORMAL CLOSE),就是通常即未通电状态下,是闭合的,通电…

python爬取lol所有英雄皮肤和英雄的语音包

打开wegame想来把lol的阿卡丽,之前因为the thy 才喜欢上玩这个人物,忽然发现wegame跳出一个页面,我记得以前一直没有,估计是更新了吧 看到时间我惊呆了,没想到lol陪伴了我这么久了,1848天了,大概…