阿里云云呼叫中心

智能对话分析已和阿里云云呼叫中心完成对接,目前有两种对接方式:自动对接和手动对接。

自动对接

云呼叫中心产生的录音支持自动推送到智能对话分析进行质检分析,如需进一步了解,请点击质检推送管理

手动对接

若自动对接不符合您的要求,可以考虑通过接入SDK方式发起质检分析。

流程为:

  1. 调用云呼SDK的GetUploadAudioDataParams接口,获取云呼音频信息。

    具体说明参考GetUploadAudioDataParams

  2. 组装入参信息jsonStr。

    具体说明参考上传音频质检

  3. 调用智能对话分析的UploadAudioData接口,发起质检分析。

以Java代码为例:

maven依赖,接入云呼和质检SDK,其中fastjson可选。

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>ccc20200701</artifactId>
            <version>2.6.7</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-qualitycheck</artifactId>
            <version>3.0.7</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.0.6</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83_noneautotype</version>
        </dependency>

完整调用demo(入口为main方法):

说明

调用接口前,需配置环境变量,通过环境变量读取访问凭证。关于配置环境变量的操作,请参见JAVA SDK-使用说明-配置访问凭证

云呼叫中心的AccessKey ID和AccessKey Secret的环境变量名:CC_AK_ENV CC_SK_ENV

智能对话分析的AccessKey ID和AccessKey Secret的环境变量名:SCA_AK_ENVSCA_SK_ENV

package com.aliyun.sample;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.ccc20200701.models.GetUploadAudioDataParamsResponse;
import com.aliyun.tea.TeaException;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.qualitycheck.model.v20190115.UploadAudioDataRequest;
import com.aliyuncs.qualitycheck.model.v20190115.UploadAudioDataResponse;

/**
 * 从云呼叫中心获取音频信息到发起音频质检链路Demo
 * 需要准备内容:
 * 1.云呼叫中心音频对应的contactId和instanceId
 * 2.(可选)UploadAudioData的jsonStr中的其他参数,按需添加
 */
public class Sample {

    /**
     * 此处通过从环境变量中读取AccessKey,初始化云呼叫中心Client
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.ccc20200701.Client createCCClient() throws Exception {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户
        // 此处以把AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里
        // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setAccessKeyId(System.getenv("CC_AK_ENV"))
                .setAccessKeySecret(System.getenv("CC_SK_ENV"));
        // 云呼叫中心服务接入的地址,此处以cn-shanghai为例
        config.endpoint = "ccc.cn-shanghai.aliyuncs.com";
        return new com.aliyun.ccc20200701.Client(config);
    }

    /**
     * 此处通过从环境变量中读取AccessKey,初始化智能对话分析Client
     * @return Client
     * @throws Exception
     */
    public static IAcsClient createSCAClient() throws Exception {
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户
        // 此处以把AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里
        // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", System.getenv("SCA_AK_ENV"), System.getenv("SCA_SK_ENV"));
        //指定服务接入地址,以下值为固定
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Qualitycheck", "qualitycheck.cn-hangzhou.aliyuncs.com");

        return new DefaultAcsClient(profile);
    }


    /**
     * 调用云呼叫中心SDK,获取音频的相关参数
     * @param args_
     * @throws Exception
     */
    public static void main(String[] args_) throws Exception {

        /**
         * 1.调用云呼叫中心SDK,获取音频信息
         * 详细调用示例,请参见https://help.aliyun.com/document_detail/450651.html
         * 云呼叫中心音频对应的contactId和instanceId,您可以通过云呼叫中心控制台查询
         */
        String ccAudioStr = getParamStr("contactId","instanceId");

        /**
         * ccAudioStr返回示例:其中validTimes,channels为必要数据,其他按需获取
         * {
         *     "autoSplit":1,
         *     "appKey":1**********1,
         *     "sampleRate":8,
         *     "callList":[
         *         {
         *             "callId":"job-2********8",
         *             "validTimes":[
         *                 {
         *                     "begin_time":0,
         *                     "end_time":67060,
         *                     "speaker_id":"xuan"
         *                 }
         *             ],
         *             "resolveType":"ali-ACC",
         *             "instance":"report-test-2",
         *             "callee":"1********2",
         *             "accUid":1********1,
         *             "callStartTime":1659444574225,
         *             "customerServiceName":"x****qi",
         *             "tid":"760427ac-fa3f-4785-8286-1cb2cf3104b9",
         *             "callType":1,
         *             "skillGroupUUID":"listTest@report-test-2",
         *             "caller":"0********8",
         *             "customerServicePhone":"8********7",
         *             "channels":[
         *                 {
         *                     "speaker_id":"x****o",
         *                     "channel_key":"ch-user-1********2-8********7-1********6-job-2********8"
         *                 }
         *             ],
         *             "sourceType":1,
         *             "channelKey":"ch-user-1********2-8********7-1********6-job-2********8",
         *             "skillGroupName":"listTest",
         *             "voiceFileUrl":"https://ccc-v2-staging.oss-cn-hangzhou.aliyuncs.com/ccc-record-mixed/report-test-2/2022/08/job-2********8.mkv?Expires=1663124613&OSSAccessKeyId=L********q&Signature=bxLnpftFnn4h1GU1FqPPrgvGrCk%3D#v2",
         *             "skillGroupId":0,
         *             "customerServiceId":2**********4
         *         }
         *     ]
         * }
         */

        /**
         * 2. 组装调用参数
         */
        String jsonStr = assemble(ccAudioStr);
        /**
         * jsonStr返回示例:其中validTimes,channels,voiceFileUrl,audioType为必要数据,其他按需获取
         * {
         *     "callList":[
         *         {
         *             "audioType":"ali-mkv",
         *             "validTimes":[
         *                 {
         *                     "begin_time":0,
         *                     "end_time":67060,
         *                     "speaker_id":"x****i"
         *                 }
         *             ],
         *             "channels":[
         *                 {
         *                     "speaker_id":"x****i",
         *                     "channel_key":"ch-user-1********2-8********7-1********6-job-2********8"
         *                 }
         *             ],
         *             "voiceFileUrl":"https://ccc-v2-staging.oss-cn-hangzhou.aliyuncs.com/ccc-record-mixed/report-test-2/2022/08/job-2********8.mkv?Expires=1663124613&OSSAccessKeyId=L********q&Signature=bxLnpftFnn4h1GU1FqPPrgvGrCk%3D#v2",
         *         }
         *     ]
         * }
         */
        /**
         * 3. 调用智能对话分析SDK发起音频质检任务
         * 详细文档请参见https://help.aliyun.com/document_detail/139399.html
         */
        uploadAudioData(jsonStr);
    }

    /**
     * 获取音频信息,作为调用UploadAudioData的入参
     * 云呼叫中心音频对应的contactId和instanceId,您可以通过云呼叫中心控制台查询
     * @param contactId 会话Id
     * @param instanceId 实例Id
     * @throws Exception
     */
    public static String getParamStr(String contactId,String instanceId) throws Exception {
        com.aliyun.ccc20200701.Client client = Sample.createCCClient();
        com.aliyun.ccc20200701.models.GetUploadAudioDataParamsRequest getUploadAudioDataParamsRequest = new com.aliyun.ccc20200701.models.GetUploadAudioDataParamsRequest();
        getUploadAudioDataParamsRequest.setContactId(contactId);
        getUploadAudioDataParamsRequest.setInstanceId(instanceId);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            GetUploadAudioDataParamsResponse uploadAudioDataParamsWithOptions = client.getUploadAudioDataParamsWithOptions(getUploadAudioDataParamsRequest, runtime);
            // 如有需要,您可以添加自己的记录日志逻辑
            System.out.println(uploadAudioDataParamsWithOptions.getBody().getData().getParamsStr());
            return uploadAudioDataParamsWithOptions.getBody().getData().getParamsStr();
        } catch (TeaException error) {
            // 如有需要,您可以添加自己的记录错误日志逻辑
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,您可以添加自己的记录错误日志逻辑
            com.aliyun.teautil.Common.assertAsString(error.message);
        }
        return null;
    }

    /**
     * 按需组装jsonStr,此处只展示必要条件
     * @param ccAudioStr
     * @return
     */
    public static String assemble(String ccAudioStr) {
        JSONObject jsonStrObject = new JSONObject();
        JSONObject ccStrObject = JSON.parseObject(ccAudioStr);

        JSONArray callList = ccStrObject.getJSONArray("callList");
        JSONArray jsonStrCallList = new JSONArray();
        callList.add(
                new JSONObject()
                        .fluentPut("validTimes",callList.getJSONObject(0).getJSONObject("validTimes"))
                        .fluentPut("channels",callList.getJSONObject(0).getJSONObject("channels"))
                        .fluentPut("voiceFileUrl",callList.getJSONObject(0).getString("voiceFileUrl"))
                        //此处必须传入参数audioType=ali-mkv
                        .fluentPut("audioType","ali-mkv")
        );
        jsonStrObject.put("callList",jsonStrCallList);
        //可以在此基础上添加其他参数,实现您个性化的业务逻辑
        System.out.println(jsonStrObject.toJSONString());
        return jsonStrObject.toJSONString();
    }

    public static void uploadAudioData(String ccAudioStr) {
        UploadAudioDataRequest req = new UploadAudioDataRequest();
        req.setJsonStr(ccAudioStr);
        try {
            UploadAudioDataResponse response = createSCAClient().getAcsResponse(req);
            System.out.println(response.getCode());
            System.out.println(response.getMessage());
            System.out.println(response.getData());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}