科大訊飛語音轉文字JSON資料的
報名參加了一個創青春大學生創業大賽,需要把人機互動完善一下,就做了一個簡單的語音互動介面。程式的大體思路是語音方面(包括文字轉語音,語音轉文字)呼叫科大訊飛的 SDK完成,智慧方面(包括智慧文字回覆) ,程式不難,但是在json資料的解析方面花的時間有點長。
json是非常常見的資料交換格式,以鍵值對的形式傳輸,比如:{"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":0.00,"w":"啊"}]},{"bg":0,"cw":[{"sc":0.00,"w":"啊"}]}]},這個是科大訊飛文字轉語音的標準回覆格式,要想把需要的文字提取出來,我們先來分析一下這個資料
{
"sn":1,
"ls":false,
"bg":0,
"ed":0,
"ws":
[{ "bg":0, "cw":[{"sc":0.00,"w":"啊"}]},{"bg":0,"cw":[{"sc":0.00,"w":"啊"}] }]
}
分析後不難發現,我們需要的是ws裡的資料,其餘關鍵字裡都是表示狀態。麻煩的是ws 並不是具體的資料,而是json陣列,可以理解為新的json。
現在把ws裡的內容拿出來,繼續分析:
{ "bg":0, "cw":[{"sc":0.00,"w":"啊"}]},
{"bg":0,"cw":[{"sc":0.00,"w":"啊"}] }]
需要cw裡的資訊 ,同樣是一個json陣列,同樣拿出來分析。
解析需要用到json的jar包gson,普通解析很簡單,此處麻煩在於需要解析出來兩次json陣列,然後遍歷分析。演算法的思路是先通過關鍵字ws找到第一個json陣列,然後遍歷這個陣列,通過關鍵字cw找到我們需要的的第二個陣列,然後繼續遍歷,通過關鍵字w找到我們需要的資訊。
程式碼如下:
JsonParser parser=new JsonParser(); //建立JSON解析器
JsonObject object=(JsonObject) parser.parse(result.getResultString()); //建立JsonObject物件,如參為帶解析的json資料
JsonArray wsArray=object.get("ws").getAsJsonArray(); //通過關鍵字ws得到最外層的json陣列
//遍歷這個陣列
for(int i=0;i<wsArray.size();i++){
JsonArray cwArray = wsArray.get(i).getAsJsonObject().get("cw").getAsJsonArray(); //通過關鍵字cw得到第二個陣列
for(int j = 0 ; j<cwArray.size() ; j++){
//標點符號不做處理
if(cwArray.get(j).getAsJsonObject().get("w").getAsString().equals("。")
|| cwArray.get(j).getAsJsonObject().get("w").getAsString().equals("!")
|| cwArray.get(j).getAsJsonObject().get("w").getAsString().equals("?")){
que = "" ;
}
else
que = que + cwArray.get(j).getAsJsonObject().get("w").getAsString(); // 找到需要的字串,拼出一句話
}
}
裡面具體的方法不懂的 對照gson的api文件。