呼叫中心系统如果对接阿里灵积大模型

简介: 自chatgpt3.5发布以来,各种大模型飞速发展,各行各业都有接入大模型的需求,呼叫中心行业非常适合通过接入大模型用AI来回答用户的各种咨询,降低人力资源,使用顶顶通呼叫中心中间件,只需要100行不到的代码,就可以非常简单容易的让电话机器人系统,呼叫中心系统快速接入各种大模型

介绍

自chatgpt3.5发布以来,各种大模型飞速发展,各行各业都有接入大模型的需求,呼叫中心行业非常适合通过接入大模型用AI来回答用户的各种咨询,降低人力资源,使用顶顶通呼叫中心中间件,只需要100行不到的代码,就可以非常简单容易的让电话机器人系统,呼叫中心系统快速接入各种大模型

流程图

在这里插入图片描述

  1. 用户语音提问->cti中间件语音转文字->返回识别的文字->提交给java接口->向大模型提问->大模型返回答案->文字转语音->返回转换后的声音文件->对用户播放大模型答案的文件

大模型返回慢怎么处理

可以改成多线程处理,创建新线程提交问题给大模型后,先播放一个提示音:正在处理中,清稍等 ,然后等待大模型返回后通过流式TTS播放大模型返回的文本内容。
如果大模型可以逐步返回识别结果,也可以遇到逗号就把逗号之前的内容通过实时TTS播放。

测试方法

可以联系顶顶通进行对接测试

用法说明

准备工作

  1. 配置了java 环境,安装了Maven 环境。
  2. 安装了FreeSWITCH。
  3. 安装了顶顶通语音接口。
  4. 下载ccAdmin和sipphone。
  5. 申请了阿里灵积大模型api_key。
  6. 申请了讯飞星火认知大模型api_key

相关资料

  1. 顶顶通呼叫中心中间件接口文档 http://www.ddrj.com/callcenter/httpflow.html
  2. java程序和顶顶通呼叫中心中间件 对接方法 https://blog.csdn.net/qq_52528295/article/details/134186331
  3. 阿里灵积大模型接口文档 https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key?spm=a2c4g.11186623.0.0.588216e9CpLp2k

对接阿里灵积大模型例子代码

完整代码可以github https://github.com/ddtxu/ddtlinji获取

package com.ddt.controller;

import cn.hutool.core.util.StrUtil;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationOutput;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.aigc.generation.models.QwenParam;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.MessageManager;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import redis.clients.jedis.Jedis;

import java.time.LocalDateTime;
import java.util.*;

@RestController
@RequestMapping("/test")
@Slf4j
public class DDTestController {
   
   
    @Value("${constants.apiKey}")
    private String apiKey;

    @PostMapping("/question")
    public Map<String, Object> flow(@RequestBody Map<String, Object> tokenMap) throws Exception {
   
   
        String asrAddr = "127.0.0.1:9988";
        String ttsAddr = "ws://127.0.0.1:9989/tts";
        Long timestamp = (Long) tokenMap.get("timestamp");
        String method = (String) tokenMap.get("method");
        String callid = (String) tokenMap.get("callid");
        String appid = (String) tokenMap.get("appid");
        Map<String, Object> resultMap = new HashMap<>();
        if ("create".equals(method)) {
   
   
            String callSource = (String) tokenMap.get("call_source");
            log.info("callSource ===>{}", callSource);
            String sourceName = (String) tokenMap.get("source_name");
            log.info("sourceName ===>{}", sourceName);
            Map<String, Object> ttsMap = new HashMap<>();
            resultMap.put("action", "cti_play_and_detect_speech");
            String date = LocalDateTime.now().toString();
            resultMap.put("argument", "'1' '64' '0' '0.8' '" + asrAddr + "' '120' '800' '5000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
            ttsMap.put("ttsurl", ttsAddr);
            ttsMap.put("ttsvoicename", "x4_lingxiaoxuan_en");
            ttsMap.put("ttsconfig", "");
            ttsMap.put("ttsengine", "");
            ttsMap.put("ttsvolume", 0);
            ttsMap.put("ttsspeechrate", 0);
            ttsMap.put("ttspitchrate", 0);
            resultMap.put("tts", ttsMap);
            resultMap.put("privatedata", "test");
            List<String> list = Arrays.asList("欢迎来到顶顶通对接灵积大模型-通义千问的程序,请向大模型提问吧!");
            resultMap.put("playbacks", list);
            resultMap.put("quickresponse", true);
            resultMap.put("log", "create succeed");
        } else if ("input".equals(method)) {
   
   
            String privatedata = (String) tokenMap.get("privatedata");
            log.info("privatedata ===>{}", privatedata);
            String input_type = (String) tokenMap.get("input_type");
            log.info("input_type ===>{}", input_type);
            String input_args = (String) tokenMap.get("input_args");
            log.info("input_args ===>{}", input_args);
            Long input_start_time = (Long) tokenMap.get("input_start_time");
            log.info("input_start_time ===>{}", input_start_time);
            Integer input_duration = (Integer) tokenMap.get("input_duration");
            log.info("input_duration ===>{}", input_duration);
            //机器人没放音 0  在放音有时间
            Integer play_progress = (Integer) tokenMap.get("play_progress");
            log.info("play_progress ===>{}", play_progress);
            if ("complete".equals(input_type)) {
   
   
                if (input_args.contains("hangup")) {
   
   
                    resultMap.put("action", "hangup");
                    resultMap.put("log", "挂机");
                } else {
   
   
                    resultMap.put("action", "cti_play_and_detect_speech");
                    String date = LocalDateTime.now().toString();
                    resultMap.put("argument", "'1' '1' '0' '0.8' '" + asrAddr + "' '120' '800' '5000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
                    resultMap.put("privatedata", "test");
                    resultMap.put("playbacks", Collections.singletonList("您可以继续向我提问"));
                    resultMap.put("quickresponse", true);
                    resultMap.put("log", "重新开始放音");
                }
            } else {
   
   
                String prefix = StrUtil.sub(input_args, 0, 1);
                String text = StrUtil.subSuf(input_args, 1);
                if ("S".equals(prefix)) {
   
   
                    if (!"stop".equals(privatedata)) {
   
   
                        if (play_progress > 0) {
   
   
                            resultMap.put("commands", Collections.singletonList("uuid_cti_play_and_detect_speech_break_play " + callid));
                            resultMap.put("privatedata", "stop");
                            resultMap.put("log", "停止放音,但是不停止ASR识别。模拟关键词打断");
                        }
                    }
                } else if ("F".equals(prefix)) {
   
   
                    if (text.contains("挂断")) {
   
   
                        resultMap.put("action", "hangup");
                        resultMap.put("privatedata", "test");
                        resultMap.put("playbacks", Collections.singletonList("谢谢你的测试,再见"));
                        resultMap.put("log", "挂机");
                    }
                    else{
   
   
                        if(0<play_progress&&text.length()>3||0==play_progress){
   
   
                            String str = callWithMessage(text,apiKey);
                            resultMap.put("action", "cti_play_and_detect_speech");
                            String date = LocalDateTime.now().toString();
                            resultMap.put("argument", "'0' '1' '0' '0.8' '" + asrAddr + "' '120' '800' '5000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
                            resultMap.put("privatedata", "test");
                            //回答的问题转语音
                            resultMap.put("playbacks", Collections.singletonList(str));
                            resultMap.put("quickresponse", true);
                            resultMap.put("log", "播放识别结果");
                        }
                    }
                }
                if ("D".equals(prefix)) {
   
   
                    resultMap.put("action", "cti_play_and_detect_speech");
                    String date = LocalDateTime.now().toString();
                    resultMap.put("argument", "'1' '1' '0' '0.8' '" + asrAddr + "' '120' '800' '10000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
                    resultMap.put("privatedata", "test");
                    resultMap.put("dtmf_terminators", "#");
                    resultMap.put("playbacks", Arrays.asList("刚刚的按键内容是", text, "请继续按键测试吧,并以#号键结束"));
                    resultMap.put("log", "按键识别结果");
                } else {
   
   
                    resultMap.put("log", "no processing");
                }
            }
        } else if ("destory".equals(method)) {
   
   
            resultMap.put("log", "destory succeed");
        }
        return resultMap;
    }
    public  String callWithMessage( String text,String apiKey) throws NoApiKeyException, ApiException, InputRequiredException {
   
   
        Constants.apiKey = apiKey;
        Generation gen = new Generation();
        MessageManager msgManager = new MessageManager(10);
        Message userMsg = Message.builder().role(Role.USER.getValue()).content(text).build();
        msgManager.add(userMsg);
        QwenParam param = QwenParam.builder().model(Generation.Models.QWEN_TURBO).messages(msgManager.get())
                .resultFormat(QwenParam.ResultFormat.MESSAGE)
                .topP(0.8)
                .enableSearch(true)
                .build();
        GenerationResult result = gen.call(param);
        if("".equals(result.getOutput().getChoices().get(0))){
   
   
            return "";
        }else {
   
   
            GenerationOutput.Choice choice = result.getOutput().getChoices().get(0);
            return choice.getMessage().getContent();
        }
    }


}

对接讯飞星火认知大模型例子代码

完整代码github获取 https://github.com/ddtxu/ddtxf

package com.zhulang.xfxhsimple.controller;

import cn.hutool.core.util.StrUtil;
import com.zhulang.xfxhsimple.component.XfXhStreamClient;
import com.zhulang.xfxhsimple.config.XfXhConfig;
import com.zhulang.xfxhsimple.dto.MsgDTO;
import com.zhulang.xfxhsimple.listener.XfXhWebSocketListener;
import lombok.extern.slf4j.Slf4j;
import okhttp3.WebSocket;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;

@RestController
@RequestMapping("/testone")
@Slf4j
public class DDTestController {
   
   

    @Resource
    private XfXhStreamClient xfXhStreamClient;

    @Resource
    private XfXhConfig xfXhConfig;

    @PostMapping("/flowtest")
    public Map<String, Object> flow(@RequestBody Map<String, Object> tokenMap) throws Exception {
   
   
        String asrAddr = "127.0.0.1:9988";
        String ttsAddr = "ws://127.0.0.1:9989/tts";
        Long timestamp = (Long) tokenMap.get("timestamp");
        String method = (String) tokenMap.get("method");
        String callid = (String) tokenMap.get("callid");
        String appid = (String) tokenMap.get("appid");
        Map<String, Object> resultMap = new HashMap<>();
        if ("create".equals(method)) {
   
   
            String callSource = (String) tokenMap.get("call_source");
            log.info("callSource ===>{}", callSource);
            String sourceName = (String) tokenMap.get("source_name");
            log.info("sourceName ===>{}", sourceName);
            Map<String, Object> ttsMap = new HashMap<>();
            resultMap.put("action", "cti_play_and_detect_speech");
            String date = LocalDateTime.now().toString();
            resultMap.put("argument", "'1' '64' '0' '0.8' '" + asrAddr + "' '120' '800' '5000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
            ttsMap.put("ttsurl", ttsAddr);
            ttsMap.put("ttsvoicename", "x4_lingxiaoxuan_en");
            ttsMap.put("ttsconfig", "");
            ttsMap.put("ttsengine", "");
            ttsMap.put("ttsvolume", 0);
            ttsMap.put("ttsspeechrate", 0);
            ttsMap.put("ttspitchrate", 0);
            resultMap.put("tts", ttsMap);
            resultMap.put("privatedata", "test");
            List<String> list = Arrays.asList("欢迎进入顶顶通对接讯飞大模型的程序", "请问您有什么问题想向我提问的呢?");
            resultMap.put("playbacks", list);
            //播放等待音乐
//            resultMap.put("sound_file_dir", "/ddt/fs/sounds/cti/acd");
            resultMap.put("quickresponse", true);
            resultMap.put("log", "create succeed");
        } else if ("input".equals(method)) {
   
   
            String privatedata = (String) tokenMap.get("privatedata");
            log.info("privatedata ===>{}", privatedata);
            String input_type = (String) tokenMap.get("input_type");
            log.info("input_type ===>{}", input_type);
            String input_args = (String) tokenMap.get("input_args");
            log.info("input_args ===>{}", input_args);
            Long input_start_time = (Long) tokenMap.get("input_start_time");
            log.info("input_start_time ===>{}", input_start_time);
            Integer input_duration = (Integer) tokenMap.get("input_duration");
            log.info("input_duration ===>{}", input_duration);
            //机器人没放音 0  在放音有时间
            Integer play_progress = (Integer) tokenMap.get("play_progress");
            log.info("play_progress ===>{}", play_progress);


            if ("complete".equals(input_type)) {
   
   
                if (input_args.contains("hangup")) {
   
   
                    resultMap.put("action", "hangup");
                    resultMap.put("log", "挂机");
                } else {
   
   
                    resultMap.put("action", "cti_play_and_detect_speech");
                    String date = LocalDateTime.now().toString();
                    resultMap.put("argument", "'1' '1' '0' '0.8' '" + asrAddr + "' '120' '800' '5000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
                    resultMap.put("privatedata", "test");
                    resultMap.put("playbacks", Collections.singletonList("您可以继续向我提问"));
                    resultMap.put("quickresponse", true);
                    resultMap.put("log", "重新开始放音");
                }
            } else {
   
   
                String prefix = StrUtil.sub(input_args, 0, 1);
                String text = StrUtil.subSuf(input_args, 1);
                if ("S".equals(prefix)) {
   
   
                    if (!"stop".equals(privatedata)) {
   
   
                        if (play_progress > 0) {
   
   
                            resultMap.put("commands", Collections.singletonList("uuid_cti_play_and_detect_speech_break_play " + callid));
                            resultMap.put("privatedata", "stop");
                            resultMap.put("log", "停止放音,但是不停止ASR识别。模拟关键词打断");
                        }
                    }
                } else if ("F".equals(prefix)) {
   
   
                    if (text.contains("挂断")) {
   
   
                        resultMap.put("action", "hangup");
                        resultMap.put("privatedata", "test");
                        resultMap.put("playbacks", Collections.singletonList("谢谢您的提问,再见"));
                        resultMap.put("log", "挂机");
                    }
                    else{
   
   
                        if(0<play_progress&&text.length()>3||0==play_progress) {
   
   
                            String str = sendQuestion(text);
                            resultMap.put("action", "cti_play_and_detect_speech");
                            String date = LocalDateTime.now().toString();
                            resultMap.put("argument", "'0' '1' '0' '0.8' '" + asrAddr + "' '120' '800' '5000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
                            resultMap.put("privatedata", "test");
                            resultMap.put("playbacks", Arrays.asList(str));
                            resultMap.put("quickresponse", true);
                            resultMap.put("log", "播放识别结果");
                        }
                    }
                }
                if ("D".equals(prefix)) {
   
   
                    resultMap.put("action", "cti_play_and_detect_speech");
                    String date = LocalDateTime.now().toString();
                    resultMap.put("argument", "'0' '1' '0' '0.8' '" + asrAddr + "' '120' '800' '10000' '20000' '' '' '" + appid + "' '1' '" + date + "' 'wav'");
                    resultMap.put("privatedata", "test");
                    resultMap.put("dtmf_terminators", "#");
                    resultMap.put("playbacks", Arrays.asList("刚刚的按键内容是", text, "请继续按键测试吧,并以#号键结束"));
                    resultMap.put("log", "按键识别结果");
                } else {
   
   
                    resultMap.put("log", "no processing");
                }
            }
        } else if ("destory".equals(method)) {
   
   
            resultMap.put("log", "destory succeed");
        }
        return resultMap;
    }


    private String sendQuestion( String question) {
   
   
        String answer = "";
        Map<String, Object> resultMap = new HashMap<>();
        // 如果是无效字符串,则不对大模型进行请求
        if (StrUtil.isBlank(question)) {
   
   
            log.info("提问讯飞大模型 无效问题,请重新输入  ===>{}", question);
            return  "无效问题,请重新输入";
        }
        // 获取连接令牌
        if (!xfXhStreamClient.operateToken(XfXhStreamClient.GET_TOKEN_STATUS)) {
   
   
            log.info("提问讯飞大模型 当前大模型连接数过多,请稍后再试  ===>{}", question);
            return  "当前大模型连接数过多,请稍后再试";
        }

        // 创建消息对象
        MsgDTO msgDTO = MsgDTO.createUserMsg(question);
        // 创建监听器
        XfXhWebSocketListener listener = new XfXhWebSocketListener();
        // 发送问题给大模型,生成 websocket 连接
        WebSocket webSocket = xfXhStreamClient.sendMsg(UUID.randomUUID().toString().substring(0, 10), Collections.singletonList(msgDTO), listener);
        if (webSocket == null) {
   
   
            // 归还令牌
            xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
            log.info("提问讯飞大模型 系统内部错误,请联系管理员  ===>{}", question);
            answer = "系统内部错误,请联系管理员";
        }
        try {
   
   
            int count = 0;
            // 为了避免死循环,设置循环次数来定义超时时长
            int maxCount = xfXhConfig.getMaxResponseTime() * 5;
            while (count <= maxCount) {
   
   
                Thread.sleep(200);
                if (listener.isWsCloseFlag()) {
   
   
                    break;
                }
                count++;
            }
            if (count > maxCount) {
   
   
                log.info("大模型响应超时,请联系管理员  ===>{}", question);
                return  "大模型响应超时,请联系管理员";
            }
            // 响应大模型的答案
            return answer = listener.getAnswer().toString();
        } catch (InterruptedException e) {
   
   
            log.error("错误:" + e.getMessage());
            log.info("提问讯飞大模型 系统内部错误,请联系管理员 ===>{}", e.getMessage());
            return answer = "系统内部错误,请联系管理员";
        } finally {
   
   
            // 关闭 websocket 连接
            webSocket.close(1000, "");
            // 归还令牌
            xfXhStreamClient.operateToken(XfXhStreamClient.BACK_TOKEN_STATUS);
        }
    }




}
相关文章
|
6月前
使用OKCC呼叫中心系统的客户体验分析
案例1.某教培公司 招生旺季到来,很多教育机构都是以电话形式进行招生,回访学生家长,作为电销人员,每天的工作量特别特别大,号码需要一个一个手动输入再拨打,而且绝大部分都还是无效的,如空号、黑名单、没接通、没意向等等。 用我们OKCC人工坐席外呼系统就可以为电销人员一键呼叫,只需批量导入客户资料,无需手动输入号码,还可根据自身业务需求,灵活选取合适的呼叫方式。支持智能二次检测号码质量,过滤空号、错号、接通意向低等无效号码,提升外呼效率及员工积极性。
|
1月前
|
存储 安全 网络安全
okcc呼叫中心系统如何实现客户号码脱敏?
OKCC系统实现号码脱敏的关键步骤包括: 数据加密:使用加密算法对客户号码进行存储加密。 数据脱敏展示:在系统界面上用星号或其他字符替换号码的部分或全部数字。 权限控制:限制对敏感号码数据的访问权限,仅授权人员可查看。 审计日志:记录所有敏感信息的访问和操作日志,以便追踪。 安全审核:定期进行安全检查和渗透测试,确保脱敏措施有效。
|
2月前
|
Web App开发 前端开发 JavaScript
如何快速与呼叫中心系统CTI/API/SDK接口集成
由于呼叫中心系统涉及通信、CTI、终端设备、中继线路等技术与概念,从事信息管理系统、ERP、CRM、工单系统等的研发人员一般不是非常熟悉这部分技术,当需要提供具备呼叫中心能力的解决方案时,往往要用较多的时间来研究这些相对复杂的技术,对接过程比较长,开发调试有一定的阻力,基于此,我们提出一种更加简便高效的集成方法,可以零代码集成呼叫中心平台,实现项目快速上线。
如何快速与呼叫中心系统CTI/API/SDK接口集成
|
3月前
|
缓存
okcc呼叫中心系统坐席账户显示离线状态要怎么设置
如果 OKCC 坐席账户显示离线状态,可以尝试以下解决方案: 1. 检查网络连接:确保你的设备已连接到稳定的互联网网络。检查网络连接并重试登录,确保网络连接正常,并且没有任何限制或故障。 2. 重新登录:尝试退出 OKCC 坐席账户并重新登录。有时候重新登录可以解决账户离线状态的问题。 3. 清除缓存和数据:进入设备的设置,找到 OKCC 坐席应用,清除其缓存和数据。然后重新启动应用并尝试登录。 4.查看当前坐席创建的数量是否已超出坐席授权数量。 5. 登陆客户管理员账户,设置->业务中是否勾选“不允许通过web修改坐席状态”的选项。 6. 更新应用版本:确保你的 OKCC 坐席应
|
3月前
|
人工智能 安全 Ubuntu
vos3000网络电话系统怎样搭建?外呼系统ai智能呼叫中心搭建
要搭建VOS3000网络电话系统,可以按照以下步骤进行操作: 获取VOS3000软件:首先,你需要从正规渠道获取VOS3000软件安装包。VOS3000是商业软件,需要购买授权。 准备服务器:你需要准备一台专用服务器,操作系统通常建议选择Linux,如CentOS或Ubuntu等版本。确保服务器具备足够的硬件资源,如CPU、内存和存储空间。 安装操作系统:在服务器上安装所选的Linux操作系统,并进行基本的系统配置和安全设置。 安装VOS3000软件:运行VOS3000软件安装包,按照安装向导进行安装。需要提供购买软件时获得的授权密钥。 配置网络和端口:在服务器上配置网络设置和端口,
|
6月前
|
机器人 数据中心
okcc呼叫中心系统搭建的方案方式
传统企业呼叫中心多采用 PC和手机软件,很难与客户保持良好的沟通。因此,需要建设一套呼叫中心系统来实现与客户实时有效沟通。那么,呼叫中心搭建的方案方式有哪些呢?有关系统问题欢迎和博主技术交流,下面详细介绍一下。   一:建设呼叫中心服务器   通过安装系统专用软件,实现呼叫中心系统的搭建,这种方式成本低,但不能实时运行,稳定性差,一旦出现故障,不能保障客服人员的正常工作。还有一种方式,是建设呼叫中心服务器,利用服务器来实现与客户及时沟通。这种方式成本高,但可根据需要灵活选择,其灵活性强。   二:搭建多机电话平台   传统的电话平台采用的是“分机”的方式,即一个呼叫中心有两个以上不同的
|
7月前
|
存储 数据采集 监控
okcc呼叫中心系统有什么优势
在随着企业的管理水平也在不断提高。企业经营管理中所涉及到的各种复杂问题都有逐渐凸显出来。传统的呼叫中心已无法满足企业服务需求和客户满意度变化的要求。因此通过呼叫中心系统将企业业务流程和数据整合起来进行管理和运营已经成为目前企业管理领域中较为流行和成熟之选。有关系统问题欢迎和博主交流。   优势一:提高工作效率 呼叫中心系统通过集成网络呼叫系统、电话、手机等各种通讯方式,实现客户的即时通讯和业务处理。并将多种业务流程集成到一起,提高了企业运作效率。同时各系统的通讯方式,为企业提供快速、灵活、可靠的信息沟通渠道,从而帮助企业实现了在用户需求发生时,能够及时、准确、有效地满足客户的需求。
|
7月前
|
编解码
OKCC呼叫中心系统都有哪些功能
OKCC呼叫中心是一套完整的电话呼叫中心解决方案,它能够兼容市场上绝大多数的支持标准SIP协议的终端网关以及众方系传统的MGCP协议终端网关,并且经受住了市场的考验并获得了一致好评,业内有关其它厂商录音业务的痛点,在呼叫中心给出了很好的解决方案。下面我们来详细介绍相关内容。
|
7月前
|
数据库
外呼系统和呼叫中心系统的优势和特点
在金融投资、教育培训、保险、互联网、旅游、房地产、广告等行业服务或产品电话营销中;在节日促销、招商加盟、活动通知等项目中;作为企业的管理者的您,是否还在因为销售人员效率低,人员成本高等问题头疼? 其实,您只是需要一套功能强大的电话外呼系统,这些问题便可以迎刃而解,电话外呼系统,帮助企业轻松外呼,有序管理,节省成本,提升业绩。电话外呼系统的主要操作步骤就是一、将客户信息导入系统,二、利用系统的自动外呼功能将电话统一拨打出去,并把空号,关机,无人接听等电话自动过滤。当电话接通后,马上转接到坐席人员进行实时通话。这些功能都大大减少了人工手动操作的时间,这就是优势之一。有关系统问题欢迎和博主交流
|
7月前
|
存储 BI
okcc呼叫中心系统对企业的价值体现
呼叫中心(外呼系统)对于企业管理层来说,在员工的管理和数据的统计都有着显著的效果。下面小编为您总结一下呼叫中心系统对企业有哪些用处。 一、通话市场的记录及统计 比如销售人员外呼电话时长和个数的统计,意向客户的备注和统计,形成客户资料管理、以及完善的话务统计报表等管理数据。 二、分支机构业绩管理 大多数公司都面临着分支机构的管理问题,而业绩的管理首当其冲。全国各地分校和门店众多公司的管理挑战尤其大。新高度就针对这一问题设计了数据推送功能,将各地的分支机构和遍布全国的分公司、分校和门店的数据推送至总部数据存储服务器,从而帮助企业横向对比各地区的业绩,并了解业绩差距的原因并进行有针对性的管理