当您使用语音的API接口发送外呼后,可以通过使用MNS的Queue模型来接收语音的回执消息。
消息的订阅
云通信的所有业务消息都会通过MNS消息服务向外发送。目前语音服务支持的消息类型有:
VoiceReport(呼叫记录消息)
VoiceCallReport(呼叫中间状态消息)
VoiceRecordReport(录音记录消息)
您需要先在控制台订阅对应的消息,订阅完消息后,可以拿到消息队列名称(queueName)。比如:Alicom-Queue-xxxxxx-VoiceReport。现在可以使用我们提供的消息服务SDK接收消息了。首先替换你自己的AccessKey ID与AccessKey Secret,然后设置你自己需要获取的消息所对应的消息类型及分配给你的对应消息类型的消息队列,启动应用就可以接收对应的消息了。
不同类型的消息返回的消息体里面包含的字段是不一样的,您需要依据自己订阅的消息做适当的修改。
消息类型
呼叫记录消息
消息类型为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
呼叫中间状态消息
消息类型为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
消息体格式
消息类型为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
其他(无法识别)
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
技术对接步骤
下载SDK工具包
下载对应语言的消息DEMO工程,将工程所需要的所有依赖jar包都放在DEMO工程的lib目录下,将对应的jar包引入到您的工程当中即可按照DEMO样例编写接收消息的程序。
SDK&DEMO下载地址,请参见SDK及DEMO下载。
编写样例程序
说明调用接口前,需配置环境变量,通过环境变量读取访问凭证。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()); } }