难点:
难点就是如何跟百度云的语音应用进行通信。
首先,要获取应用的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收来的数据,如果是数组就是第二次传来的数据。然后再最终获取数据。