一、項目簡介
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串的序列化和反序列化,不過仔細研讀也能解決啦,比較麻煩的是需要藉助很多第三方平臺,使用的工具比較多。但是還是比較有意思的,而且可移植性較高,有興趣的大佬可以和我一起擴展鴨!