基於科大訊飛AIUI平臺自定義語義庫的開發
說明:我寫這篇文章的主要目的是因為我在做這塊的時候遇到過一些坑,也是希望後來者能少走一些彎路。
1. 科大訊飛介面服務類:
<?php namespace service; /** * 科大訊飛AIUI服務 * Class AIUIService * @package service */ class AIUIService { const APP_ID = '*****'; //訊飛AIUI開放平臺註冊申請應用的應用ID(appid) const API_KEY = '****'; //介面金鑰,由訊飛AIUI開放平臺提供,呼叫方管理 const TOKEN = '*****'; //後處理token const AES_KEY = '*****'; //加密AES KEY /** * @title 建構函式 * @param string $key 金鑰 * @param string $method 加密方式 * @param string $iv iv向量 * @param mixed $options 還不是很清楚 */ public function __construct() { $this->token = self::TOKEN; // key是必須要設定的 $this->secret_key = self::AES_KEY; $this->method = "AES-128-CBC"; $this->iv = self::AES_KEY; $this->options = OPENSSL_RAW_DATA; } /** * @title 簽名驗證 * @param $token token * @param $timestamp 時間戳 * @param $rand 隨機數 * @param $aesKey $aesKey * @param $sign 客戶端請求介面sign引數值 * @return INT */ public function checkAuth($sign,$timestamp,$rand,$key='') { //按規則拼接為字串 $str = self::createSignature($this->token,$timestamp,$rand,$key); ///校驗簽名字串:0為一致、-1為不一致 if ($str !== $sign) { return -1; } return 0; } /** * @title 生成簽名 * @param $token * @param $timestamp * @param $rand * @param string $aesKey * @return string */ private static function createSignature($token,$timestamp,$rand,$key='') { //組裝要排序的陣列 $arr = [$timestamp,$token,$rand]; //字典序排序 sort($arr); //拼接為一個字串 $str = implode('',$arr); //sha1加密 return sha1($str); } /** * @title 加密 * @param $plaintext string 要加密的字串 * @return string */ public function encrypt($plaintext){ //加密採用AES的CBC加密方式,祕鑰為16位元組(128bit),初始化向量複用祕鑰,填充方式為PKCS7Padding。 //返回的訊息要以同樣的方式進行加密。 //加密過程:padding->CBC加密->base64編碼 //$option 以下標記的按位或: OPENSSL_RAW_DATA 原生資料,對應數字1,不進行 base64 編碼。OPENSSL_ZERO_PADDING 資料進行 base64 編碼再返回,對應數字0。 return openssl_encrypt($plaintext, $this->method, $this->secret_key,$this->options, $this->iv); } /** * @title 解密 * @param $ciphertext string 要解密的字串 * @return string */ public function decrypt($ciphertext){ //解密過程:base64解碼->CBC解密->unpadding return openssl_decrypt($ciphertext, $this->method, $this->secret_key, $this->options, $this->iv); } }
2. 控制器處理:
介面呼叫示例:
注: 其他具體接入過程可參見文件:https://aiui.xfyun.cn/docs/access_docs
<?php namespace app\api\controller; use service\AIUIService; use service\SimilarityMatch; use think\Db; /** * @title 科大訊飛自定義語義庫 * @class AiUi * @auth 鄒柯 * @date 2018-11-19 */ class AiUi { /** * @title 科大訊飛自定義語義庫 * @return json */ public function accessVerification() { //接收引數 $param = request()->param(false); //判斷介面訪問方式:POST/GET $res = isset($_SERVER['REQUEST_METHOD']) && !strcasecmp($_SERVER['REQUEST_METHOD'],'POST'); if($res) { //POST //是否加密:encrypttype=aes-加密、raw-不加密 $encrypttype = $param[ 'encrypttype']; //解密 if($encrypttype == "aes"){ $DeMsgContent = (new AIUIService())->decrypt(file_get_contents("php://input")); $DeMsgContent = json_decode($DeMsgContent,true); }else{ //訊息內容 $MsgContent = $param['Msg']['Content']; $DeMsgContent = json_decode(base64_decode($MsgContent),true); //除錯程式碼 p($DeMsgContent); } //組裝要返回的問題答案 //應答碼(response code),0-操作成功、4-文字沒有匹配的技能場景,技能不理解或不能處理該文字 if(!empty($DeMsgContent["intent"]) && $DeMsgContent["intent"]["rc"] == 4){ $msg = $this->getMsg($DeMsgContent["intent"]["text"]); if(empty($msg)){ $msg_text = "這個技能還沒學會--測試"; }else{ $msg_text = $msg[0]['answer']; } $DeMsgContent["intent"]["answer"] =[ //通用的文字顯示,屬於text資料 "text"=> $msg_text, //顯示的型別,通過這個型別,可以確定資料的返回內容和客戶端的顯示內容,預設值為 T 。 //T:text資料 U:url資料 TU:text+url資料 IT:image+text資料 ITU:image+text+url資料 "type"=>"T", //回答的情緒,取值參見附錄的情感標籤對照表 "emotion"=>"default", "answerType"=>"openQA" ]; $DeMsgContent["intent"]["operation"] = "ANSWER"; $DeMsgContent["intent"]["score"] = 1; $DeMsgContent["intent"]["service"] = "openQA"; $DeMsgContent["intent"]["status"] = 0; $DeMsgContent["intent"]["array_index"] = 0; $DeMsgContent["intent"]["engine_time"] = 0.001; } //加密 if($encrypttype == "aes"){ //... return (new AIUIService())->encrypt(json_encode($DeMsgContent)); }else{ //除錯程式碼 p(json_encode($DeMsgContent)); echo json_encode($DeMsgContent); } } else { //GET //接收驗證簽名引數 $timestamp = $param['timestamp']; $rand = $param['rand']; $sign = $param['signature']; $AIUIService = new AIUIService(); $res = $AIUIService->checkAuth($sign,$timestamp,$rand); if($res == -1){ return null; } //回傳後處理 token,token 在官網上有 echo sha1("sdjdjsodml"); //除錯程式碼 /********************************** foreach ($_GET as $key=>$value){ file_put_contents("log.txt", date('H:i:s')." "."_GET: Key: $key; Value: $value"."\r\n", FILE_APPEND); } **********************************/ } } /** * @title 根據語義返回要查詢問題的答案 * @param $question 問題 * @return array */ private function getMsg($question){ //匹配主關鍵詞 $keywords_info = Db::query("select * from cr_aiui_keywords where status=1 and LOCATE(keywords,'{$question}') > 0"); if(!empty($keywords_info)){ $keywords_str =implode(",",array_unique(array_column($keywords_info,"keywords"))); $keywords_str2 = "'".str_replace(",","','",$keywords_str)."'"; //組裝查詢條件 $where = "status=1 and keywords in ($keywords_str2)"; $result = Db::name("cr_aiui_semantic_library")->field("id,second_keywords,answer")->where($where)->select(); //計算不同匹配結果的匹配次數 $count = []; foreach($result as $k=>$v){ $count[$v['id']]['count'] = 0; $second_keywords_array = explode(",",$v['second_keywords']); foreach($second_keywords_array as $k2=>$v2){ $res = strpos($question, $v2); $count[$v['id']]['answer'] = $v['answer']; if($res <> false){ $count[$v['id']]['count'] += 1; } } } $count = array_values($count); //多維陣列排序 // 取得列的列表 foreach ($count as $key => $row){ $volume[$key] = $row['count']; } array_multisort($volume, SORT_DESC,$count); //獲取匹配度最大的陣列的次數 $max_count = $count[0]['count']; //組裝匹配次數最大的結果集 foreach($count as $k=>$v){ if($v['count'] <> $max_count ){ unset($count[$k]); } } $count = array_values($count); }else{ return null; } return $count; }
下面是測試過程中的測試資料
(1) 測試資料1
接收post過來的引數:
tp5開啟除錯,檢視日誌記錄:/home/wwwroot/default/CrAdmin/runtime/log/201811/23.log
array (
//隨機字串
'rand' => '04d1L6G2',
//是否加密:encrypttype=aes加密/raw不加密
'encrypttype' => 'raw',
//簽名
'msgsignature' => 'ef64f8ef4ec53a1f7ad30f5c8d312d316e1bd54d',
'timestamp' => '2018-11-19 17:47:23 +0800 CST',
//訊息id,字串型別
'MsgId' => ' [email protected]',
//訊息建立時間,整型
'CreateTime' => 1542620843,
//開發者應用Id,字串型別
'AppId' => '5bf22b4e',
//AIUI唯一使用者標註,字串型別
'UserId' => 'd10601259780',
//本次會話互動引數,Base64格式字串,解碼後為json格式
'SessionParams' => 'eyJjb250ZXh0Ijp7InNka19zdXBwb3J0IjpbInR0cyIsImlhdCIsIm5scCJdfSwiZGV2X2xhbmciOiJjcHAiLCJkc3JjIjoic2RrIiwiZHR5cGUiOiJhdWRpbyIsImludGVyYWN0X21vZGUiOiJjb250aW51b3VzIiwibXNjLmxhdCI6IiIsIm1zYy5sbmciOiIiLCJvc19zeXMiOiJBbmRyb2lkIiwicHJvdF90eXBlIjoicGIiLCJzY2VuZSI6Im1haW4iLCJzY2l0eSI6ImNoIiwic2RrX3ZlciI6IjUuNS4xMDQxLjAwMDAiLCJzaWQiOiJjaWRhMTYwYTQ1MkBkeDAwYTAwZjRkZDJhNzAxMDBhYyIsInN0bWlkIjoiYXVkaW8tMTcyIiwidmVyX3R5cGUiOiJpbnRlbGxpZ2VudF9oZHciLCJ3YWtlX2lkIjoiMTU0MjYyMDgxMDg2MGU2Y2ZhYWJhNzMwNTg2N2RjNGVmM2Q2OSJ9',
//開發者自定義引數,通過客戶端的userparams引數上傳,Base64格式字串
'UserParams' => '',
//遊業務型別,目前包括兩種(iat:聽寫結果,kc:語義結果),字串型別
'FromSub' => 'kc',
//訊息內容,json object參考Msg訊息內容格式
'Msg' =>
array (
'ContentType' => 'json',
'Type' => 'text',
'Content' => 'eyJpbnRlbnQiOnsiYW5zd2VyIjp7InRleHQiOiLkuLrmgqjmib7liLDku6XkuIvnu5PmnpwifSwiZGF0YSI6eyJyZXN1bHQiOlt7ImFsaWFzTmFtZXMiOlsiS2FtZW4gUmlkZXIgS3V1Z2EgdnMuIHRoZSBTdHJvbmcgTW9uc3RlciBHby1KaWluby1EYSIsIuiSmemdoui2heS6uuWPpOi/pnZz5Yia5Yqb5oCq5Lq6R2/Ct0ppaW5vwrdEYSzku67pnaLjg6njgqTjg4Djg7zjgq/jgqbjgqxWU+WImuWKm+aAquS6uuOCtOODu+OCuOOCpOODjuODu+ODgCIsIuS7rumdouODqeOCpOODgOODvOOCr+OCpuOCrFZT5Yia5Yqb5oCq5Lq644K044O744K444Kk44OO44O744OAIiwi5YGH6Z2i6aqR5aOr56m65oiRdnPliJrlipvmgKrkurpHb8K3Smlpbm/Ct0RhIiwi6JKZ6Z2i6LaF5Lq65Y+k6L+mdnPliJrlipvmgKrkurpHb8K3Smlpbm/Ct0RhIl0sImRpcmVjdG9ycyI6W3siaWQiOjEwNjQ3NzAsIm5hbWUiOiLpk4PmnZHlsZXlvJgifV0sImhvdCI6NTQsImxlYWRBY3RvcnMiOlt7Im5hbWUiOiLlsI/nlLDliIforqkifSx7Im5hbWUiOiLokZvlsbHkv6HlkL4ifSx7Im5hbWUiOiLnq4vmnKjmloflvaYifSx7Im5hbWUiOiLmnZHnlLDlkoznvo4ifSx7Im5hbWUiOiLmnZHnlLDlkoznvo4ifV0sIm5hbWUiOiLlgYfpnaLpqpHlo6vnqbrmiJF2c+WImuWKm+aAquS6ukdvwrdKaWlub8K3RGEiLCJyYXdOYW1lcyI6WyLlgYfpnaLpqpHlo6vnqbrmiJF2c+WImuWKm+aAquS6ukdvwrdKaWlub8K3RGEiXSwicmVsZWFzZURhdGUiOiIyMDAwLTA4LTI3In0seyJhbGlhc05hbWVzIjpbIumToOatpuWkluS8oDrlgYfpnaLpqpHlo6vmnZzlj6QiLCLlgYfpnaLpqpHlo6vnurPpq5jlsJQiLCLpk6DmraYiLCLjgqzjgqTjg6DlpJbkvJ0g5Luu6Z2i44Op44Kk44OA44O844OH44Ol44O844KvIiwi5Luu6Z2i44Op44Kk44OA44O844OK44OD44Kv44OrIiwi6ZOg5q2m5aSW5LygOuWBh+mdoumqkeWjq+aWqeaciCIsIuOCrOOCpOODoOWkluS8nSDku67pnaLjg6njgqTjg4Djg7zmlqnmnIgiLCLku67pnaLjg6njgqTjg4Djg7zjg5Djg63jg7MiLCLpk6DmrablpJbkvKA65YGH6Z2i6aqR5aOr5p2c5Y+kIC8g5YGH6Z2i6aqR5aOr57qz6auY5bCUIiwi6ZOg5q2m5aSW5LygOuWBh+mdoumqkeWjq+aWqeaciCAvIOWBh+mdoumqkeWjq+W3tOmahiIsIuWBh+mdoumqkeWjq+W3tOmahiIsIumToOatpuWkluS8oDrlgYfpnaLpqpHlo6vmlqnmnIgvIOWBh+mdoumqkeWjq+W3tOmahiJdLCJkaXJlY3RvcnMiOlt7ImlkIjoxMTc0MDY1LCJuYW1lIjoi6YeR55Sw5rK7In1dLCJob3QiOjgyLCJsZWFkQWN0b3JzIjpbeyJuYW1lIjoi5p2+55Sw5bKzIn0seyJuYW1lIjoi6Z2S5pyo546E5b63In0seyJuYW1lIjoi5bCP5p6X5LiwIn0seyJuYW1lIjoi5LmF5L+d55Sw5oKg5p2lIn0seyJuYW1lIjoi5rKz55u45oiR6Ze7In0seyJuYW1lIjoi5bCP5p6X6LGKIn0seyJuYW1lIjoi5L2D5LqV55qG576OIiwicm9sZU5hbWUiOiLlh5HogIDlrZAgLOS7rumdouODqeOCpOODgOODvOODnuODquOCqyJ9XSwibmFtZSI6IumToOatpuWkluS8oDrlgYfpnaLpqpHlo6vmnZzlj6QgLyDlgYfpnaLpqpHlo6vnurPpq5jlsJQiLCJyYXdOYW1lcyI6WyLpk6DmrablpJbkvKDvvJrlgYfpnaLpqpHlo6vmlqnmnIgvIOWBh+mdoumqkeWjq+W3tOmahiIsIumToOatpuWkluS8oO+8muWBh+mdoumqkeWjq+aWqeaciCAvIOWBh+mdoumqkeWjq+W3tOmahiIsIumToOatpuWkluS8oO+8muWBh+mdoumqkeWjq+adnOWPpCAvIOWBh+mdoumqkeWjq+e6s+mrmOWwlCIsIumToOatpuWkluS8oO+8muWBh+mdoumqkeWjq+aWqeaciCJdLCJyZWxlYXNlRGF0ZSI6IjIwMTUtMDQtMjIifSx7ImFsaWFzTmFtZXMiOlsi5pyI5YWJ5Luu6Z2iIOaAqueNo+OCs+ODs+OCsCIsIk1vb24gTWFzazogVGhlIE1vbnN0ZXIgS29uZyIsIk1vb25saWdodCBNYXNrOiBUaGUgTW9uc3RlciBLb25nIiwiVGhlIE1vbnN0ZXIgR29yaWxsYSIsIuaciOWFieW5qumdouS+oCDmgKrlhb3liJrlj6QiLCLmnIjlhYnokpnpnaLkvqAg5oCq5YW95Yia5Y+kIiwi5pyI5YWJ5YGH6Z2iIOaAquWFveWImuWPpCIsIkdla2tvIGthbWVuIC0ga2FpanUgS29uZ3UiLCLmnIjlhYnlgYfpnaI65oCq5YW95YiaIl0sImRpcmVjdG9ycyI6W3sibmFtZSI6IuebuOmHjueUsOaCnyJ9LHsiaWQiOjIyNzg5ODEsIm5hbWUiOiJTYXRvcnUgQWlub2RhIn1dLCJsZWFkQWN0b3JzIjpbeyJuYW1lIjoi5aSn5p2R5paH5q2mIiwicm9sZU5hbWUiOiJHZWtrbyBLYW1lbiAsSnVybyBJd2FpIn0seyJuYW1lIjoi5p+z6LC35a+bIn0seyJuYW1lIjoi6Iul5rC044Ok44Ko5a2QIn0seyJuYW1lIjoi5bGx5pys6bqf5LiAIiwicm9sZU5hbWUiOiJLYWlqdSBLb25ndSJ9LHsibmFtZSI6IuWKoOiXpOWYiSIsInJvbGVOYW1lIjoiQm9zcyBvZiB0aGUgYXNzYXNzaW4gZ3JvdXAifSx7Im5hbWUiOiLlsI/lrqvlhYnmsZ8ifSx7Im5hbWUiOiLoi6XmsLTlhavph43lrZAiLCJyb2xlTmFtZSI6IkthYm9rbyJ9LHsibmFtZSI6Ikpvc2VwaCBPdHRvbWFuIiwicm9sZU5hbWUiOiJEb2N0b3IifV0sIm5hbWUiOiLmnIjlhYnlgYfpnaIg5oCq5YW95Yia5Y+kIiwicmF3TmFtZXMiOlsi5pyI5YWJ5YGH6Z2i77ya5oCq5YW95YiaIiwi5pyI5YWJ5YGH6Z2iIOaAquWFveWImuWPpCJdLCJyZWxlYXNlRGF0ZSI6IjE5NTktMDQtMDEifSx7ImFsaWFzTmFtZXMiOlsi5bCP546L5Yia5Lyg5aWHIl0sImRpcmVjdG9ycyI6W3sibmFtZSI6IuW8oOeMmyJ9LHsibmFtZSI6IuWui+aAneaYjiJ9XSwibGVhZEFjdG9ycyI6W3sibmFtZSI6IueOi+WImiIsInJvbGVOYW1lIjoi5bCP546L5YiaIn0seyJuYW1lIjoi546L5YabIiwicm9sZU5hbWUiOiLogIHlpJYifSx7Im5hbWUiOiLmn4/nhLYifSx7Im5hbWUiOiLlnJ/osYYiLCJyb2xlTmFtZSI6IuWwj+eOi+WImuWqs+WmhyJ9LHsibmFtZSI6IumXq+S4vSIsInJvbGVOYW1lIjoi5Li95Li9In1dLCJuYW1lIjoi5bCP546L5Yia5Lyg5aWHIiwicmF3TmFtZXMiOlsi5bCP546L5Yia5Lyg5aWHIl0sInJlbGVhc2VEYXRlIjoiMjAxNS0wMS0wMSJ9LHsiYWxpYXNOYW1lcyI6WyJLaWRuYXAs5aSp572RIiwiVGlhbiB3YW5nIiwiS2lkbmFwIiwi5aSp572RIl0sImRpcmVjdG9ycyI6W3siaWQiOjEwMDExNTAsIm5hbWUiOiLnqIvliJoifSx7Im5hbWUiOiLnqIvliJoifV0sImhvdCI6MzI1LCJsZWFkQWN0b3JzIjpbeyJuYW1lIjoi572X54OIIn0seyJuYW1lIjoi5qiK5qKF55SfIn0seyJuYW1lIjoi5YiY5Y2I55CqIn0seyJuYW1lIjoi6IOh6ZSmIn0seyJuYW1lIjoi5L2f5p6XIiwicm9sZU5hbWUiOiLniZvlpKfliJoifSx7Im5hbWUiOiLkupXmt7wifSx7Im5hbWUiOiLlhq/mlazmlocifSx7Im5hbWUiOiLokZvojbvljY4ifSx7Im5hbWUiOiLnqIvliJoifSx7Im5hbWUiOiLnjovojrEifV0sIm5hbWUiOiLlpKnnvZEiLCJyYXdOYW1lcyI6WyLlpKnnvZEiXSwicmVsZWFzZURhdGUiOiIxOTc0LTExLTI4In0seyJhbGlhc05hbWVzIjpbIuWNg+mdouWkp+eblyzljYPpnaLku4HkvqAiLCJHdW4gQnJvdGhlcnMiLCJRaWFuIG1pYW4gZGEgZGFvIiwi5Y2D6Z2i5aSn55uXIiwi5Y2D6Z2i5LuB5L6gIl0sImRpcmVjdG9ycyI6W3siaWQiOjEwMDExNTAsIm5hbWUiOiLnqIvliJoifSx7ImlkIjoxMTkyNTcyLCJuYW1lIjoi5ZC05a626aqnIn0seyJuYW1lIjoi56iL5YiaIn1dLCJob3QiOjczLCJsZWFkQWN0b3JzIjpbeyJuYW1lIjoi5YeM5LqRIn0seyJuYW1lIjoi54Sm5aejIn0seyJuYW1lIjoi55Sw5LiwIn0seyJuYW1lIjoi6aG+5paH5a6XIn0seyJuYW1lIjoi6buE6I6O6I6JIn0seyJuYW1lIjoi5pa555uIIn0seyJuYW1lIjoi6YeR5aSp5p+xIn0seyJuYW1lIjoi5rKI5L6dIn1dLCJuYW1lIjoi5Y2D6Z2i5aSn55uXIiwicmF3TmFtZXMiOlsi5Y2D6Z2i5aSn55uXIl0sInJlbGVhc2VEYXRlIjoiMTk2OC0wMi0yMCJ9LHsiYWxpYXNOYW1lcyI6WyLpnZLlsbHliJrmmIznn63nvJbpm4Ys44GC44GK44KE44G+44GU44GG44GX44KH44GG44Gf44KT44G644KT44GX44KF44GGIiwi6Z2S5bGx5Yia5piM55+t57yW6ZuGIiwi6Z2S5bGx5Yia5piM55+t56+H6ZuGIiwi44GC44GK44KE44G+44GU44GG44GX44KH44GG44Gf44KT44G644KT44GX44KF44GGIl0sImRpcmVjdG9ycyI6W3siaWQiOjEwMTcyMzgsIm5hbWUiOiLplIXlspvkv64ifSx7Im5hbWUiOiLpnZLlsbHliJrmmIwifV0sImhvdCI6NTIwLCJsZWFkQWN0b3JzIjpbeyJuYW1lIjoi5bGx5Y+j6IOc5bmzIn0seyJuYW1lIjoi6auY5bGx5Y2XIn0seyJuYW1lIjoi5bKp5bGF55Sx5biM5a2QIn0seyJuYW1lIjoi6Iy26aOO5p6XIn0seyJuYW1lIjoi6Zq+5rOi5Zyt5LiAIn1dLCJuYW1lIjoi6Z2S5bGx5Yia5piM55+t56+H6ZuGIiwicmF3TmFtZXMiOlsi6Z2S5bGx5Yia5piM55+t56+H6ZuGIl0sInJlbGVhc2VEYXRlIjoiMTk5OC0xMi0yNCJ9LHsiYWxpYXNOYW1lcyI6WyLku67pnaLjg6njgqTjg4Djg7zlr77jgrfjg6fjg4Pjgqvjg7ws5bmq6Z2i6LaF5Lq6wrdDWOeoi+W8jyIsIuiSmemdoui2heS6usK3Q1jnqIvlvI8iLCJLYW1lbiBSaWRlciB2cy4gU2hvY2tlciIsIk1hc2tlZCBSaWRlciB2cy4gU2hvY2tlciIsIuW5qumdoui2heS6uuWvueaSkuaXpuW4riIsIuiSmemdoui2heS6uuWvueaSkuaXpuW4riIsIkthbWVuIFJhaWTDoiB0YWkgU2hva2vDoiIsIkthbWVuIFJhaWQmI3hFMjsgdGFpIFNob2trJiN4RTI7Iiwi5Luu6Z2i44Op44Kk44OA44O85a++44K344On44OD44Kr44O8Iiwi5Luu6Z2i44Op44Kk44OA44O85a++44GY44GU44GP5aSn5L2/LOW5qumdoui2heS6usK35ZKM5bmz5aSn6Zi06LCLIiwi6JKZ6Z2i6LaF5Lq6wrflkozlubPlpKfpmLTosIsiLCJLYW1lbiBSaWRlciB2cy4gSGVsbCdzIEFtYmFzc2Fkb3IiLCJNYXNrZWQgUmlkZXIgdnMuIEFtYmFzc2Fkb3IgSGVsbCIsIkthbWVuIFJhaWTDoiB0YWkgamlnb2t1IHRhaXNoaSIsIkthbWVuIFJhaWQmI3hFMjsgdGFpIGppZ29rdSB0YWlzaGkiLCLlgYfpnaLpqpHlo6vlr7nlnLDni7HlpKfkvb8iLCLlgYfpnaLpqpHlo6vlr7nkv67ljaEiLCLku67pnaLjg6njgqTjg4Djg7ws6JKZ6Z2i6LaF5Lq6Iiwi5YGH6Z2i6LaF5Lq6Iiwi5Luu6Z2i44Op44Kk44OA44O8IiwiS2FtZW4gUmlkZXIiLCJNYXNrZWQgUmlkZXIiLCLlgYfpnaLpqpHlo6siLCLokpnpnaLotoXkuroiLCLku67pnaLjg6njgqTjg4Djg7zlr77jgZjjgZTjgY/lpKfkvb8iLCLluarpnaLotoXkurrCt+WSjOW5s+Wkp+mYtOiwiyIsIuW5qumdoui2heS6usK3Q1jnqIvlvI8iXSwiZGlyZWN0b3JzIjpbeyJuYW1lIjoi5bGx55Sw56iUIn0seyJpZCI6MTAwNDA1NCwibmFtZSI6Iuefs+ODjuajrueroOWkqumDjiJ9LHsibmFtZSI6Iuefs+ODjuajrueroOWkqumDjiJ9LHsiaWQiOjI2NzQzNDUsIm5hbWUiOiLnq7nmnKzlvJjkuIAifSx7ImlkIjoyODg4OTcwLCJuYW1lIjoiSGlkZXl1a2kgS2ltdXJhIn0seyJpZCI6Mjg4OTAwNSwibmFtZSI6Ikl0YXJ1IE9yaXRhIn1dLCJob3QiOjQ3OSwibGVhZEFjdG9ycyI6W3sibmFtZSI6IuiXpOWGiOW8mCIsInJvbGVOYW1lIjoiS2FtZW4gUmlkZXIgMSJ9LHsibmFtZSI6IuS9kOOAheacqOWImiJ9LHsibmFtZSI6IuWNg+WPtuayu+mDjiIsInJvbGVOYW1lIjoiRkJJIEFnZW50IFRha2kifSx7Im5hbWUiOiLmspbjgo/jgYvlrZAifSx7Im5hbWUiOiLpq5jop4Hjgqjjg5/jg6rjg7wifSx7Im5hbWUiOiLlpKnmnKzoi7HkuJYiLCJyb2xlTmFtZSI6IkRyLiBEZXN1Z29kZG8taGFrYXNlIn0seyJuYW1lIjoi5Lit5rGf55yf5Y+4Iiwicm9sZU5hbWUiOiJOYXJyYXRvciJ9LHsibmFtZSI6IlNoaW5qaSBOYWthZSIsInJvbGVOYW1lIjoiTmFycmF0b3IifSx7Im5hbWUiOiLmva7lgaXkuowifSx7Im5hbWUiOiLmva7lgaXlhL8iLCJyb2xlTmFtZSI6IkhlbGwncyBBbWJhc3NhZG9yIn0seyJuYW1lIjoi57qz6LC35oKf6YOOIiwicm9sZU5hbWUiOiJUaGUgR3JlYXQgQm9zcyJ9LHsibmFtZSI6IuWym+eUsOmYs+WtkCIsInJvbGVOYW1lIjoiSGlyb21pIE5vaGFyYSJ9LHsibmFtZSI6IuS9kOS9kOacqOWImiIsInJvbGVOYW1lIjoiSWNoaW1vbmppIEhheWF0byAsS2FtZW4gUmFpZMOiIDIifSx7Im5hbWUiOiLlsI/mnpfmmK3kuowiLCJyb2xlTmFtZSI6IlTDtGJlaSBUYWNoaWJhbmEifSx7Im5hbWUiOiLpq5jph47mtanlubgiLCJyb2xlTmFtZSI6IueUsOaJgOOBvuOBleOCiyAs5Lit5bGx5byYIn0seyJuYW1lIjoi5rO95b6L6ZuEIiwicm9sZU5hbWUiOiJDaGFtZWxlb24ifSx7Im5hbWUiOiJDaGlla28gTW9yaWthd2EifSx7Im5hbWUiOiLlrqvlj6PkuozmnJcifSx7Im5hbWUiOiLkvZDkvZDmnKjlip8iLCJyb2xlTmFtZSI6IuWzsOS/oeWkqumDjiJ9XSwibmFtZSI6IuWBh+mdoumqkeWjq+WvueS/ruWNoSIsInJhd05hbWVzIjpbIuWBh+mdoumqkeWjqyIsIuWBh+mdoumqkeWjq+WvueWcsOeLseWkqeS9vyIsIuWBh+mdoumqkeWjq+WvueWcsOeLseWkp+S9vyIsIuWBh+mdoumqkeWjq+WvueS/ruWNoSJdLCJyZWxlYXNlRGF0ZSI6IjE5NzEtMDQtMDMifSx7ImFsaWFzTmFtZXMiOlsi5LuW5LiN5ZunIiwi5LuW5piv5oiR5YWE5byfIiwiV2UgQXJlIEJyb3RoZXJzLOyasOumrOuKlCDtmJXsoJzsnoXri4jri6QiLCJXZSBBcmUgQnJvdGhlcnMiLCLsmrDrpqzripQg7ZiV7KCc7J6F64uI64ukIiwi5oiR5Lus5piv5YWE5byfIiwi5LuW5LiN5YaPIiwi5LuW5LiN5YaPLOS7luaYr+aIkeWFhOW8nyJdLCJkaXJlY3RvcnMiOlt7ImlkIjoxMDUwOTc5LCJuYW1lIjoi5byg6ZWHIn1dLCJob3QiOjc3MywibGVhZEFjdG9ycyI6W3sibmFtZSI6Iui1temch+mbhCJ9LHsibmFtZSI6IumHkeaIkOmSpyJ9LHsibmFtZSI6IumHkeiLseeIsSJ9LHsibmFtZSI6IuWwuei0nuS8iiJ9LHsibmFtZSI6Iui1teemj+adpSIsInJvbGVOYW1lIjoi57qv55yf55qE5bCP5YG3In0seyJuYW1lIjoi6LW16ZWH6ZuEIn0seyJuYW1lIjoi5bC555yf5oChIn0seyJuYW1lIjoiU2Vvbi1Nb29rIENobyJ9XSwibmFtZSI6IuaIkeS7rOaYr+WFhOW8nyIsInJhd05hbWVzIjpbIuS7luS4jeWGj++8jOS7luaYr+aIkeWFhOW8nyIsIuaIkeS7rOaYr+WFhOW8nyJdLCJyZWxlYXNlRGF0ZSI6IjIwMTQtMTAtMjMifSx7ImFsaWFzTmFtZXMiOlsi5oiR5Lus5Zub5LiqIiwi5LuW5LiN5oCqIiwi5LuW5piv5oiR5YS/5a2QIiwi5ZCM5b+X5aS55b+D5Lq6IiwiVGhlIFN1bSBvZiBVcyIsIuS7luS4jeaAqizku5bmmK/miJHlhL/lrZAiLCJEaWUgU3VtbWUgZGVyIEdlZsO8aGxlIiwiSW1tZXIgw4RyZ2VyIG1pdCBkZXIgTGllYmUiLCJMYSBzb21tZSBkZSBub3VzIHRvdXMiLCJNZW5ueWl0IMOpcsO8bmsiLCJOb3NvdHJvcyBkb3MiLCJOb3NzYSBFc3PDqm5jaWEiLCJUdXR0byBjacOyIGNoZSBzaWFtbyIsIlVtIENhc28gZGUgQW1vciIsIlV1ZGV0IGhlaWxhdCJdLCJkaXJlY3RvcnMiOlt7ImlkIjoxMTY2MTMzLCJuYW1lIjoi5Yev5paHwrfllJDmnpcifSx7ImlkIjoxMjcwNzg5LCJuYW1lIjoi5LmU5aSrwrfms6Lpob8ifSx7ImlkIjoxMjQzMDEwLCJuYW1lIjoiQ2Fyb2x5bm5lIEN1bm5pbmdoYW0ifSx7ImlkIjoxMTU3Mzg3LCJuYW1lIjoiR3V5IENhbXBiZWxsIn0seyJuYW1lIjoiR2VvZmYgQnVydG9uIn0seyJuYW1lIjoiS2V2aW4gRG93bGluZyJ9XSwiaG90Ijo0MjMsImxlYWRBY3RvcnMiOlt7Im5hbWUiOiLmnbDlhYvCt+axpOaZruajriIsInJvbGVOYW1lIjoiSGFycnkgTWl0Y2hlbGwifSx7Im5hbWUiOiLnvZfntKDCt+WFi+WKsyIsInJvbGVOYW1lIjoiSmVmZiBNaXRjaGVsbCJ9LHsibmFtZSI6Iue6pue/sMK35rOi5bCU5qOuIiwicm9sZU5hbWUiOiJHcmVnIn0seyJuYW1lIjoiRGVib3JhaCBLZW5uZWR5Iiwicm9sZU5hbWUiOiJKb3ljZSBKb2huc29uIn0seyJuYW1lIjoi5L+d572XwrflvJfph4zmm7wiLCJyb2xlTmFtZSI6Ikdlb3JnZSJ9LHsibmFtZSI6IlN0dWFydCBDYW1wYmVsbCIsInJvbGVOYW1lIjoiTGVhdGhlciBNYW4ifSx7Im5hbWUiOiJHcmFoYW0gRHJha2UiLCJyb2xlTmFtZSI6IkxlYXRoZXIgTWFuIn0seyJuYW1lIjoiSm9zcyBNb3JvbmV5Iiwicm9sZU5hbWUiOiJZb3VuZyBKZWZmIn0seyJuYW1lIjoi5b635Y2a5ouJwrfogq/lsLzov6oiLCJyb2xlTmFtZSI6IkpveWNlIEpvaG5zb24ifV0sIm5hbWUiOiLmiJHku6zlm5vkuKoiLCJyYXdOYW1lcyI6WyLmiJHku6zlm5vkuKoiLCLku5bkuI3mgKrvvIzku5bmmK/miJHlhL/lrZAiXSwicmVsZWFzZURhdGUiOiIxOTk0LTA3LTI4In1dfSwicmMiOjAsInNlbWFudGljIjpbeyJpbnRlbnQiOiJyZWNvbW1lbmQiLCJzbG90cyI6W3sibmFtZSI6Im5hbWUiLCJub3JtVmFsdWUiOiLniLHmg4XmiJHkvaDku5YiLCJ2YWx1ZSI6IuaIkSJ9LHsibmFtZSI6Im5hbWUiLCJ2YWx1ZSI6IuaQnOe0oiJ9LHsibmFtZSI6Im5hbWUiLCJub3JtVmFsdWUiOiLmiJEs5L2gLOS7liIsInZhbHVlIjoi5LuWIn0seyJuYW1lIjoibmFtZSIsInZhbHVlIjoi57uT5p6cIn1dfV0sInNlcnZpY2UiOiJpRmx5VmlkZW9TZWFyY2giLCJzZXJ2aWNlQ2F0ZWdvcnkiOiJpRmx5VmlkZW9TZWFyY2giLCJzZXJ2aWNlTmFtZSI6ImlGbHlWaWRlb1NlYXJjaCIsInNlcnZpY2VUeXBlIjoicHJldmVudGl2ZSIsInNpZCI6ImNpZGExNjBhNDUyQGR4MDBhMDBmNGRkMmE3MDEwMGFjIiwic3RhdGUiOnsiZmc6OnZpZGVvX3NlYXJjaDo6ZGVmYXVsdDo6ZGVmYXVsdCI6e319LCJ0ZXh0Ijoi5oiR5Yia5Y+I6K+05LqG5LiA5Y+l5LuW6K+05LiL6Z2i5piv5Zyo5pCc57Si57uT5p6cIiwidXVpZCI6ImNpZGExNjBhNDUyQGR4MDBhMDBmNGRkMmE3MDEwMGFjIiwiY2lkIjoiY2lkYTE2MGE0NTJAZHgwMGEwMGY0ZGNmYmIwMDAwMDAifX0=',
),
);
(2) 測試資料2
- base64_encode($SessionParams);
{
"context":{
"sdk_support":[
"tts",
"iat",
"nlp"
]
},
"dev_lang":"cpp",
"dsrc":"sdk",
"dtype":"audio",
"interact_mode":"continuous",
"msc.lat":"",
"msc.lng":"",
"os_sys":"Android",
"prot_type":"pb",
"scene":"main",
"scity":"ch",
"sdk_ver":"5.5.1041.0000",
"sid":"[email protected]",
"stmid":"audio-172",
"ver_type":"intelligent_hdw",
"wake_id":"1542620810860e6cfaaba7305867dc4ef3d69"
}
(3) 測試資料3
base64_encode($param['Msg']['Content']);
```json
"intent":{
"array_index":0,
"data":{
"inherit":0,
"isCached":0,
"priority":0,
"result":[
{
"albumname":"答案就是你",
"audiopath":"http://vbox.hf.openstorage.cn/ctimusic/128/2016-01-20/%E5%88%98%E5%BE%B7%E5%8D%8E/%E7%AD%94%E6%A1%88%E5%B0%B1%E6%98%AF%E4%BD%A0/%E6%9A%97%E9%87%8C%E7%9D%80%E8%BF%B71453250743.mp3",
"itemid":"45106597",
"movienames":[],
"neatsongname":[
"暗裡著迷"
],
"pictures":[
{
"level":2,
"path":"http://vbox.hfdn.openstorage.cn/ctipicture/2/20160303/580ef3c814d9e33871dfada810f88f3d/09d7de7eb33cc3b65f4e19b43f8bc81e_z.jpg",
"size":"420x420"
},
{
"level":1,
"path":"http://vbox.hfdn.openstorage.cn/ctipicture/2/20160303/580ef3c814d9e33871dfada810f88f3d/09d7de7eb33cc3b65f4e19b43f8bc81e_small.jpg",
"size":"300x300"
}
],
"programname":"",
"publishtime":752083200,
"singeraliasnames":[
"AndyLau",
"劉主席",
"華Dee",
"華仔",
"華哥",
"華神"
],
"singerids":[
"25000"
],
"singernames":[
"劉德華"
],
"songname":"暗裡著迷",
"source":"iflytek",
"tagnames":[
"經典",
"下午茶",
"華語",
"工作",
""
]
},
],
"sem_score":{
"artist":{
"lcs":1,
"pos":"ps",
"txt":"劉德華"
},
"song":{
"lcs":1,
"pos":"ps",
"txt":"暗裡著迷"
},
"top":0
}
},
"demand_semantic":{
"artist":"劉德華",
"service":"musicX",
"song":"暗裡著迷"
},
"engine_time":41.273,
"operation":"PLAY",
"orig_semantic":{
"slots":{
"artist":"劉德華",
"song":"暗裡著迷"
}
},
"rc":0,
"score":0,
"search_semantic":{
"artist":"劉德華",
"operation":"PLAY",
"service":"musicX",
"song":"暗裡著迷"
},
"semantic":{
"slots":{
"artist":"劉德華",
"operation":"PLAY",
"song":"暗裡著迷"
}
},
"service":"musicX",
"uuid":"[email protected]",
"text":"那你豎起耳朵聽劉德華的暗裡著迷",
"state":{
"fg::musicX::default::playing":{
"state":"playing"
}
},
"used_state":{
"state":"playing",
"state_key":"fg::musicX::default::playing"
},
"answer":{
"text":"劉德華 暗裡著迷"
},
"dialog_stat":"DataValid",
"save_history":true,
"sid":"[email protected]",
"cid":"[email protected]"
}
3. 自定義問答庫管理後臺的開發
注:管理後臺的程式碼我就不貼了,主要是原理,如有需要請聯絡我。
4. 資料庫表結構的設計
CREATE TABLE `cr_aiui_keywords` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`keywords` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '關鍵詞',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態(0:禁用 1:啟用)',
`create_time` datetime NOT NULL COMMENT '建立時間',
`update_time` datetime DEFAULT NULL COMMENT '修改時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='關鍵詞庫';
CREATE TABLE `cr_aiui_semantic_library` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`question` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '問題',
`keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '關鍵詞',
`second_keywords` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '副關鍵詞',
`type` tinyint(1) NOT NULL COMMENT '訊息型別:1-文字、2-音訊、3-圖文、4-視訊、5-圖片',
`answer` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '訊息內容或標題',
`url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '視訊、音樂或圖片地址',
`image_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '視訊或音樂封面圖片地址',
`desc` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '視訊、音樂描述',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態(0:禁用 1:啟用)',
`create_time` datetime NOT NULL COMMENT '建立時間',
`update_time` datetime DEFAULT NULL COMMENT '修改時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='基於科大訊飛AIUI平臺對的自定義語義庫';