最近打算做一个语音识别,语义理解机器人方面的软件,于是了解了科大讯飞语音平台,平台大部分都是对Java的支持,对c和c++的支持特别少,对c的支持有Windows的SDK,但是代码相对冗杂,且不支持跨平台,于是打算用Qt做一个跨平台的语音交互软件。
博主也是初学者,代码中如有不规范,各位见谅,百度了很久也没有QT webapi方面的讯飞代码,作为初学者,深知初学者不容易,自己写了个,希望能帮到各位。
运行效果如下:
废话不多说,直接上代码:
首先按照讯飞webapi文档准备好Appid,CurTime, Param 和 CheckSum 信息并放在 HTTP 请求头中,这里只介绍CurTime和CheckSum的获取,其他注册后都是现成的,具体注册参考官方文档吧
//获取当前UTC时间戳并转化
QByteArray Widget::Get_CurTime()
{QDateTime time = QDateTime::currentDateTime(); //获取当前时间int timeT = time.toTime_t(); //将当前时间转为时间戳char *time_box = (char*)malloc(sizeof(char));sprintf(time_box,"%d",timeT);QByteArray x_curtime(time_box);return x_curtime;
}
//checksum
QByteArray Widget::Get_CheckSum(QByteArray apikey, QByteArray curTime, QByteArray para)
{QByteArray hash = QCryptographicHash::hash(apikey+curTime+para, QCryptographicHash::Md5).toHex();return hash;
}
接下来就是post问题并获得答复了。
以下为组合代码罗列,不在一个函数内,引用注意。
//通过按钮触发消息发送,后续可改成语音发送。
connect(BtnFaSong,SIGNAL(clicked(bool)),this,SLOT(on_btnSend_clicked())); //发送问题按钮信号槽绑定//request
QNetworkRequest request;
request.setUrl(QUrl(XunFeiAiui_URL));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
//Appid,CurTime, Param 和 CheckSum 信息放在 HTTP 请求头
request.setRawHeader("X-Param",Param);
request.setRawHeader("X-Appid",XunFeiAiui_Appid);
Curtime = Get_CurTime(); //获取当前UTC时间戳
request.setRawHeader("X-CurTime",Curtime);
Check_Sum = Get_CheckSum(XunFeiAiui_Apikey, Curtime, Param); //checksum
request.setRawHeader("X-CheckSum",Check_Sum);//manger
QNetworkAccessManager *ask_manager = new QNetworkAccessManager(this);
connect(ask_manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(finishedSlot(QNetworkReply*)));
QByteArray dataArray;
QString text = lineEdit->text();
if(text.isEmpty()) //若发送内容为空时,默认发送你好
{text = "你好";
}
dataArray.append(text);
NetworkReply* reply = ask_manager->post(request, dataArray); //post请求获取
接下来就是获取post的消息,在槽函数finishedSlot
QNetworkReply::NetworkError err = reply->error();
if(err != QNetworkReply::NoError) {qDebug() << "Failed: " << reply->errorString();
}
else {// 获取返回内容QString data = UTF82GBK(reply->readAll()); //将返回的内容转换成GBK编码,以便正常显示//qDebug() << data;QStringList list = data.split(QRegExp("\""), QString::SkipEmptyParts); //采用正则分割文本,个人感觉json解析不太方便,如果要严谨,建议还是使用jsonQString str;for(int i=0; i<list.count(); i++) //遍历list{str = list[i];if(str == "text"){str = list[i+2]; //text后第二个list为返回的主要答复,后第一个是":"break;}}qDebug()<<str;}
看到这里,如果对Qt有所学习,相信你很快能引用我的代码写出自己的Robot,此代码还未添加iat和tts支持,即完全的语音交互和回复,后续会继续更新。
源码下载链接:
https://download.csdn.net/download/weixin_39541080/12430996