顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-配置文件

配置文件

本文档讲解顶顶通呼叫中心中间件相关的几个配置文件。

cti.conf.xml

mod_cti的配置文件,路径是 {conf_dir}/autoload_configs/cti.conf.xml,获取${conf_dir}路径的方法是执行fs控制台命令global_getvar conf_dir ,或者shell执行 fs_cli -x "global_getvar conf_dir",cti.conf.xml修改了需要重启fs才能生效。

<configuration name="cti.conf" description="dingdingtong cti module by www.ddrj.com">
<global>
<!-- auth_key:授权文件路径 默认路径fs的conf目录:${conf_dir}/license.json -->
<param name="auth_key" value="license.json"/>
<!-- domain:配置一个名字,用于群集时区分多台FreeSWTICH -->
<param name="domain" value="test"/>
<!-- json_config_filename:JSON配置文件文字,默认路径fs的conf目录:${conf_dir}/cti.json -->
<param name="json_config_filename" value="cti.json"/>
<!-- say_dir 数字、字母声音目录默认 ${sound_prefix}/cn/link, 获取方法 global_getvar sound_prefix -->
<param name="say_dir" value="cn/link"/>
<!-- wait_redis_ready 载入cti模块时等待redis连接成功 -->
<param name="wait_redis_ready" value="true"/>
<!-- httpfile_cache_thread tts声音缓存线程个数, 这个配置要和tts的并发一样。预先TTS时,最多同时多少个线程调用TTS -->
<param name="httpfile_cache_thread" value="2"/>
<!-- 噪音人声识别模型目录 -->
<param name="sad_model_dir" value="sadmodel"/>
</global>

<http_cli>
<!-- callback用的回调地址,不适用callback接口不要配置这个 -->
<param name="http_server_domain" value="mydomain.com"/>
<!-- http_server_ip:http_cli接口绑定的IP,如果要外网访问http_cli接口要改成0.0.0.0-->
<param name="http_server_ip" value="127.0.0.1"/>
<!-- http_server_port:http_cli接口绑定端口 -->
<param name="http_server_port" value="88"/>
<!-- http_api_cli_key:http_cli接口的KEY -->
<param name="http_api_cli_key" value=""/>
</http_cli>

<robot>
<!-- robot_flow_path 话术目录 默认${conf_dir}/robot -->
<param name="robot_flow_path" value=""/>
</robot>

<autodialer>
<!-- calls_per_second:队列外呼和定时外呼一秒最大发起呼叫的次数 -->
<param name="calls_per_second" value="300"/>
</autodialer>

</configuration>

cti.json

cti.json是cti模块动态生效的配置,路径是${conf_dir}/cti.json,获取${conf_dir}路径的方法是执行fs控制台命令global_getvar conf_dir ,或者shell执行 fs_cli -x "global_getvar conf_dir",cti.json修改了会自动生效。修改后fs_cli控制台会输出一个 “[NOTICE] mod_cti.c:4117 dd_config_refresh succeed JSON configuration file updated”日志,如果修改后的json文件格式错误会输出“[WARNING] mod_cti.c:4114 dd_config_refresh failed JSON configuration file format error”这个日志,可以用json文件格式化工具( http://tools.jb51.net/code/jsonformat ),看看文件格式那里错了。

/*修改后,可以用 http://tools.jb51.net/code/jsonformat 这个工具检查JOSN是否存在错误。*/
{
"redis": {
//"master-name": "mymaster", //如果使用哨兵模式,才需要配置。sentinel配置的master-name
//"addrs": [ "192.168.1.10:6379", "192.168.1.10:6379" ], //多个sentinel地址,如果配置了addrs,会忽略ip和port配置。
"ip": "127.0.0.1", //redisIP
"port": 6379, //redis端口
"password": "" //redis密码
},
"api":
{
"key":"", // http接口调用key参数,防止非法调用,这个配置的优先级高于cti.conf.xml配置项http_api_cli_key
"acl":"",//那些IP可以调用httpA接口,防止非法调用,不设置就使用cti.conf.xml的配置。acl格式支持ip/掩码这样的格式,例如 192.168.1.1/32,192.168.0.0/24。这个配置的优先级高于cti.conf.xml配置项http_api_cli_acl
"log":false //是否打开http接口调用日志
},
"gui": {
/*分机注册信息推送到redis,:disable去除生效*/
"registration:disable": {
"hash": "registrations", //记录到hash表
"channel": "", //推送到channel
"list": "" //记录到list
},
/*通道信息推送到redis,:disable去除生效*/
"channel": {
"hash": "channels",
"channel": "",
"list": ""
},
/*网关信息推送到redis,:disable去除生效*/
"gateway": {
"hash": "gateways",
"channel": "",
"list": ""
},
/*分机呼叫信息推送到redis,:disable去除生效*/
"call:disable": {
/*呼叫信息需要记录的变量*/
"fields": [ "Caller-Destination-Number", "Caller-Caller-ID-Number", "Caller-Callee-ID-Number", "Caller-Profile-Created-Time", "Caller-Profile-Created-Time", "Caller-Channel-Answered-Time", "Caller-Channel-Hangup-Time", "Caller-Channel-Progress-Time", "Caller-Channel-Progress-Media-Time", "Answer-State", "variable_signal_bond" ],
"hash": "calls",
"remove_hangup":false,//通话结束是否从hash表删除记录。
"channel": "",
"list": "",
},
"disable_monitor":false, //是否禁用记录注册信息和通道信息,禁用后上面的推送配置全部无效。
"kill_block": false, //自动挂断挂起的通道
"multi_reg": false, //是否允许多点注册,开启多点注册的方法,请看允许多点注册的文档
"dialplan_cacheable": 60000, //拨号方案缓存时间,单位毫秒,测试环境可以改成0,不缓存。生产环境建议设置60000以上。
"allow_xml_config": false, //REDIS找不到配置时是否继续使用XML配置
"log": false //gui接口是是否输出调试日志
},
"cdr": {
/*去除这几个可能包含号码的字段,channel account destination_number caller_id_number callee_id_number*/
"hidenumber":false,
/*details:生产环境的时候设置为flase,details信息很长*/
"details": false,
/*fields需要记录到cdr表的自定义变量,number:开始的表示使用数字格式。如果变量名和数据库字段名字不一样,可以”字段名:变量名”这样。*/
"fields": [ "rtp_last_audio_codec_string", "number:billsec", "number:duration", "record_filename", "call_source", "source_name", "source_number", "dial_number:cti_dial_number", "originator", "bridge_uuid", "organization"],
/*如果需要把cdr信息推送到到redis的list或者channels,list配置redis list的名字,channels配置redis cahnnels的名字*/
"redis": {
"channel": "",
"list": ""
},
/*如果需要把cdr记录到数据库,需要配置table, 机器人交互记录,也使用这个配置*/
"database": {
/*dbtype 数据库类型 比如mysql ,sqlserver*/
"dbtype": "mysql",
/*mysql例子:127.0.0.1,3306@dbname sqlserevr例子:tcp:127.0.0.1,1433@dbname*/
"connectionstring": "127.0.0.1,3306@cti",
"username": "",
"password": "",
/*cdr表名*/
"table": "cdr",
/*是否启用CDR实时模式,实时模式创建通道的时候插入记录,通话状态变化更新记录,非实时模式通话挂断才记录到CDR*/
"real": false,
/*自动提交,如果需要使用事务批量提交,请设置false,批量提交会锁表,稳定性有待测试*/
"autocommit": true

},

/*cdr记录写入到数据库推送通知[推送内容为表名和UUID],:disable去了,才使用这个配置*/
"notify:disable": {
"redis": {
"channel": "", //推送到redis的channel
"list": "" //记录到redis的list
},
"http": {
"url": "http://127.0.0.1/notify" //推送到url接口
}
},
/*cdr入库通知(notify)包含的通道变量*/
"notify_fields:disable": [ ],

"log": true //是否输出cdr调试日志
},
"scheduledialer": {
"log": false //是否输出定时外呼调试日志
},
"queuedialer": {
"http": {
"usecurl": false, //默认使用顶顶通实现的http库,修改成true,使用curl库执行http请求
"connecttimeout": 3000, //连接超时
"responsetimeout": 10000 //等待响应超时
},
"idle_cpu": 10, //空闲CPU低于这个值,就暂停呼叫
"loadavg": 1.5, //如果最近1分钟的系统负载大于1.5就暂停呼叫,
"log": false //是否输出队列外呼调试日志
},

"robot": {
/*机器人对话的执行流程记录*/
"record": {
/*通知包含的通道变量*/
"notify_fields:disable": [ "caller_id_name", "destination_number", "call_source", "source_name", "cti_dial_number" ],
/*机器人交换记录是否推送到redis的channel和list*/
"redis": {
"channel": "",
"list": "",
},
"database": {
/*机器人的交换记录插入数据库的那个表*/
"table": "conversation",
},
"log": false //是否输出到redis的JSON和输出SQL。
},
/*机器人对话交互的统计数据*/
"statistic":
{
/*是否推送到redis的channel和list*/
"redis": {
"channel": "",
"list": ""
},
"database": {
/*插入数据库的那个表*/
"table":"classify"
},
"log": false //是否输出到redis的JSON和SQL到日志。
},
"nlp": {
"debug": false //是否输出机器人引擎调试日志,比如要输出正则表达式匹配过程,可以设置为true
},
"httpflow": {
"usecurl": false, //默认使用顶顶通实现的http库,修改成true,使用curl库执行http请求
"retries": 2, //http请求失败时重试次数
"connecttimeout": 3000, //连接超时
"responsetimeout": 10000 //等待响应超时
},
"event_after_hangup":true // 挂断之后是否继续处理事件,如果不开启 用户说话之后没等ASR识别完成就挂机,会丢失识别结果,开启后会有complete事件参数HANGUP(F说话内容)。
},

"acd": {
"state_write_redis": false, /*是否把状态写入redis*/
/*排队模块推送记录到http接口配置,:disable去了,才使用这个配置*/
"notify:disable": {
"variables": [ "caller_id_name", "destination_number" ],
"redis": {
"channel": "", //推送到redis的channel
"list": "" //记录到redis的list
},
"http": {
"url": "http://127.0.0.1/popup" //推送到url接口
},
"log": false
}
},

/*sounds_dir redis保存的声音文件同步到本地的目录默认/fs/share/freeswitch/sounds/cti*/
"sounds_dir": "cti",
"sounds_table_prefix": "", //声音记录表名前缀

"fail2ban": {
"filename": "cti_fail2ban.log", //认证失败和非法呼叫日志
"destination_number_max_len": 0, //被叫号码最大长度
"deny_prefix": [], //禁止呼入前缀
"allow_prefix": [], //允许呼入前缀,不配置时允许任意号码
"logfilter": {
"sofia.c": [ "IP (.*) Rejected by acl \"(.*)\"","IP/Port (.*) \\d+ Rejected by acls and (.*) flag is set" ] //acl拒绝写入fail2ban
}
}

}

asrproxy.json

asrproxy.json是asr和tts的配置文件,路径在 asrproxy程序安装目录。 新加ASR配置会自动生效(1分钟之内),已经存在的修改type,engine,appid,key,secret 不会生效,如果要修改这几个参数只能新添加一个ASR配置或者重启asrproxy程序,其他参数修改后自动生效。

/*asrproxy启动不了,一般都是JSON格式不对,可以用 http://tools.jb51.net/code/jsonformat 这个工具检查JOSN是否存在错误。*/
{
"key":"asrproxy.license", //授权文件路径

"log":{
"console_level":0, //输出控制台日志等级0-5(0:DEBUG, 1:INFO, 2:NOTICE, 3:WARNING, 4:CRIT, 5:CONSOLE)
"file_level":0, //输出到文件日志等级0-5(0:DEBUG, 1:INFO, 2:NOTICE, 3:WARNING, 4:CRIT, 5:CONSOLE)
"file_maxsize":100, //文件大于多少M就自动创建新的日志文件。
"file_number":10 //最大保留日志文件个数
},

"asr":{

"listen_ip":"127.0.0.1",
"listen_port":9988,
"storage":"record", //asr录音目录,调用asr时,设置了asr_params.recordfilename才会录音。

"interface": {

/*顶顶通私有化部署ASR*/
"funasr_realtime": {
"type": "funasr",
"engine": "2pass", //offline:关闭实时识别 online:开启实时识别 2pass:混合2种模式,需要更多CPU。
"model-dir": "model/paraformer-large",
"online-model-dir": "model/paraformer-large-online",
"punc-dir": "model/punc-realtime",
"chunk-size":4800
},


/*阿里云私有云asr配置例子*/
"aliyun_test": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"type": "aliyun",
"engine": "transcriber", /*transcriber:流接口,recognizer:一句话接口 */
"appid": "default",
"key": "default",
"token": "default",
"url": "ws://ip:8101/ws/v1",
"secret": "default",
"enable_intermediate_result": true,
"enable_punctuation_prediction": false,
"enable_inverse_text_normalization": false,
"enable_semantic_sentence_detection": false
},

/*阿里云实时语音识别配置例子 ,参数说明看 https://help.aliyun.com/document_detail/148847.html */
"aliyun_01": {
"count": 0, //最大多少并发
"fault_threshold": 0, //连续错误多少次停用
"fault_try_interval": 600, //停用多久后,从新尝试用这个KEY
"type": "aliyun", //识别引擎,通过配置指定调用的ASR类型
"regionid":“cn-shanghai”,
"version":"2019-02-28",
"token_url":"http://nls-meta.cn-shanghai.aliyuncs.com", //获取token接口文档https://help.aliyun.com/zh/isi/getting-started/use-http-or-https-to-obtain-an-access-token?spm=a2c4g.11186623.0.0.76a73bfb1OHdjC
"url":"wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1",
"engine": "transcriber", //transcriber:流接口,recognizer:一句话接口
"appid": "", //项目ID,详细看开通说明 https://help.aliyun.com/document_detail/71936.html
"key": "", //AccessKey ID 详细看 https://help.aliyun.com/document_detail/324194.html
"secret": "", //AccessKey Secret 详细看 https://help.aliyun.com/document_detail/69835.htm?spm=a2c4g.11186623.0.0.2f773f87BMksCK#section-iqi-ojp-tqk
"enable_intermediate_result": true, //设置是否返回中间识别结果
"enable_punctuation_prediction": false, //设置是否在后处理中添加标点
"enable_inverse_text_normalization": false, //设置是否在后处理中执行数字转换
"enable_semantic_sentence_detection": false, //设置是否使用语义断句。
"nlpmodel": "", //设置NLP模型名称,开启NLP服务后必填
"customizationid": "", //设置定制模型
"vocabularyid": "", //设置泛热词
"enable_ignore_sentencetimeout": true, //是否忽略实时识别中的单句识别超时, 默认是False
"disfluency": true, //是否对识别文本进行顺滑(去除语气词,重复说等), 默认是False
"speech_noise_threshold": 0.1, //噪音参数阈值,参数范围:[-1,1]取值越趋于-1:噪音被判定为语音的概率越大,取值越趋于+1:语音被判定为噪音的概率越大,该参数属高级参数, 调整需慎重并重点测试
"enable_sdk_log": false
},
/*阿里云一句话识别配置例子 ,参数说明看 https://help.aliyun.com/document_detail/148702.html*/
"aliyun_02": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"type": "aliyun",
"engine": "recognizer", //transcriber:流接口,recognizer:一句话接口
"appid": "",
"key": "",
"secret": "",
"enable_intermediate_result": true,
"enable_punctuation_prediction": false,
"enable_inverse_text_normalization": false,
"enable_voice_detection": true //设置是否启动自定义静音检测
},

//讯飞语音听写接口,开通地址 https://www.xfyun.cn/services/voicedictation ,如果需要启用抢话功能,需要开通 "动态修正"
"xfyun_0": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"connect_timeout":3000, //建立ws连接最大等待时间
"accent" : "mandarin", //方言,这几个参数的说明看接口文档 https://www.xfyun.cn/doc/asr/voicedictation/API.htm
"domain" : "iat", //应用领域
"language" : "zh_cn", //语种
"dwa" : "wpgs", //动态修正
"pd" : "", //领域个性化参数
"rlang" : "zh-cn", //繁体简体
"ptt" : 1, //是否开启标点符号添加
"nunum" : 1, //将返回结果的数字格式规则为阿拉伯数字格式
"type": "xfyun", //xfyun 标识这个配置试用讯飞云ASR引擎
"appid": "", //APPID
"key": "", //APIKey
"secret": "" //APISecret
},


"xfyun_1": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"type": "xfyun",
"url": "ws://ip:1078/iat", //私有云地址,公有云默认地址ws://iat-api.xfyun.cn/v2/iat,可以不配置。
"appid": "",
"key": "",
"secret": ""
},

/*
"mrcp": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"type": "mrcp",
"engine": "uni2",
"grammar": "",
"appid": "",
"key": "",
"secret": ""
},
*/

"tencent": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"type": "tencent",
"engine": "8k_zh",
"appid": "",
"key": "",
"secret": ""
},

//获取取帐号名、帐号ID、用户名、用户ID、项目名称、项目ID 方法看这里 https://support.huaweicloud.com/api-iam/iam_17_0002.html
//区域 列表 https://developer.huaweicloud.com/endpoint?IAM
//可用终端节点 https://support.huaweicloud.com/api-sis/sis_03_0004.html 写这个说明的时以下节点可用
//华北-北京一 cn-north-1, 华北-北京四 cn-north-4, 华东-上海一 cn-east-3
//账户信息 请看 https://support.huaweicloud.com/api-sis/sis_03_0058.html Token认证的描述
"huawei": {
"type": "huawei",
"projectname": "", //项目名字实际含义是项目节点 我的凭证处获取,如果没有项目先创建项目
"projectid": "", //项目ID 我的凭证处获取
"add_punc": true, //表示是否在识别结果中添加标点
"digit_norm": true, //表示是否将语音中的数字识别为阿拉伯数字
"interim_results": true, //是否输出中间结果
"vocabulary_id": "", //热词表id 创建方法看 https://support.huaweicloud.com/api-sis/sis_03_0071.html
"engine": "short-audio", //short-audio:一句话接口 https://support.huaweicloud.com/api-sis/sis_03_0095.html
"key": "", //Access Key Id 我的凭证(访问密钥)处创建
"secret": "" //Secret Access Key 创建访问密钥时下载获取
},

/* 多方ASR */
"duofang": {
"type": "duofang",
"appid": "",
"key": "",
"secret": "",
"im":true, //中间结果是否返回
"itn":true, //是否开启文本规整
"pct":true //是否添加标点
},

"asr配置名字:新加ASR配置会自动生效(1分钟之内)": {
"说明": "已经存在的修改type,engine,appid,key,secret 不会生效,如果要修改这几个参数只能新添加一个ASR配置或者重启asrproxy程序,其他参数修改后自动生效"
}
},
"groups":{
//默认使用的ASR
"default":{
"mode":0, //0:顺序使用,当使用数量等于count的时候切换下一个 1:循环使用
"enable": //启用的那些ASR配置
[
"funasr_realtime"
]
},


//自定义组,可以话术中指定使用那组ASR配置。
"custom":{
"mode":0,
"enable":[

]
}
}
},
"tts":{

"storage": "tts", //tts缓存目录
"append_silence": 20, //tts后的声音文件前后追加静音
"trim_threshold_volume": 50, //tts后的声音文件前后小于多少音量认为是静音去除
"listen_ip":"127.0.0.1",
"listen_port": 9989,
"bgtts_thread_count":10,

"interface":{

"aliyun":{
"count":0,
"fault_threshold":0,
"fault_try_interval":600,
"type":"aliyun",
"appid":"",
"key":"",
"secret":""
},

"baidu":{
"connect_timeout":3000,
"response_timeout":60000,
"count":0,
"fault_threshold":0,
"fault_try_interval":600,
"type":"baidu",
"appid":"",
"key":"",
"secret":""
},
//讯飞语音合成接口,开通地址 https://console.xfyun.cn/services/tts
"xfyun": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"rdn": "0", //合成音频数字发音方式,参数说明 https://www.xfyun.cn/doc/tts/online_tts/API.html
"reg": "0", //设置英文发音方式:
"connect_timeout": 3000, //建立ws连接最大等待时间
"response_timeout": 60000, //等待tts返回的最大时间
"type": "xfyun", //xfyun 标识这个配置试用讯飞云ASR引擎
"appid": "", //APPID
"key": "", //APIKey
"secret": "" //APISecret
},
//华为语音合成 https://support.huaweicloud.com/api-sis/sis_03_0111.html
"huawei": {
"connect_timeout": 3000,
"response_timeout": 60000,
"type": "huawei",
"projectname": "", //项目名字实际含义是项目节点 我的凭证处获取,如果没有项目先创建项目
"projectid": "", //项目ID 我的凭证处获取
"key": "", //Access Key Id 我的凭证(访问密钥)处创建
"secret": "" //Secret Access Key 创建访问密钥时下载获取
},
/* 多方TTS */
"duofang": {
"connect_timeout":3000,
"response_timeout":60000,
"type": "duofang",
"appid": "",
"key": "",
"secret": ""
},
/*
"mrcp": {
"count": 0,
"fault_threshold": 0,
"fault_try_interval": 600,
"type": "mrcp",
"engine": "uni2",
"appid": "",
"key": "",
"secret": ""
}
*/

},
"groups":{
"default":{
"mode":1,
"enable":[
"aliyun"
]
},

//自定义组,可以话术中指定使用那组TTS配置。
"custom":{
"mode":0,
"enable":[
]
}
}
}
}