技术点:
● C++STL
● http第三方库
● 图灵机器人
● 百度语音识别和语音识别
● Linux系统/网络编程
● 各种第三方库和第三方工具的安装与使用
项目简介
- 使用C++编写一个智能AI对话和语音命令执行的语音管理工具,其中可执行命令支持配置。
- 主要采用C++进程编写,当程序启动后,加载配置文件,启动录音功能进行录音,调用百度语音识别平台对所录音文件进行识别;再对所识别到的文字进行判断,是命令还是普通对话,命令则执行系统命令执行模块;普通对话则交给图灵机器人进行交流,所返回的文字交给百度语音合成平台,启动播放功能,则成功进行对话。
准备工作
- 使用图灵机器人实现对话,需要注册图灵机器人,拥有一个属于自己的机器人
- 使用百度语音识别和语音合成,同样也需要注册,在之后的使用中,我们选择的技术文档为C++SDK,需要下载百度C++语音识别SDK
- 安装jsoncpp、 安装openssl、安装libcurl(需要支持https)
- 还要准备录音和播放工具,在我的Centos 7上有系统自带的录音工具arecord,安装vlc/cvlc播放器
编码过程
● 先建立项目目录,创建工程文件,引入百度语音识别SDK
#mkdir Boyfriend
#ls build.sh
- 构建项目的shell脚本,简单实现 command.etc
- 语音命令配置文件 Boyfriend.cc
- 源文件 Boyfriend.hpp
- 核心代码 Makefile speech
- 百度语音识别SDK temp_file
- 保存临时语音文件目录
核心代码
#Boyfriend.hpp
//1、创建相关类,包含相关头文件
#pragma once
#include <map>
#include <iostream>
#include <cstdio>
#include <sstream>
#include <memory>
#include <fstream>
#include <unistd.h>
#include <stdlib.h>
#include <unordered_map>
#include <json/json.h>
#include <string>
#include <pthread.h>
#include "base/http.h"
#include "speech.h"
//#define TTS_PATH "temp_file/tts.mp3"
#define TTS_PATH "temp_file/tts.wav"
#define ASR_PATH "temp_file/asr.wav"
#define CMD_ETC "command.etc"
#define LOG "log.txt"
class Util{
private:
static pthread_t id;
public:
static bool Exec(std::string command, bool is_print)
{
if(!is_print){
command += ">/dev/null 2>&1";
}
FILE *fp = popen(command.c_str(), "r");
if(nullptr == fp){
std::cerr << "popen exec \'" << command << "\' Error" << std::endl;
return false;
}
if(is_print){
char ch;
while(fread(&ch,1,1,fp) >0){
fwrite(&ch,1,1,stdout);
}
}
pclose(fp);
return true;
}
static void *ThreadRun(void *arg)
{
const char *tips = (char*)arg;
int i = 0;
char bar[103] = {
0};
const char *lable = "|/-\\";
for(; i<=50;i++){
printf("%s[%-51s][%d%%][%c]\r",tips,bar,i*2,lable[i%4]);
fflush(stdout);
bar[i] = '=';
bar[i+1] = '>';
//bar[i+2] = 0;
usleep(49000*2);
}
printf("\n");
}
static void PrintStart(std::string tips)
{
pthread_create(&id,NULL,ThreadRun,(void*)tips.c_str());
}
static void PrintEnd()
{
pthread_cancel(id);
}
};
pthread_t Util::id;
//2、采用图灵机器人,进行智能对话
class Robot{
private:
std::string url;
std::string api_key;
std::string user_id;
aip::HttpClient client;
private:
bool I