一、项目简介
ai语音管家接入了图灵机器人,利用百度的语音识别和语音合成以及各种第三方库实现了和机器人的智能对话,
二、应用技术
C++STL,cmake,图灵机器人,百度语音识别和语音合成,HTTP第三方库,jsoncpp,libcurl,centos7录音工具和vlc播放工具,Linux系统/网络编程
三、用到的工具
-
注册图灵机器人并身份认证:http://www.turingapi.com/
-
注册百度语音识别:http://ai.baidu.com
-
下载C++SDK::https://github.com/Baidu-AIP/sdk-demo/tree/master/speech/cpp
-
安装cmake:https://blog.csdn.net/fancyler/article/details/78009812
-
安装高版本gcc:
sudo yum install centos-release-scl
sudo yum install devtoolset-6
scl enable devtoolset-6 bash -
安装jsoncpp解压:http://www.json.org/json-zh.html
cd jsoncpp-1.8.3
make build
cd build
cmake …
make
sudo make install -
安装openssl:sudo yum install openssl-devel
-
安装libcurl:https://curl.haxx.se/download.html
tar xzf curl-7.64.1.tar.gz
cd curl-7.64.1
./configure
make
sudo make install -
安装录音工具vlc:
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
四、项目框架图
- 录音:利用Centos自带的录音工具arecord
- 语音识别接口(ASR):将录制的语音文件进行识别,识别后的信息以json串的形式存储,最后再提取出语音信息,以字符串的方式打印。
- 加载配置文件(Exec接口):配置文件中加入Linux的常见命令,识别出来的语音文件若是命令,就调Exec将其执行。
- 图灵机器人(Talk接口):主要将用户录制的音频识别出来之后转为json串发给图灵机器人,然后图灵机器人将信息转为字符串响应给用户,总之就是序列化----->request----->反序列化
- 语音合成(TTL):将图灵机器人响应回来的信息转成语音,利用vlc工具播放出来。
五、项目成果
六、项目部分代码
- 项目运行核心逻辑
void Run()
{
//将错误和调试信息写入文件中
#ifdef _LOG_
int fd = open(LOG, O_WRONLY|O_CREAT, 0644);
if(fd < 0)
{
return;
}
dup2(fd,2);
#endif
fflush(stdout);
volatile bool quit = false;
while(!quit)
{
std::cout << "Record ... " << std::endl;
Util::PrintStart("录音中 ");
if(this->Record())
{
//语音识别
std::string message;
if(sr.ASR(ASR_PATH, message))
{
//1、判断是不是命令
std::string cmd = "";
if(IsCommands(message,cmd))
{
std::cout << "[zlj@localhost Jarvis]" << cmd << std::endl;
Util::Exec(cmd, true);
//继续下一次
continue;
}
//2、交给图图
std::cout << "波妞# " << message << std::endl;
if(message == "明天见。")
{
std::string quit_message = "goodbye";
std::cout << "波妞# " << quit_message << std::endl;
exit(0);
}
std::string echo = rb.Talk(message);
if(sr.TTS(TTS_PATH, echo))
{
//合成成功,播放
this->Play();
}
std::cout << "宗介# " << echo << std::endl;
}
else
{
std::cerr << "ASR error" << std::endl;
}
}
else
{
std::cout << "Record error" << std::endl;
}
Util::PrintEnd();
}
}
- 工具类的Exec函数执行命令
static bool Exec(std::string command, bool Is_Print)
{
FILE* fp = popen(command.c_str(), "r");
if(fp == nullptr)
{
std::cerr << "popen error" << std::endl;
return false;
}
if(Is_Print == true)
{
char c;
while(fread(&c, 1, 1, fp)>0)
{
fwrite(&c, 1, 1, stdout);
}
}
pclose(fp);
return true;
}
- 配置文件
查看当前目录:pwd
创建目录:mkdir
关闭防火墙:systemctl stop firewalld
打开防火墙:systemctl start firewalld
- Makefile
CC=g++
bin=TUTU
src=TUTU.cc
INCLUDE=-Ispeech/
LIB=-ljsoncpp -lcurl -lcrypto -lpthread
FLAGS=-D_LOG_
$(bin):$(src)
$(CC) -o $@ $^ $(FLAGS) $(INCLUDE) $(LIB)
.PHONY:clean
clean:
rm -f $(bin)
关于语音识别和语音合成接口的使用可参考C++SDK文档!!!
七、总结
项目源码:https://github.com/sunshineyam/Linux/tree/master/Jarvis
ai语音管家这个项目代码没有很难,对我而言比较陌生的是json串的序列化和反序列化,不过仔细研读也能解决啦,比较麻烦的是需要借助很多第三方平台,使用的工具比较多。但是还是比较有意思的,而且可移植性较高,有兴趣的大佬可以和我一起扩展鸭!