最近打算做一个语音识别,语义理解机器人方面的软件,于是了解了科大讯飞语音平台,平台大部分都是对Java的支持,对c和c++的支持特别少,对c的支持有Windows的SDK,但是代码相对冗杂,且不支持跨平台,于是打算用Qt做一个跨平台的语音交互软件。

博主也是初学者,代码中如有不规范,各位见谅,百度了很久也没有QT webapi方面的讯飞代码,作为初学者,深知初学者不容易,自己写了个,希望能帮到各位。

运行效果如下:

结合讯飞的API用python做一个简单的聊天机器人_Qt


废话不多说,直接上代码:

首先按照讯飞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解析不太方便,如果要严谨,建议还是使用json
    QString 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支持,即完全的语音交互和回复,后续会继续更新。