FreeSWITCH呼叫中心中间件-电话机器人接口

电话机器人接口

介绍

介绍请看这个页面 http://www.ddrj.com/smartivr/robot.html
和smartivr接口的区别,smartivr接口只实现了把ASR识别结果提交给http接口进行处理,根据http接口返回的动作执行放音等操作。
新一代电话机器人接口实现了话术解析引擎,可以不依赖外部接口直接完成整个机器人对话过程。

开始执行流程

<action application="cti_robot" data="flowname"/>
<action application="set" data="park_timeout=3600000"/>
<action application="park"/>
  • flowname 流程名字,不需要.josn后缀

流程执行步骤记录

CREATE TABLE `conversation` (
`createtime` DATETIME NULL DEFAULT NULL COMMENT '记录生成事件',
`callid` VARCHAR(50) NULL DEFAULT NULL COMMENT '通话ID' COLLATE 'utf8_unicode_ci',
`current_appid` VARCHAR(50) NULL DEFAULT NULL COMMENT '当前执行APPID' COLLATE 'utf8_unicode_ci',
`sequence` INT(11) NULL DEFAULT NULL COMMENT '序列号',
`current_flowid` VARCHAR(50) NULL DEFAULT NULL COMMENT '当前流程ID' COLLATE 'utf8_unicode_ci',
`input_type` INT(11) NULL DEFAULT NULL COMMENT '输入类型0:TEXT 1:DTMF 2:COMPLETE 10:CREATE 11:DESTORY',
`input_args` VARCHAR(1024) NULL DEFAULT NULL COMMENT '输入参数' COLLATE 'utf8_unicode_ci',
`input_nlp_args` VARCHAR(50) NULL DEFAULT NULL COMMENT 'nlp处理后的参数' COLLATE 'utf8_unicode_ci',
`input_start_time` DATETIME NULL DEFAULT NULL COMMENT '输入开始时间',
`input_duration` INT(11) NULL DEFAULT NULL COMMENT '输入持续时间',
`matching_method` INT(11) NULL DEFAULT NULL COMMENT '匹配方法0:mismatch 1:boot 2:regex 3:full 4:any',
`matching_condition` VARCHAR(256) NULL DEFAULT NULL COMMENT '匹配表达式' COLLATE 'utf8_unicode_ci',
`matching_keyword` VARCHAR(50) NULL DEFAULT NULL COMMENT '匹配关键词' COLLATE 'utf8_unicode_ci',
`response_type` INT(11) NULL DEFAULT NULL COMMENT '响应类型 1:flow 2:kb 3:mismatch',
`response_description` VARCHAR(50) NULL DEFAULT NULL COMMENT '响应描述' COLLATE 'utf8_unicode_ci',
`response_id` VARCHAR(50) NULL DEFAULT NULL COMMENT '响应的FlowID,或者PromptID' COLLATE 'utf8_unicode_ci',
`response_action` VARCHAR(50) NULL DEFAULT NULL COMMENT '响应动作' COLLATE 'utf8_unicode_ci',
`response_args` VARCHAR(2048) NULL DEFAULT NULL COMMENT '响应参数' COLLATE 'utf8_unicode_ci',
`repetition` INT(11) NULL DEFAULT NULL COMMENT 'kb:rompt重复播放次数 ,mismatch:连续未匹配次数 flow:已经执行次数',
`potential` VARCHAR(50) NULL DEFAULT NULL COMMENT '意向ID' COLLATE 'utf8_unicode_ci',
`record` VARCHAR(260) NULL DEFAULT NULL COMMENT '录音' COLLATE 'utf8_unicode_ci'
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;
  • createtime 记录生成事件
  • callid 通话ID
  • current_appid 当前执行APPID
  • sequence 序列号,当前执行动作的次数
  • current_flowid 当前流程ID
  • input_type 输入类型0:TEXT 1:DTMF 2:COMPLETE 10:CREATE 11:DESTORY
    • TEXT asr转换后的文字
    • DTMF 按键
    • COMPLETE 动作执行完成
    • CREATE 进入流程创建上下文
    • DESTORY 离开流程销毁上下文
  • input_args 输出参数,input_type:text是 文字内容,dtmf是按键内容,
  • input_nlp_args nlp 接口返回的数据
  • input_start_time 输入开始时间,比如说话开始时的时间
  • input_duration 输入持续时间 ,比如说话的持续时间
  • matching_method 匹配方法0:mismatch 1:boot 2:regex 3:full 4:any 5:return
    • mismatch 未匹配到条件
    • boot 创建流程时从start进入第一个引导结点(开场白)
    • regex 正则表达式匹配
    • full 完整的关键词匹配
    • any 任意匹配(就是关键词设置为any)
    • return 返回主流程
  • matching_condition 匹配表达式 ,就是被匹配成功的关键词,或者正则表达式
  • matching_keyword 匹配关键词,就是text中被匹配中的部分
  • response_type 响应类型 1:flow 2:kb 3:mismatch 4:kb_goto_flow 5:kb_goto_flow_kb
    • flow 执行新的流程节点
    • kb 执行知识库
    • mismatch 执行未匹配放音
    • kb_goto_flow 知识库切换到子流程(子流程信息)
    • kb_goto_flow_kb 知识库切换到子流程(知识库信息,response_action:flow(切换指定流程ID)|subflow(切换到当前流程的子流程),response_args:知识库switchflow配置)
  • response_id 响应的FlowID,或者PromptID
  • response_action 响应动作,执行那个FS的APP
  • response_args 响应参数,APP的参数
  • repetition kb:rompt重复播放次数 ,mismatch:连续未匹配次数 flow:已经执行次数
  • potential 意向ID
  • record 当前输入的录音文件,text输入的时候才有,一个动作(一次放音)的多次说话会记录到一个录音文件。

NLP接口

全局配置设置了NLP接口地址,并且节点配置了FLOWID,那么会调用NLP接口进行处理。

NLP接口原理,话术引擎把输入的数据和需要匹配的关键词发送给NLP接口,由NLP接口返回匹配命中的关键词。

请求参数

{
"flowid": "F1",
"nlpid": "1",
"callid": "58b0733b-8a80-4fdc-860b-ad7e5bb85fbe",
"flowkeywords": "o%7Chello%7Cok%7Cyes%7Cno%7Cwo%7Cxuhuaiyi",
"kbkeywords": "lixi%7Cgongs%7Cnali%7Chello%7Cok%7Cyes%7Cno",
"input": "text",
"text": "SHello%20hello"
}
  • flowkeywords 所有子流程的所有关键词

  • kbkeywords 关联知识库的所有关键词

  • input 输入类型

  • text 输入参数

NLP接口返回数据

{
"keyword":"输入结果匹配到的关键词",
"description":“描述”
}

话术编辑

请看这个页面 http://www.ddrj.com/smartivr/robot.html ,用户可以设计自己的话术编辑界面,只需要按照话术脚本格式生成JSON文件就可以。

话术脚本

{
"flow": {
/*节点ID*/
"F1": {
/*节点执行的动作*/
"action": "cti_play_and_detect_speech",
/*动作参数*/
"argument": "'1' '' '' '0' '' '' '' '' '' '' ''",
/*节点位置信息*/
"position": {
"x": 2499,
"y": 156
},
/*nlp ID*/
"nlpid": "",
/*节点描述*/
"description": "描述",
/*节点放音文件列表*/
"playbacks": [
"测试声音"
],
/*子节点信息*/
"subflow": {
/*子节点ID*/
"F3": {
/*进入字节点的条件*/
"condition": {
/*ASR识别到关键词*/
"text": [
"any"
],
/*动作执行完成*/
"complete": [
"any"
],
/*DTMF输入按键*/
"dtmf": [
"any"
]
}
}
},
/*节点重复执行是放音,用来替换playbacks配置*/
"replaybacks": [],
"filter": {
"text": "S",
"dtmf": "none"
},
/*知识库返回时放音*/
"kbplaybacks": [
"测试声音"
],
/*未匹配到关键词时放音*/
"mismatchplaybacks": [
"不好意思,我没听清!"
],
/*未匹配到关键词放音次数*/
"mismatchrepetition": "2",
/*关联的知识库ID*/
"kb": "C1",
/*节点最大重复进入次数*/
"repetition": "",
/*节点的意向信息*/
"potential": ""
}
}
}

知识库

{
"kb": {
/*分类ID*/
"C1": {
/*分类名字*/
"name": "常见问题回答",
/*分类下面的条目*/
"prompts": [
"P1"
],
"description": ""
}
},
"prompt": {
/*条目ID*/
"P1": {
/*条目名字*/
"name": "公司介绍",
"ref": 2,
/*最大重复执行次数*/
"repetition": "2",
/*进入知识库的关键词*/
"keyworks": [
"谁",
"哪里",
"公司"
],
/*进入后的放音文件*/
"playbacks": [
"放音测试"
],
/*意向等级*/
"potential": "7",
/*切换到流程 可以配置流程ID,子流程匹配关键词,"text:"前缀匹配子流程的文本输入,"DTMF:"前缀匹配子流程的DTMF输入,前缀匹配子流程的完成输入*/
"switchflow":"",
"description": ""
}
}
}

同义词

{
"synonym": {
/*分类*/
"肯定词": [/*同义词列表*/
"是",
"好",
"要",
"没错",
"有",
"对"
],
"否定词": [
"不",
"没"
]
}
}

全局配置

/*配置tts和asr默认配置*/
"global": {
"voicelist": [],
"defaultvoice": "",
"voicedir": "",
"ttsurl": "http:\/\/180.76.224.191:9989\/tts",
"ttsengine": "",
"ttsconfig": "",
"ttsvolume": 0,
"ttsspeechrate": 0,
"ttspitchrate": 0,
"interrupt": "2",
"asrproxy_addr": "180.76.224.191:9988",
"vad_min_active_time_ms": "150",
"vad_max_end_silence_time_ms": "800",
"wait_speech_timeout_ms": "5000",
"max_speech_time_ms": "20000",
"hot_word": "",
"asr_params": "{\"group\":\"default\"}",
"nlpurl": "",
"vad": "0",
"vad_mode": "0",
"vad_filter": "0.3"
},

tts接口

等待完成

话术流程存入redis

fs启动的时候会自动同步cti_robot_flow和cti_robot_flow@domain 2个哈希表里的话术流程,到fs话术目录,然后自动加载。

cti_robot_flow和cti_robot_flow@domain的区别,cti_robot_flow@domain指定的domain的fs才加载,cti_robot_flow连接这个redis的所有fs都会加载,用于群集模式。

  • key 流程名称
  • value 流程的json内容

cti_robot_flow改变通知

cti_robot_flow改变PUBLISH 通知到config@all [通道] ,cti_robot_flow@domain改变PUBLISH 通知到config@domain[通道],先修改hash表内容,然后推送通知,fs收到通知会自动同步话术脚本到本地,然后加载。

{
"type":"config_change",
"table":"cti_robot_flow",
"key":"t1"
}