语音回执消息---JAVA

当您使用语音的API接口发送外呼后,可以通过使用MNS的Queue模型来接收语音的回执消息。

消息的订阅

云通信的所有业务消息都会通过MNS消息服务向外发送。目前语音服务支持的消息类型有:

  • VoiceReport(呼叫记录消息)

  • VoiceCallReport(呼叫中间状态消息)

  • VoiceRecordReport(录音记录消息)

您需要先在控制台订阅对应的消息,订阅完消息后,可以拿到消息队列名称(queueName)。比如:Alicom-Queue-xxxxxx-VoiceReport。现在可以使用我们提供的消息服务SDK接收消息了。首先替换你自己的AccessKey ID与AccessKey Secret,然后设置你自己需要获取的消息所对应的消息类型及分配给你的对应消息类型的消息队列,启动应用就可以接收对应的消息了。

说明

不同类型的消息返回的消息体里面包含的字段是不一样的,您需要依据自己订阅的消息做适当的修改。

消息类型

  1. 呼叫记录消息

    消息类型为VoiceReport,你可以通过订阅这个消息获取呼叫的记录信息,包括通话时长,结束原因等。

    消息体格式:

    名称

    类型

    描述

    示例

    call_id

    String

    呼叫ID。

    100001616500^10000187****

    start_time

    String

    通话开始时间,未接通则为空。

    2017-06-01 10:00:00

    end_time

    String

    通话结束时间,未接通则为空。

    2017-06-01 10:00:00

    caller

    String

    主叫号码。

    05711111****

    callee

    String

    被叫号码。

    1390000****

    duration

    String

    通话时长,未接通为0。

    10

    status_code

    String

    呼叫结果状态码。

    200010

    early_media_code

    String

    早媒体结果状态码。

    200010

    hangup_direction

    String

    挂断方向。

    用户、机器

    status_msg

    String

    结果描述。

    执行完成

    out_id

    String

    扩展字段回传,将调用API时传入的字段返回,智能外呼SAAS助手的out_id内容为ALICOM_SMART_SAAS^111111^2222222,其中的111111为批次任务ID。

    123456

    dtmf

    String

    DTMF按键。

    123456

    voice_type

    String

    话单类型。

    • voice:普通话单。

    • asr:asr话单。

    • mart_transfer:智能外呼转接话单。

    voice

    dialog_id

    String

    话术ID。智能外呼SAAS助手专有。

    1000010970001

    toll_type

    String

    通话类型。

    • LOCAL :市话。

    • PROVINCE:省内长途。

    • DOMESTIC: 国内长途。

    • INTERNATIONAL:国际长途。

    LOCAL

  2. 呼叫中间状态消息

    消息类型为VoiceCallReport,你可以通过订阅这个消息获取呼叫的中间状态信息。

    消息体格式:

    名称

    类型

    描述

    示例

    call_id

    String

    呼叫ID。

    100001616500^100001871490

    status_code

    String

    呼叫结果状态码。

    200010

    dtmf

    String

    dtmf消息。

    status_code为300000时,dtmf消息有值

    status_time

    String

    状态产生的时间。

    2017-06-01 10:00:00

    out_id

    String

    扩展字段回传,将调用API时传入的字段返回。

    123456

  3. 消息体格式

    消息类型为VoiceRecordReport,你可以通过订阅这个消息获取呼叫的录音记录消息。

    • 消息体格式:

      名称

      类型

      描述

      示例

      call_id

      String

      呼叫ID。

      100001616500^100001871490

      start_time

      String

      通话开始时间,未接通则为空。

      2017-06-01 10:00:00

      end_time

      String

      通话结束时间,未接通则为空。

      2017-06-01 10:00:00

      duration

      Integer

      通话时长,未接通为0。

      10

      status_code

      String

      呼叫结果状态码。

      200010

      record_file

      String

      录音文件ERL。

      http://xxx

      out_id

      String

      扩展字段回传,将调用API时传入的字段返回。

      123456

      record_begin_time

      String

      录音开始时间。

      2017-06-01 10:00:00

    • 双呼呼叫中间状态说明:

      状态码

      状态码说明

      200101

      开始呼叫主叫

      200102

      开始呼叫被叫

      200201

      主叫响铃

      200202

      被叫响铃

      200102

      主叫接听

      200103

      被叫接听

      200100

      主叫挂机

      200100

      被叫挂机

    • 单呼呼叫中间状态说明:

      状态码

      状态码说明

      200101

      开始呼叫

      200201

      被叫响铃

      200102

      被叫接听

      200100

      呼叫结束

      300000

      dtmf消息

    • 早媒体识别结果状态说明:

      状态码

      状态码说明

      关键字

      200002

      用户占线

      通话中

      200005

      用户无法接通(拒绝)

      不方便接听、正忙或无法接听

      200003

      无应答

      无人接听

      200010

      关机

      关机

      200011

      停机

      停机、欠费、未交电话费、号码已过期、停止使用或暂停服务

      200007

      用户无法接通(不在服务区)

      无法接通或不在服务区

      200004

      空号

      空号、不存在、号码尚未启用或号码有误

      200012

      呼损

      呼叫受限

      200130

      其他(无法识别)

  4. ASR实时消息

    消息类型为VoiceRTASRReport,你可以通过订阅这个消息获取通话的实时文本转换结果。

    消息体格式:

    名称

    类型

    描述

    示例值

    role

    String

    对话内容角色。

    B

    identity

    String

    对话角色的具体身份标识。

    id2

    words

    String

    这个角色说的一句话。

    你好

    begin_offset

    Integer

    相对本次会话起始点的开始时间偏移时间(单位毫秒)。

    1000

    end_offset

    Integer

    相对本次会话起始点的结束时间偏移(单位毫秒)。

    9000

    begin_time

    String

    通话开始时间。

    2017-06-01 10:00:00

    call_id

    String

    呼叫ID。

    10000161****\^10000187****

    out_id

    String

    扩展字段回传,将调用API时传入的字段返回。

    xxxx

技术对接步骤

  1. 下载SDK工具包

    • 下载对应语言的消息DEMO工程,将工程所需要的所有依赖jar包都放在DEMO工程的lib目录下,将对应的jar包引入到您的工程当中即可按照DEMO样例编写接收消息的程序。

    • SDK&DEMO下载地址,请参见SDK及DEMO下载

  2. 编写样例程序

    说明

    调用接口前,需配置环境变量,通过环境变量读取访问凭证。AccessKey ID和AccessKey Secret的环境变量名:VMS_AK_ENV 、VMS_SK_ENV。配置详情请参见配置访问凭证

    /**
     * 只能用于接收云通信的消息,不能用于接收其他业务的消息
     */
    public class ReceiveAlicomMsgDemo {
        private static Log logger=LogFactory.getLog(ReceiveAlicomMsgDemo.class);
    
        static class MyMessageListener implements MessageListener{
            private Gson gson=new Gson();
            @Override
            public boolean dealMessage(Message message) {
                System.out.println("message handle: " + message.getReceiptHandle());
                System.out.println("message body: " + message.getMessageBodyAsString());
                System.out.println("message id: " + message.getMessageId());
                System.out.println("message dequeue count:" + message.getDequeueCount());
    
                try{
                    Map<String,Object> contentMap=gson.fromJson(message.getMessageBodyAsString(), HashMap.class);
                    //依据自己的消息类型,获取对应的字段
                    String callId=(String)contentMap.get("call_id");
                    String startTime=(String)contentMap.get("start_time");
                    String endTime=(String)contentMap.get("end_time");
                    String duration=(String)contentMap.get("duration");
                    String statusCode=(String)contentMap.get("status_code");
                    String statusMsg=(String)contentMap.get("status_msg");
                    String outId=(String)contentMap.get("out_id");
                    String dtmf=(String)contentMap.get("dtmf");
                    //TODO 这里开始写业务代码
    
                }catch(com.google.gson.JsonSyntaxException e){
                   logger.error("error_json_format:"+message.getMessageBodyAsString(),e);
                }
                Boolean dealResult=true;
                return dealResult;//返回true,则工具类自动删除已拉取的消息。
            }
        }
    
        public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException, ParseException {
            DefaultAlicomMessagePuller puller=new DefaultAlicomMessagePuller();
            // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
            // 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
            // 本示例以将AccessKey ID和AccessKey Secret保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里。
            String accessKeyId = System.getenv("VMS_AK_ENV");
            String accessKeySecret = System.getenv("VMS_SK_ENV");
            String messageType="VoiceReport"; //注意替换成你自己需要获取的消息的类型
            String queueName="yourQueueName";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueName
            puller.startReceiveMsg(accessKeyId,accessKeySecret ,messageType,queueName, new MyMessageListener());
        }
    }