难点: 难点就是如何跟百度云的语音应用进行通信。 首先,要获取应用的API Key、Secret Key,并通过请求鉴权接口换取 token。向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数: 并在URL中带上以下参数:
grant_type: 必须参数,固定为client_credentials; client_id: 必须参数,应用的API Key; client_secret: 必须参数,应用的Secret Key;
也就是 https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%14&client_secret=%2& %1处填API KEY,%2处填secret key.
之后调用 QNetworkReply *reply=manager.post(request,requestdata);函数发送第一次http请求。(request里面设置url以及”头“) requestdata第一次可以为空,不需要传什么东西,只是获取token。获取得到的json需要进行处理,以得出真正的token。
之后再用post函数来发送第二次请求,这次的request的url需要设置为http://vop.baidu.com/server_api?dev_pid=1537&cuid=%1&token=%2,其中%1需要设置为主机号(随便一个数字都可以),%2需要设置access token.也就是第一次请求获取的token,头与上次一样,requestdata需要传入需要识别的文件(这里打开音频文件,获取里面的全部内容放入QByteArray requestdata中,之后再发送过去,然后就可以接受数据,接受过来的数据里面包含一个result数组,此数组里面第一个元素包含的就是翻译后的结果。
解析json: QString speech::getjsonvalue(QByteArray ba, QString key) { QJsonParseError error; QJsonDocument jsondocument=QJsonDocument::fromJson(ba,&error); if(error.error==QJsonParseError::NoError) { if(jsondocument.isObject()) { QJsonObject jsonboj=jsondocument.object(); if(jsonboj.contains(key)) { QJsonValue jsonvalue=jsonboj.value(key); if(jsonvalue.isString()) { return jsonvalue.toString(); } else if(jsonvalue.isArray()) { QJsonArray arr=jsonvalue.toArray(); QJsonValue jv=arr.at(0); return jv.toString(); } } } } return “”; }
前三个循环用来判断接收到的数据是否正常,然后判断是数组还是字符串,如果是字符串就是第一次post收来的数据,如果是数组就是第二次传来的数据。然后再最终获取数据。
|