新一代電話機器人開源PHP源代碼

使用easyswoole 框架開發的 新一代電話機器人開源PHP源碼

項目地址:https://gitee.com/ddrjcode/robotphp

  • 代理商頁面演示地址

http://119.23.229.15:8080

用戶名:c0508

密碼:123456

包含 AI外呼管理,話術管理,CRM管理,坐席管理等功能。

  • 管理員后臺演示地址

http://119.23.229.15

用戶名:admin

密碼:123456

包含? 線路管理,代理商管理等功能

AI外呼管理截圖

話術管理截圖

坐席頁面

管理員頁面

線路管理

機器人話術代碼:

<?php
/*** Created by PhpStorm.* User: WIN10* Date: 2021/12/18* Time: 16:04*/
namespace App\Traits;
use App\Model\Speech\SpeechLabelSynonym;
use App\Model\Speech\SpeechNodeModel;
use App\Model\Speech\SpeechProcessModel;
use App\Model\Speech\SpeechProcessNodeSettingModel;
use App\Model\SpeechMul\SpeechMulLabelSynonym;
use App\Model\SpeechMul\SpeechMulProcessSettingModel;trait SpeechExamineTrait{//主流程匹配關鍵詞結果數組public function getResultSynonym($speechId){$resultSynonym      = [];$synonymList        = SpeechLabelSynonym::create()->getAll(["speech_id"=>$speechId]);foreach ($synonymList as $val){if(isset($val["sls_name"])) {$resultSynonym[$val["node_id"]][$val["sls_keyword"]][] = $val["sls_name"];}}return $resultSynonym;}//獲取主流程的$nodesInfo信息 節點信息//$processQueuesReal      = []; //真實存在的主流程節點(只有節點才存在到這個主流程)public function getNodesInfoList($where){$nodesInfo              = [];//所有節點信息map=>(k,v)$processNodes           = [];$processQueuesReal      = []; //真實存在的主流程節點(只有節點才存在到這個主流程)//所有節點的信息$nodesInfoList          = SpeechNodeModel::create()->getAll($where);foreach ($nodesInfoList as $kk=>$vv){$nodesInfo[$vv["node_id"]] = $vv;if(!isset($processNodes[$vv["process_id"]])){//真實存在array_push($processQueuesReal,$vv["process_id"]);}else{$processNodes[$vv["process_id"]]         = [];}}return [$nodesInfo,$processQueuesReal];}//$processNodesArr 所有節點的數組//$processQueues  所有的流程按照順序public function getProcessQueues($where){$processNodesArr        = [];$processQueues          = [];//所有的流程按照順序$processArray           = SpeechProcessModel::create()->getAll($where,'process_id',["sort,process_id","ASC"]);foreach ($processArray as $a=>$item){array_push($processQueues,$item["process_id"]);$processNodesArr[$item["process_id"]] = [];}return [$processNodesArr,$processQueues];}//所有的參數節點流程public function getArgArray($where){$argList  = SpeechProcessNodeSettingModel::create()->getAll($where,"set_key,set_value,node_id");//所有的參數節點流程$argArray = [];foreach ($argList as $argK=>$argValue){$argArray[$argValue["node_id"]][$argValue["set_key"]] = $argValue["set_value"];}return $argArray;}//獲取所有樹的第一個節點集// $nodes = SpeechNodeTreeModel::create()->getAll($where,'process_id,node_id,parent_id,nodes_id',["node_id","ASC"]);public function getTreeFirstNode($nodes){$treeFirstNode      = [];foreach ($nodes as $key=>$value){if($value["parent_id"]==0){$treeFirstNode[$value["process_id"]] = $value;}}return $treeFirstNode;}public function getMulTreeFirstNode($nodes){$treeFirstNode      = [];foreach ($nodes as $key=>$value){if($value["parent_id"]==0){$treeFirstNode[$value["process_mul_id"]] = $value;}}return $treeFirstNode;}//獲取流程的節點的集//$processNodesNode 子集// $nodes = SpeechNodeTreeModel::create()->getAll($where,'process_id,node_id,parent_id,nodes_id',["node_id","ASC"]);//$resultSynonym  主流程匹配關鍵詞結果數組集//$childParent 父子節點數組        $childParent            = SpeechSmallNodeRelationModel::create()->getColumn($where,"node_id","small_node_id");//$processReal  真實按照順序的主流程//$processRealFlip  主流程反轉主流程//$treeFirstNode   獲取所有樹的第一個節點集//$nodeSynonymList  匹配的關鍵詞//$targetLabel//$nodesInfopublic function getProcessNodesNode($nodes,$processNodesArr,$nodesInfo,$resultSynonym,$childParent,$processReal,$targetLabel,$processRealFlip,$treeFirstNode,$nodeSynonymList){//判斷是否有相同的節點$sameNodeList       = [];$processNodesNode   = [];//用一個權重數組去獲取最終值吧(始終取最大的)$priorityArray      = [];foreach ($nodes as $key=>$value){$valueProcessId                                 = $value["process_id"];$processNodesArr[$valueProcessId][]             = $value;$subFlowModel   = [];$valueNodesId   = $value["nodes_id"];$valueParentId  = $value["parent_id"];$valueNodeId    = $value["node_id"];$priority       = "0"; //分支權重if($valueNodesId) {$word = $targetLabel[$valueNodesId]??"";if ($word) {$synonymCode    =  "W." . $word;$yesSynonym     = [];$isMore         = 0;$arrSubFlow     = [];$synonymArray   = [];switch ($word){case "肯定":if(isset($resultSynonym[$childParent[$valueNodesId]]["yes"])) {$yesSynonym = array_values($resultSynonym[$childParent[$valueNodesId]]["yes"]);}$priority = "5";break;case "否定":if(isset($resultSynonym[$childParent[$valueNodesId]]["no"])) {$yesSynonym = array_values($resultSynonym[$childParent[$valueNodesId]]["no"]);}$priority = "10";break;case "拒絕":if(isset($resultSynonym[$childParent[$valueNodesId]]["reject"])) {$yesSynonym = array_values($resultSynonym[$childParent[$valueNodesId]]["reject"]);}$priority = "12";break;case "默認":$priority = "2";$isMore = 1;break;}if($isMore==0) {//不是默認$synonymSystem = $yesSynonym ?: [$synonymCode];foreach ($synonymSystem as $item){$synonymArray[$item] = $word;}$arrSubFlow = ["condition" => ["text" => $synonymSystem],"priority" => $priority,"description" => $word];}elseif($isMore==1){//是默認$arrSubFlow = ["condition" => ["text" => ["any"]],"priority" => $priority,"description" => $word];}if(!isset($priorityArray[$valueNodeId])) {$priorityArray[$valueNodeId] = $priority;}else{if($priorityArray[$valueNodeId]<$priority){$priorityArray[$valueNodeId] =  $priority;}}if($nodesInfo[$valueNodeId]["info_talk_info"]) { //有信息的if(!isset($sameNodeList[$valueProcessId][$valueParentId][$valueNodeId])) {//是否存在當前流程,當前父id的,節點id//判斷是否當前節點參數是否為空$subFlowModel["F" . $valueNodeId]   = $arrSubFlow;if($isMore==0) {//不是默認$nodeSynonymList[$valueNodeId] = $synonymArray;}$sameNodeList[$valueProcessId][$valueParentId][$valueNodeId] = $key+1;}else{if(!isset($processNodesNode[$valueProcessId][$valueParentId] ["F" . $valueNodeId]["condition"]["text"])) {$processNodesNode[$valueProcessId][$valueParentId] ["F" . $valueNodeId]["condition"]["text"] = [];}if($isMore==0) {//非默認//有text關鍵詞的操作if ($yesSynonym) {$processNodesNode[$valueProcessId][$valueParentId] ["F" . $valueNodeId]["condition"]["text"]  = array_merge($processNodesNode[$valueProcessId][$valueParentId] ["F" . $valueNodeId]["condition"]["text"] ,$yesSynonym);}//沒有關鍵詞的操作if (!$yesSynonym) {array_push($processNodesNode[$valueProcessId][$valueParentId] ["F" . $valueNodeId]["condition"]["text"], "W." . $word);}$nodeSynonymList[$valueNodeId] = array_merge($nodeSynonymList[$valueNodeId],$synonymArray);}if($isMore==1) {//默認
//                                $processNodesNode[$valueProcessId][$valueParentId] ["F" . $valueNodeId]["condition"]["text"]= ["any"];array_push($processNodesNode[$valueProcessId][$valueParentId] ["F" . $valueNodeId]["condition"]["text"], "any");}if(!isset($processNodesNode[$valueProcessId][$valueParentId]["F" . $valueNodeId]["description"])) {$processNodesNode[$valueProcessId][$valueParentId]["F" . $valueNodeId]["description"] =  $word;}else{$processNodesNode[$valueProcessId][$valueParentId]["F" . $valueNodeId]["description"] .= "," . $word;}$processNodesNode[$valueProcessId][$valueParentId]["F" . $valueNodeId]["priority"] = $priorityArray[$valueNodeId];}}elseif(!$nodesInfo[$valueNodeId]["info_talk_info"] && $nodesInfo[$valueNodeId]["type_id"]==2){$next           = $nodesInfo[$value["node_id"]]["next"];  //跳轉的條件$nextId         = $nodesInfo[$value["node_id"]]["next_id"];//流程id$process_id     = $nodesInfo[$value["node_id"]]["process_id"]; //該流程id[$resReturnData,$returnKey,$resReturn] = $this->checkNextFlow($next,$nextId,$process_id,$processReal,$processRealFlip,$treeFirstNode,$arrSubFlow);//沒有信息的就是跳轉信息if(!isset($sameNodeList[$valueProcessId][$valueParentId][$returnKey])) {//判斷是否當前節點參數是否為空
//                            $subFlowModel["F".$returnKey]                               = $resReturn;if($resReturn){if(!isset($subFlowModel["F" . $returnKey]["condition"]["text"])) {$subFlowModel["F" . $returnKey]["condition"]["text"] = [];}if($isMore==0) {//非默認if ($yesSynonym) {$subFlowModel["F" . $returnKey]["condition"]["text"] = array_merge($processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"],$yesSynonym);}if (!$yesSynonym ) {array_push($subFlowModel ["F" . $returnKey]["condition"]["text"], "W." . $word);}}if($isMore==1) {//默認
//                                    $subFlowModel ["F" . $returnKey]["condition"]["text"]= ["any"];array_push($subFlowModel ["F" . $returnKey]["condition"]["text"], "any");}$subFlowModel["F" . $returnKey]["priority"] = $priorityArray[$valueNodeId];}$nodeSynonymList[$returnKey]                                = $synonymArray;$sameNodeList[$valueProcessId][$valueParentId][$returnKey]  = $key+1;}else{if(!isset($processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"])) {$processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"] = [];}if($isMore==0) {//非默認if ($yesSynonym) {$processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"] = array_merge($processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"],$yesSynonym);$nodeSynonymList[$returnKey]      = array_merge($nodeSynonymList[$returnKey],$synonymArray);}if (!$yesSynonym ) {array_push($processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"], "W." . $word);$nodeSynonymList[$returnKey] = array_merge($nodeSynonymList[$returnKey],$synonymArray);}}if($isMore==1) {//默認
//                                $processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"]= ["any"];array_push($processNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"], "any");}if(isset($processNodesNode[$valueProcessId][$valueParentId]["F" . $returnKey]["description"])) {$processNodesNode[$valueProcessId][$valueParentId]["F" . $returnKey]["description"] =  $word;}else{$processNodesNode[$valueProcessId][$valueParentId]["F" . $returnKey]["description"] .= "," . $word;}$processNodesNode[$valueProcessId][$valueParentId]["F" . $returnKey]["priority"] = $priorityArray[$valueNodeId];}}}}//是否存在當前的流程的process的id的,父id//不存在就是直接把subFlow賦值給他if (!isset($processNodesNode[$valueProcessId][$valueParentId])) {$processNodesNode[$valueProcessId][$valueParentId] = $subFlowModel;} else {//存在就是數組連接一起$processNodesNode[$valueProcessId][$valueParentId] = array_merge($processNodesNode[$valueProcessId][$valueParentId],$subFlowModel);}}return [$processNodesArr,$processNodesNode,$nodeSynonymList];}//獲取flow流程//獲取 $nodeSynonymList  匹配的關鍵詞//$firstNode//第一個主流程節點//$version 版本//$processReal  真實按照順序的主流程//$processRealFlip  主流程反轉主流程//$treeFirstNode   獲取所有樹的第一個節點集//$nodeSynonymList  匹配的關鍵詞//$targetLabel//$nodesInfo//$processNodesNode 子集public function getFlowList($flow,$processNodesArr,$nodeSynonymList,$version,$nodesInfo,$processNodesNode,$processReal,$processRealFlip,$treeFirstNode,$argArray,$allNodeWavKey,$allSettingsKey,$priority){$count                  = 0;$firstNode              = "";//第一個節點foreach ($processNodesArr as $ke=>$ve){foreach ($ve as $kkk=>$vvv){$vvvNodeId = $vvv["node_id"];if($count==0){$flow["Start"] = ['action'=>'start','position'=>["x"=>2489,"y"=>72],"subflow"=>['F'.$vvvNodeId."_".$version=>new \stdClass()]];}$count++;$arg = [];$arg["action"]          = "cti_play_and_detect_speech";if($count==1){$firstNode = $vvvNodeId."_".$version;}//模式$argM       = $argArray[$vvvNodeId]["moshi"]??"1";if(isset($allSettingsKey[$vvvNodeId]['interrupt']) && $allSettingsKey[$vvvNodeId]['interrupt']) {$argM = "2";}$argLuZao   = $argArray[$vvvNodeId]["luzao"]??"";$argKaiShi  = $argArray[$vvvNodeId]["kaishi"]??"";$argTingZhi = $argArray[$vvvNodeId]["tingzhi"]??"";$argDengDai = $argArray[$vvvNodeId]["dengdai"]??"";$argZuiDa   = $argArray[$vvvNodeId]["zuida"]??"";$argCanShu  = $argArray[$vvvNodeId]["canshu"]??"";$argLuYin   = $argArray[$vvvNodeId]["luyin"]??"";//掛機不需要這些參數if($nodesInfo[$vvvNodeId]['next']!=1) {$arg["filter"] = ["text" => "S","dtmf" => "none"];if ($priority == 1) {$arg["kb_priority"] = 0;} elseif ($priority == 2) {$arg["kb_priority"] = 1;}$arg["timeoutplaybacks"] = [];$arg["timeoutrepetition"] = "";$arg["mismatchplaybacks"] = [];$arg["mismatchrepetition"] = "1";$arg["globalflow"] = ["all"];}else{//掛機節點不起用asr$argM = 0;}$arg["argument"]        = "'$argM' '16' '' '$argLuZao' '' '$argKaiShi' '$argTingZhi' '$argDengDai' '$argZuiDa' '' '$argCanShu' '$argLuYin' '' ''";$arg["position"]        = ["x"=>$nodesInfo[$vvvNodeId]["node_x"],"y"=>$nodesInfo[$vvvNodeId]["node_y"]];$arg["description"]     = $nodesInfo[$vvvNodeId]["info_title"];if(isset($allNodeWavKey[$vvvNodeId]) && $allNodeWavKey[$vvvNodeId]) {$arg["playbacks"] = [$allNodeWavKey[$vvvNodeId]];}else{$arg["playbacks"] = [$nodesInfo[$vvvNodeId]["info_talk_info"]];}$arg["kb"]          = 'C1';if(isset($processNodesNode[$vvv["process_id"]][$vvvNodeId])) {$arg["subflow"] = $processNodesNode[$vvv["process_id"]][$vvvNodeId];}else{$next           = $nodesInfo[$vvvNodeId]["next"];  //跳轉的條件$nextId         = $nodesInfo[$vvvNodeId]["next_id"];//流程id$processId      = $nodesInfo[$vvvNodeId]["process_id"]; //該流程id[$arg["subflow"],$returnKey,$resReturn] = $this->checkNextFlow($next,$nextId,$processId,$processReal,$processRealFlip,$treeFirstNode);}if($nodesInfo[$vvvNodeId]["info_talk_info"]) {//如果是跳轉節點,沒有輸入聲音就是不輸入if($count==1){$vvvNodeId .= "_".$version;}$flow["F" . $vvvNodeId] = $arg;}}}return [$flow,$nodeSynonymList,$firstNode];}//生成一個掛機節點public function addEndPoints($flow){/*** 生成一個掛機節點*/$endPointsArray = ['action'=>'hangup','position'=>["x"=>67,"y"=>33]];$flow["F9999999999999999999"]=$endPointsArray;return $flow;}//生成一個等待用戶回答節點public function addWaitPoints($flow){/*** 生成一個掛機節點*/$endWaitArray = ['action'=>"cti_play_and_detect_speech","argument"=>"'1' '16' '' '' '' '' '' '' '' '' '' '' '' ''","position"=>["x"=>391833,"y"=>2372],"playbacks"=>[],"description"=>"","sourceflowdepth"=>"1","globalflow"=>["all"],"kb"         => 'C1',"kb_priority"=>2,"condition"=> ["complete"=> [],"text"=> []],"timeoutrepetition"=>"","mismatchplaybacks"=> [],"subflow"=>[]];$flow["F88888888888888888888"]=$endWaitArray;
//        $flow["F66666666666666666666"]=[
//            "action"=> "return",
//            "position"=> [
//                "x"=> 2263,
//                "y"=> 492
//            ]
//        ];return $flow;}//生成一個掛機播放節點public function addHangUpPlayContent($flow,$nodeId,$playbacks){$hangUpArray = ['action'=>"cti_play_and_detect_speech","argument"=>"'0' '16' '' '' '' '' '' '' '' '' '' '' '' ''","position"=>["x"=>391833,"y"=>2372],"playbacks"=>$playbacks,"description"=>"","sourceflowdepth"=>"1","condition"=> ["text"=> []],"mismatchplaybacks"=> [],"subflow"=>["F9999999999999999999"=> ["condition"=>["complete"=> ["any"],],]]];$flow["F".$nodeId] = $hangUpArray;return $flow;}//生成一個掛機播放節點public function addHangUpPlay($flow){$hangUpArray = ['action'=>"cti_play_and_detect_speech","argument"=>"'0' '16' '' '' '' '' '' '' '' '' '' '' '' ''","position"=>["x"=>391833,"y"=>2372],"playbacks"=>[],"description"=>"","sourceflowdepth"=>"1","condition"=> ["text"=> []],"mismatchplaybacks"=> [],"subflow"=>["F9999999999999999999"=> ["condition"=>["text"=> ["any"],],]]];$flow["F5555555555555555555555"] = $hangUpArray;return $flow;}public function addWaitSubPoints(){return ["F9999999999999999999"=> ["condition"=>["complete"=> ["timeout()"]],"description"=> "靜音掛斷"],"F66666666666666666666"=>["condition"=> ["complete"=> [],"text"=> ["F.+"]],"description"=> "有聲音返回"]];}//生成一個掛機節點public function addHangUpPoints(){$endPointsArray["F9999999999999999999"] = ['condition'=>['complete'=> ["any"]],];return $endPointsArray;}//跳轉到指定主流程public function toMainFlow($flowId){$arg["F".$flowId]= ["condition"=>["complete"=> [],"text"=>["any"],"description"=>""]];return $arg;}//跳轉到指定多倫會話public function toMulFlow($flowId){$arg["F".$flowId."_".$flowId]= ["condition"=>["complete"=> [],"text"=>["any"],"description"=>""]];return $arg;}//判斷主流程下個流程的節點public function  checkNextFlow($next,$nextId,$process_id,$processReal,$processRealFlip,$treeFirstNode,$arrSubFlow=[]){$array          = [];$keyNext        = $processRealFlip[$process_id]+1;//下一個next$hangUp         = $arrSubFlow?:["description"=>"無效回答", "condition"=>["text"=>["any"]]];$nextProcess    = $arrSubFlow?: ["condition" => ["text" => ["any"]], "description" => "跳轉下一個流程"];$keyReturn      = "";$resReturn      = "";switch ($next){case 0:case 2:if(isset($processReal[$keyNext])){$array["F" . $treeFirstNode[$processReal[$keyNext]]["node_id"]] = $nextProcess;$keyReturn   = $treeFirstNode[$processReal[$keyNext]]["node_id"];$resReturn   = $nextProcess;}else{$array["F9999999999999999999"] = $hangUp;$keyReturn  = "9999999999999999999";$resReturn   = $hangUp;}break;case 1:$array["F9999999999999999999"] = $hangUp;$keyReturn  = "9999999999999999999";$resReturn   = $hangUp;break;case 3:if(isset($treeFirstNode[$nextId])) {$fistNode = $treeFirstNode[$nextId];$array["F" . $fistNode["node_id"]] = $nextProcess;$keyReturn   = $fistNode["node_id"];$resReturn   = $nextProcess;}else{$array["F9999999999999999999"] = $hangUp;$keyReturn       = "9999999999999999999";$resReturn       = $hangUp;}break;case 4://返回接口$keyReturn  = substr(microtime(true),2,8).rand(0,99);$resReturn= ['action'  =>'return','position'=>['x'=>4085,'y'=>377],];$array["F".$keyReturn] = $resReturn;break;}return [$array,$keyReturn,$resReturn];}//多倫會話匹配關鍵詞結果數組public function getMulResultSynonym($speechId){$resultSynonym      = [];$synonymList        = SpeechMulLabelSynonym::create()->getAll(["speech_id"=>$speechId]);foreach ($synonymList as $val){if(isset($val["sls_name"])) {$resultSynonym[$val["node_mul_id"]][$val["sls_keyword"]][] = $val["sls_name"];}}return $resultSynonym;}//獲取所有子節點public function getMulProcessNodesNode($flow,$nodesMul,$resultMulSynonym,$childMulParent,$nodesMulInfo,$targetMulLabel,$nodeSynonymList,$treeFirstNode){//判斷是否有相同的節點$sameNodeList           = [];$processMulNodesNode    = [];$processMulNodesArr     = [];//所有全局話術的根節點//用一個權重數組去獲取最終值吧(始終取最大的)$priorityArray      = [];foreach ($nodesMul as $key=>$value){$valueProcessId                     = $value["process_mul_id"];$processMulNodesArr[$valueProcessId][]          = $value;$subFlowModel   = [];$valueNodesId   = $value["nodes_id"];$valueParentId  = $value["parent_id"];$valueNodeId    = "F".$value["node_mul_id"]."_".$value["node_mul_id"];$priority       = "0";if($valueNodesId) {$word = $targetMulLabel[$valueNodesId]??"";if ($word) {$synonymCode    =  "W." . $word;$yesSynonym     = [];$isMore         = 0;$arrSubFlow     = [];$synonymArray   = [];switch ($word){case "肯定":if(isset($resultMulSynonym[$childMulParent[$valueNodesId]]["yes"])) {$yesSynonym = array_values($resultMulSynonym[$childMulParent[$valueNodesId]]["yes"]);}$priority = "5";break;case "否定":if(isset($resultMulSynonym[$childMulParent[$valueNodesId]]["no"])) {$yesSynonym = array_values($resultMulSynonym[$childMulParent[$valueNodesId]]["no"]);}$priority = "10";break;case "拒絕":if(isset($resultMulSynonym[$childMulParent[$valueNodesId]]["reject"])) {$yesSynonym = array_values($resultMulSynonym[$childMulParent[$valueNodesId]]["reject"]);}$priority = "12";break;case "默認":$priority = "2";$isMore = 1;break;}if($isMore==0) {//不是默認$synonymSystem = $yesSynonym ?: [$synonymCode];foreach ($synonymSystem as $item){$synonymArray[$item] = $word;}$arrSubFlow = ["condition" => ["text" => $synonymSystem],"priority" => $priority,"description" => $word];}elseif($isMore==1){//是默認$arrSubFlow = ["condition" => ["text" => ["any"]],"priority" => $priority,"description" => $word];}if(!isset($priorityArray[$valueNodeId])) {$priorityArray[$valueNodeId] = $priority;}else{if($priorityArray[$valueNodeId]<$priority){$priorityArray[$valueNodeId] =  $priority;}}if($nodesMulInfo[$value["node_mul_id"]]["info_talk_info"]) { //有信息的(多倫會話只要有信息判斷)if(!isset($sameNodeList[$valueProcessId][$valueParentId][$valueNodeId])) {//是否存在當前流程,當前父id的,節點id//判斷是否當前節點參數是否為空$subFlowModel[$valueNodeId]   = $arrSubFlow;if($isMore==0) {//不是默認$nodeSynonymList[$valueNodeId] = $synonymArray;}$sameNodeList[$valueProcessId][$valueParentId][$valueNodeId] = $key+1;}else{if(!isset($processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["condition"]["text"])) {$processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["condition"]["text"] = [];}if($isMore==0) {//非默認if ($yesSynonym) {$processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["condition"]["text"]  = array_merge($processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["condition"]["text"] ,$yesSynonym);}if (!$yesSynonym) {array_push($processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["condition"]["text"], "W." . $word);}$nodeSynonymList[$valueNodeId] = array_merge($nodeSynonymList[$valueNodeId],$synonymArray);}if($isMore==1) {//默認
//                                $processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["condition"]["text"]= ["any"];array_push($processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["condition"]["text"], "any");}if(!isset($processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["description"])) {$processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["description"] =  $word;}else{$processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["description"] .= "," . $word;}$processMulNodesNode[$valueProcessId][$valueParentId][$valueNodeId]["priority"] = $priorityArray[$valueNodeId];}}elseif(!$nodesMulInfo[$value["node_mul_id"]]["info_talk_info"] && $nodesMulInfo[$value["node_mul_id"]]["type_id"]==2){$next           = $nodesMulInfo[$value["node_mul_id"]]["next"];  //跳轉的條件$nextId         = $nodesMulInfo[$value["node_mul_id"]]["next_id"];//流程id[$arrSubFlows,$returnKey,$resReturn,$flow] = $this->checkNextMulFlow($next,$nextId,$treeFirstNode,$flow);if(!isset($sameNodeList[$valueProcessId][$valueParentId][$returnKey])) {//判斷是否當前節點參數是否為空if($resReturn){if(!isset($subFlowModel["F" . $returnKey]["condition"]["text"])) {$subFlowModel["F" . $returnKey]["condition"]["text"] = [];}if($isMore==0) {//非默認if ($yesSynonym) {$subFlowModel["F" . $returnKey]["condition"]["text"] = array_merge($processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"],$yesSynonym);}if (!$yesSynonym ) {array_push($subFlowModel ["F" . $returnKey]["condition"]["text"], "W." . $word);}}if($isMore==1) {//默認
//                                    $subFlowModel ["F" . $returnKey]["condition"]["text"]= ["any"];array_push($subFlowModel ["F" . $returnKey]["condition"]["text"], "any");}$subFlowModel["F" . $returnKey]["priority"] = $priorityArray[$valueNodeId];}if($isMore==0) {//不是默認$nodeSynonymList[$valueNodeId] = $synonymArray;}
//                            $subFlowModel["F".$returnKey]                               = $resReturn;$sameNodeList[$valueProcessId][$valueParentId][$returnKey]  = $key+1;}else{if(!isset($processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"])) {$processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"] = [];}if($isMore==0) {//非默認if ($yesSynonym) {$processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"] = array_merge($processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"],$yesSynonym);}if (!$yesSynonym ) {array_push($processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"], "W." . $word);}$nodeSynonymList[$valueNodeId] = array_merge($nodeSynonymList[$valueNodeId],$synonymArray);}if($isMore==1) {//默認
//                                $processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"]= ["any"];array_push($processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["condition"]["text"], "any");}if(!isset($processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["description"])){$processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["description"] = ",".$word;}else{$processMulNodesNode[$valueProcessId][$valueParentId] ["F" . $returnKey]["description"] .= ",".$word;}$processMulNodesNode[$valueProcessId][$valueParentId]["F" . $returnKey]["priority"] = $priorityArray[$valueNodeId];}}}}if (!isset($processMulNodesNode[$valueProcessId][$valueParentId])) {$processMulNodesNode[$valueProcessId][$valueParentId] = $subFlowModel;} else {$processMulNodesNode[$valueProcessId][$valueParentId] = array_merge($processMulNodesNode[$valueProcessId][$valueParentId],$subFlowModel);}}return [$processMulNodesNode,$nodeSynonymList,$processMulNodesArr,$flow];}//獲取所有的public function getMulFlowList($flow,$processMulNodesArr,$argMulArray,$nodesMulInfo,$treeFirstNode,$processMulNodesNode,$allNodeMulWavKey,$priority){$count                  = 0;foreach ($processMulNodesArr as $ke=>$ve){foreach ($ve as $kkk=>$vvv){$vvvNodeId = $vvv["node_mul_id"];$count++;$arg = [];$arg["action"]          = "cti_play_and_detect_speech";//模式$argM       = $argMulArray[$vvvNodeId]["moshi"]??"1";$argLuZao   = $argMulArray[$vvvNodeId]["luzao"]??"";$argKaiShi  = $argMulArray[$vvvNodeId]["kaishi"]??"";$argTingZhi = $argMulArray[$vvvNodeId]["tingzhi"]??"";$argDengDai = $argMulArray[$vvvNodeId]["dengdai"]??"";$argZuiDa   = $argMulArray[$vvvNodeId]["zuida"]??"";$argCanShu  = $argMulArray[$vvvNodeId]["canshu"]??"";$argLuYin   = $argMulArray[$vvvNodeId]["luyin"]??"";//掛機不需要這些參數if($nodesMulInfo[$vvvNodeId]['next']!=1) {$arg["filter"] = ["text" => "S","dtmf" => "none"];if ($priority == 1) {$arg["kb_priority"] = 0;} elseif ($priority == 2) {$arg["kb_priority"] = 1;}$arg["timeoutplaybacks"] = [];$arg["timeoutrepetition"] = "";$arg["mismatchplaybacks"] = [];$arg["mismatchrepetition"] = "1";$arg["kb"] = 'C1';$arg["globalflow"] = ["all"];}else{//掛機節點不起用asr$argM = 0;}$arg["argument"]        = "'$argM' '16' '' '$argLuZao' '' '$argKaiShi' '$argTingZhi' '$argDengDai' '$argZuiDa' '' '$argCanShu' '$argLuYin' '' ''";$arg["position"]        = ["x"=>$nodesMulInfo[$vvvNodeId]["node_x"],"y"=>$nodesMulInfo[$vvvNodeId]["node_y"]];$arg["description"]     = $nodesMulInfo[$vvvNodeId]["info_title"];if(isset($allNodeMulWavKey[$vvvNodeId]) && $allNodeMulWavKey[$vvvNodeId]) {$arg["playbacks"] = [$allNodeMulWavKey[$vvvNodeId]];}else{$arg["playbacks"] = [$nodesMulInfo[$vvvNodeId]["info_talk_info"]];}if(isset($processMulNodesNode[$vvv["process_mul_id"]][$vvvNodeId])) {$arg["subflow"] = $processMulNodesNode[$vvv["process_mul_id"]][$vvvNodeId];}else{$next           = $nodesMulInfo[$vvvNodeId]["next"];   //跳轉的條件$nextId         = $nodesMulInfo[$vvvNodeId]["next_id"];//流程id[$arg["subflow"],$returnKey,$resReturn,$flow] = $this->checkNextMulFlow($next,$nextId,$treeFirstNode,$flow);}if($nodesMulInfo[$vvvNodeId]["info_talk_info"]) {//如果是跳轉節點,沒有輸入聲音就是不輸入$keyNode = "F".$vvvNodeId."_".$vvvNodeId;$flow[$keyNode] = $arg;}}}return $flow;}//多倫會話下一步public function checkNextMulFlow($next,$nextId,$treeFirstNode,$flow){$array          = [];$info           = ["description"=>"默認回答", "condition"=>["text"=>["any"]]];$keyReturn      = "";$resReturn      = "";switch ($next){case 0://普通節點默認掛機case 1://掛機$hangK              = substr(microtime(true),2,8).rand(0,99);$hangKey            = "F".$hangK;$array[$hangKey]    = $info;$keyReturn          = $hangK;$resReturn          = $info;//掛機節點需要添加掛機節點/*** 生成一個掛機節點*/$endPointsArray = ['action'=>'hangup','position'=>["x"=>67,"y"=>33]];$flow[$hangKey]=$endPointsArray;break;case 2://跳轉指定多倫會話$hangKey            = "F".$nextId."_".$nextId;$array[$hangKey]    = $info;$keyReturn          = $nextId."_".$nextId;$resReturn          = $info;break;case 3://指定主流程$hangKey            = "F".$treeFirstNode[$nextId]['node_id'];$array[$hangKey]    = $info;$keyReturn          = $treeFirstNode[$nextId]['node_id'];$resReturn          = $info;break;}return [$array,$keyReturn,$resReturn,$flow];}//所有的多倫會話節點流程public function getMulArgArray($where){$argList  = SpeechMulProcessSettingModel::create()->getAll($where,"set_key,set_value,node_mul_id");//所有的參數節點流程$argArray = [];foreach ($argList as $argK=>$argValue){$argArray[$argValue["node_mul_id"]][$argValue["set_key"]] = $argValue["set_value"];}return $argArray;}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715909.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715909.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715909.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日一題 — 復寫零

1089. 復寫零 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先找到最后一個復寫的數&#xff1a; 雙指針算法&#xff1a; 1、先判斷 cur 位置上的值 2、然后決定 dest 移動一步還是兩步 3、然后判斷 dest 是否到終點了 4、最后 cur 處理越界的情況 arr[n-1] …

使用sourceCompatibility = 11不匹配解決方法

運行springbootgradle項目報錯。 原因&#xff1a;在生產該項目時&#xff0c;選擇的JDK是11版本的&#xff0c;但是本地電腦只安裝了1.8版本。不兼容所以報錯。 解決辦法&#xff1a; 找到build.gradle配置文件—>找到sourceCompatibility ‘11’—>把11改成自己本地…

思維題(藍橋杯 填空題 C++)

目錄 題目一&#xff1a; ?編輯 代碼&#xff1a; 題目二&#xff1a; 代碼&#xff1a; 題目三&#xff1a; 代碼&#xff1a; 題目四&#xff1a; 代碼&#xff1a; 題目五&#xff1a; 代碼&#xff1a; 題目六&#xff1a; 代碼七&#xff1a; 題目八&#x…

用python和pygame庫實現刮刮樂游戲

用python和pygame庫實現刮刮樂游戲 首先&#xff0c;確保你已經安裝了pygame庫。如果沒有安裝&#xff0c;可以通過以下命令安裝&#xff1a; pip install pygame 示例有兩個。 一、簡單刮刮樂游戲 準備兩張圖片&#xff0c;一張作為背景bottom_image.png&#xff0c;一張作…

Leetcoder Day35| 動態規劃part02

62.不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff…

如何在Linux配置C、C++、Go語言的編譯環境?

在 Linux 系統上配置 C、C、Go 語言的編譯環境可以通過安裝相應的編譯器和相關工具來實現。以下是在 Linux 系統上配置這些語言的編譯環境的一般步驟&#xff1a; 1. C 和 C 編譯環境配置&#xff1a; 安裝 GCC 編譯器&#xff08;一般 Linux 發行版都會包含&#xff09;&…

Android 顯示系統框架

一.FrameBuffer FrameBuffer 介紹&#xff1a; FrameBuffer中文譯名為幀緩沖驅動&#xff0c;它是出現在2.2.xx內核中的一種驅動程序接口。主設備號為29&#xff0c;次設備號遞增。 Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。FrameBuffer機制模仿顯卡的功能…

Day11:信息打點-Web應用企業產權指紋識別域名資產網絡空間威脅情報

目錄 Web信息收集工具 業務資產-應用類型分類 Web單域名獲取-接口查詢 Web子域名獲取-解析枚舉 Web架構資產-平臺指紋識別 思維導圖 章節知識點&#xff1a; Web&#xff1a;語言/CMS/中間件/數據庫/系統/WAF等 系統&#xff1a;操作系統/端口服務/網絡環境/防火墻等 應用…

dart中的事件隊列與微任務

dart在每個事件循環中&#xff0c;會先執行同步任務代碼&#xff0c;然后分別檢查兩個任務隊列&#xff1a;微任務隊列和事件隊列。dart總是先執行微任務隊列中的代碼&#xff0c;然后才是事件隊列中的代碼。當兩個隊列中的任務都執行完成后&#xff0c;線程進入休眠狀態&#…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在嘗試調用Stable Diffusion WebUI API的時候&#xff0c;打開http://127.0.0.1:7860/docs遇到了以下頁面 網絡診斷是這樣的原因&#xff1a; 修bug&#xff0c;改來改去遇到了以下兩種頁面&#xff1a; 此時http://127.0.0.1:7860可以如下正常顯示&#xff1a; 查資料的時候找…

vue+springboot項目部署服務器

項目倉庫&#xff1a;vuespringboot-demo: vuespringboot增刪改查的demo (gitee.com) ①vue中修改配置 在public文件夾下新建config.json文件&#xff1a; {"serverUrl": "http://localhost:9090"//這里localhost在打包后記得修改為服務器公網ip } 然后…

[NSSCTF 2nd] web復現

1.php簽到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

nginx 配置瀏覽器不緩存文件 每次都會從服務器 請求新的文件

目錄 解決問題方法說明 測試html環境js環境第一步然后修改內容 打開帶有js緩存的頁面強制刷新 配置nginx 每次打開頁面都會重新請求index.js 文件重啟nginx再次修改index.js 總結設置為全局 解決問題 適用于實時更新數據的&#xff0c;網頁 可以讓用戶每次都是重新請求&#x…

C語言中的套娃——函數遞歸

目錄 一、什么是遞歸 1.1.遞歸的思想 1.2.遞歸的限制條件 二、舉例體會 2.1.求n的階乘 2.2.順序打印整數的每一位 2.3.斐波那契數列 三、遞歸與迭代 一、什么是遞歸 在學習C語言的過程中&#xff0c;我們經常會跟遞歸打交道&#xff0c;什么是遞歸呢&#xff1f;它其實…

LNMP 架構

環境準備&#xff1a;lnmp 需要安裝 nginx mysql php 論壇/博客 軟件 使用LNMP架構搭建 論壇 1. 關閉防火墻和和核心防護 systemctl disable --now firewalld setenforce 0 2. 編譯安裝 nginx 安裝依賴包 yum -y install pcre-devel zlib-devel gcc gcc-c make 創建…

在Redhat 7 Linux上安裝llama.cpp [ 錯誤stdatomic.h: No such file or directory]

前期準備 在github上下載llama.cpp或克隆。 GitHub - ggerganov/llama.cpp: LLM inference in C/C ? git clone https://github.com/ggerganov/llama.cpp.gitcd llama.cpp 執行make命令編譯llama.cpp make 在huggingface里下載量化了的 gguf格式的llama2模型。 https:/…

每日一練:筆試題復盤-LeeCode原題-判斷二叉樹兩數之和-->找到滿足二叉樹兩數之和的所有路徑

用Java實現&#xff0c;給定一個二叉樹root和一個值 sum &#xff0c;找到從根節點到葉子節點的節點值之和等于 sum 的路徑。 1.該題路徑定義為從樹的根結點開始往下一直到葉子結點所經過的結點 2.葉子節點是指沒有子節點的節點 3.路徑只能從父節點到子節點&#xff0c;不能從子…

Compiling from source on UNIX(cmake doxygen ant maven ccache)

前言 源碼鏈接 cmake-3.18.0 https://cmake.org/files/v3.18/cmake-3.18.0.tar.gzdoxygen-1.10.0 https://www.doxygen.nl/files/doxygen-1.10.0.src.tar.gzapache-ant-1.10.8-bin https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.tar.gzapache-maven-3…

#WEB前端(表單)

1.實驗&#xff1a; form、input、label 登錄界面&#xff0c;表單填寫界面 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

RedisTemplate中opaForValue.set的注意之處

問題 原本寫了一個小項目&#xff0c;想通過redis緩存實現登錄退出功能&#xff0c;結果出現了莫名奇妙的問題 代碼如下&#xff1a; 報錯&#xff1a; 經過多次調試之后我發現是opsForValue.set(key,value,expireTime)這行代碼的問題&#xff0c;沒有指定過期時間的單位&…