zoukankan      html  css  js  c++  java
  • 基于科大讯飞AIUI平台自定义语义库的开发

    说明:我写这篇文章的主要目的是因为我在做这块的时候遇到过一些坑,也是希望后来者能少走一些弯路。

    科大讯飞AIUI开放平台地址

    科大讯飞AIUI开放平台后处理地址

    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 appapicontroller;
    
    use serviceAIUIService;
    use serviceSimilarityMatch;
    use thinkDb;
    
    /**
     * @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);
                }
    			
    			//这个地方是个坑,为空时必须返回'{"intent":{}}'   不能是'{"intent":[]}' 否则会报错,切记
                if(empty($DeMsgContent["intent"])){
                    return '{"intent":{}}';
                }
    			
                //组装要返回的问题答案
                //应答码(response code),0-操作成功、4-文本没有匹配的技能场景,技能不理解或不能处理该文本
                if(!empty($DeMsgContent["intent"]) && $DeMsgContent["intent"]["rc"] == 4){
                    $msg = $this->getMsg($DeMsgContent["intent"]["text"]);
                    if(empty($msg)){
                    $msg_text = $DeMsgContent["intent"]["text"];
                    $keywords = ["返回"];
                    if(!in_array($msg_text,$keywords)){
                        $msg_text = "这个技能我还没学会呢";
                        $DeMsgContent["intent"]["service"] = "openQA";
                        $DeMsgContent["intent"]["operation"] = "ANSWER";
                        //入库未学会的问题
                        $this->insertUndefineQuestion($DeMsgContent["intent"]['text']);
                        $DeMsgContent["intent"]["semantic"] = [
                            'slots'=>[
                                'name'=>$DeMsgContent["intent"]["text"],
                                'operation'=>'ANSWER'
                            ],
                        ];
                    }else{
                        $DeMsgContent["intent"]["service"] = "app";
                        $DeMsgContent["intent"]["operation"] = "EXIT";
                        $DeMsgContent["intent"]["semantic"] = [
                            'slots'=>[
                                'name'=>$msg_text,
                                'operation'=>'EXIT'
                            ],
                        ];
                    }
                }else{
                    $msg_text = $msg[0]['answer'];
                    $DeMsgContent["intent"]["service"] = "openQA";
                    $DeMsgContent["intent"]["operation"] = "ANSWER";
                }
                //加密
                if($encrypttype == "aes"){
                    return (new AIUIService())->encrypt(json_encode($DeMsgContent));
                }else{
                    return json_encode($DeMsgContent);
                }
    			return '{"intent":{}}';
            } 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"."
    ", FILE_APPEND);
                }
                **********************************/
            }
        }
    
        /**
         * 入库未学会的技能的问题
         * @param $text
         * @return int|string
         */
         private function insertUndefineQuestion($text){
             $data = [
                'question' => $text,
                'create_time'=> date("Y-m-d H:i:s"),
                'count'=>1
             ];
             $cn = Db::name('cr_aiui_undefine_question_library')->where(['question'=>$text])->count();
             if($cn <= 0){
                 $res = Db::name('cr_aiui_undefine_question_library')->insert($data);
             }else{
                 $res = Db::name('cr_aiui_undefine_question_library')->where(['question'=>$text])->setInc('count',1);
             }
             if(!$res){
                return false;
             }
             return true;
         }
    
    
    
        /**
         * @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']);
                 $count[$v['id']]['second_keywords_count'] = count($second_keywords_array);
                 foreach($second_keywords_array  as $k2=>$v2){
                     if(!empty($v2)){
                         $res = strpos($question, $v2);
                         $count[$v['id']]['answer'] = $v['answer'];
                         if($res <> false){
                             $count[$v['id']]['count'] += 1;
                         }
                     }
                 }
             }
    
             if(!empty($count)){
                 $count = array_values($count);
    
                 //多维数组排序
                 foreach ($count as $key => $row){
                     //获取匹配次数成功最多的
                     $volume[$key]  = $row['count'];
                     //匹配通过的关键词相同的情况下,筛选关键词最少的
                     $second_keywords_count[$key]  = $row['second_keywords_count'];
                 }
                 array_multisort($volume, SORT_DESC,$second_keywords_count,SORT_ASC, $count);
    
                 //获取匹配度最大的数组的次数
                 $max_count = $count[0]['count'];
                 if($max_count == 0){
                     return null;
                 }
    
                 //组装匹配次数最大的结果集
                 foreach($count as $k=>$v){
                     if($v['count'] <> $max_count ){
                         unset($count[$k]);
                     }
                 }
                 $count =  array_values($count);
                 return $count;
             }
         }
    
        return null;
    }
    

    下面是测试过程中的测试数据

    (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' => 'cida160a452@dx00a00f4dd2a70100ac1',
                //消息创建时间,整型
                '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":"cida160a452@dx00a00f4dd2a70100ac",
        "stmid":"audio-172",
        "ver_type":"intelligent_hdw",
        "wake_id":"1542620810860e6cfaaba7305867dc4ef3d69"
    }
    

    (3) 测试数据3

    • base64_encode($param['Msg']['Content']);
                "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":"cida160a452@dx00a00f4dd17f01009a",
                        "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":"cida160a452@dx00a00f4dd17f01009a",
                        "cid":"cida160a452@dx00a00f4dcfbb000000"
                    }
    

    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平台对的自定义语义库';
    
    CREATE TABLE `cr_aiui_undefine_question_library` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `question` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '问题',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `count` int(6) DEFAULT NULL COMMENT '提问次数',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='未定义问题库';
    

    参考文章:

    资源经验分享 --- AIUI第三方接入的问题
    AIUI语义后处理历险记
    PHP用openssl_encrypt代替mcrypt_encrypt

  • 相关阅读:
    HttpClient入门三
    Centos常用命令之:压缩与解压缩
    Centos常用命令之:搜索
    Centos常用命令之:ln
    Centos常用命令之:VI
    HttpClient入门二
    NX二次开发-UFUN确定两个向量在指定的公差内是否相等(二维向量)UF_VEC2_is_equal
    NX二次开发-UFUN确定两个向量在指定的公差内是否相等(三维向量)UF_VEC3_is_equal
    NX二次开发-NXOPEN C#UF创建块theUfSession.Modl.CreateBlock1
    NX二次开发-NXOpen C# UF函数例子目录【更新日期2020.7.21】
  • 原文地址:https://www.cnblogs.com/zouke1220/p/10007120.html
Copyright © 2011-2022 走看看