程序界面包含录音和发送两个按钮
点录音将开始录音
点发送将停止录音并对录音或在文本框内文字进行相应的处理
最后返回机器人对话结果.
程序在Windows下以及Ubuntu下均测试通过,安卓未测试
Ubuntu下的程序界面就不放了
Windows下测试界面如下:
void RefreshToken();//刷新百度鉴权TOKEN模块
void Initialize(void);//初始化模块
void to_voice();//百度文字转语音模块
void Robot();//图灵对话模块
void on_pushButton_record_clicked();//开始录音模块
void Network_connection(QNetworkRequest,QByteArray);//HTTP模块
void result(QNetworkReply *m_rely);//HTTP返回数据解析模块
void on_pushButton_send_clicked();//停止录音发送数据
刷新百度鉴权TOKEN;
初始化设备;
if 点录音按钮 则 开始录音;
if 点发送按钮 则 if 开始录音
则 {停止录音;语音识别;}
否则 图灵对话;
if 语音识别 则 图灵对话
if 图灵对话 则 语音合成
一些私有变量的定义
.
Ui::Widget *ui;
QNetworkAccessManager *AcceseNet;
QString Token;
QMediaPlayer *Player;
QBuffer *Sound_Date = NULL;
QAudioInput* Recording;
int Sound_Sign = 0;//录音标识位,0表示未录音或录音已结束,1表示已经开始录音
int Result_Sign = 2;//0表示返回的是百度语音API识别的文字结果,1表示是图灵机器人返回的对话结果,2表示返回的是百度语音API的token
初始化录音设备
.
void Widget::Initialize()//初始化录音设备
{
QAudioDeviceInfo info;//设置录音设备与录音参数
const auto &&availableDevices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
if(!availableDevices.isEmpty())
{
info = availableDevices.first();
QAudioFormat format;
format.setSampleRate(16000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setSampleType(QAudioFormat::SignedInt);
format.setByteOrder(QAudioFormat::LittleEndian);
format.setCodec("audio/pcm");
Recording = new QAudioInput(info, format, this);
}
ui->textEdit->setText("初始化......");
}
图灵机器人json封装
.
Text.insert("text",data);//对json数据按图灵机器人API要求进行封装
provideInfo.insert("inputText",Text);//嵌套,图灵机器人json格式要求
user.insert("apiKey","");//图灵机器人apiKey
user.insert("userId",""); //每个用户ID固定,图灵机器人判断同一用户则可以识别上下文,经过测试发现图灵机器人的userID仅能为数字
date.insert("perception",provideInfo);
date.insert("userInfo",user);
百度语音识别json封装
.
QJsonObject date;
request.setRawHeader("Content-Type", "application/json");//百度语音识别参数
date["format"] = "pcm";
date["rate"] = 16000;
date["channel"] = 1;
date["token"] = Token;
date["dev_pid"] = 1537;//此要求固定值1537
date["cuid"] = "这里填写你自己的";//用户标识,可使用MAC
date["speech"] = QString(Sound_Date->data().toBase64());//百度要求将完整的录音数据进行base64编码
date["len"] = Sound_Date->data().size();//录音数据编码前的字节数
以POST方式进行访问
.
AcceseNet->post(request, byteArray);//以POST方式进行网络访问
读取所有返回数据
.
str = Result_reply->readAll();//读取所有返回数据
对返回数据进行解析
.
QJsonDocument::fromJson(str).object()["result"].toArray()[0].toString();//按照API要求格式进行JSON解析
QJsonDocument::fromJson(str).object().value("results")[0].toObject().value("values").toObject().value("text").toString();//按照API要求格式进行JSON解析
QJsonDocument::fromJson(str).object()["access_token"].toString();//按API要求格式进行JSON解析
https://download.csdn.net/download/qq_36980354/12032495