一、语音通知
语音通知是指通过调用语音呼叫的API,从运营商网络向指定号码发起一通呼叫,呼叫被应答后,播放一段指定的音频。
根据音频形式的不同,语音通知的API分为两个:
- 若播放的音频为固定内容的音频文件(mp3/wav),则调用语音文件外呼接口 。
- 若播放的音频为带有变量的文本模板,每次调用时根据变量替换值从文本模板转化为音频文件,则调用文本转语音外呼接口。
二、语音通知开通流程
- 购买语音号码
- 创建语音模板
- 语音资质审核标准
- 语音权限访问控制
三、API接口
A、拨打接口
(1)SingleCallByVoice
调用接口SingleCallByVoice发起语音文件类型的语音通知。
(2)SingleCallByTts
调用接口SingleCallByTts发起语音通知,播放的音频为文本转语音模板转换后的音频文件。
(3)IvrCall(有按键回复)
调用接口IvrCall发起交互式语音通话。
接口IvrCall用于发起交互式语音通话。用户接听到电话后,播放一段语音,提示用户按键进行选择,如果开启了消息回执,语音平台会返回客户按键信息给调用的业务系统。该接口可用于收集客户的订单确认、问卷调查、满意度调查等信息。
B、消息回执
语音服务提供的回执消息类型包括:
(1)呼叫记录消息(VoiceReport)
订阅呼叫记录消息(VoiceReport)可以在呼叫结束后获取呼叫的记录信息,包括通话类型、通话的开始及结束时间、通话时长、结束原因等。
(2)录音记录消息(VoiceCallReport)
订阅呼叫中间状态消息(VoiceCallReport),可以获取呼叫过程中的通话状态的信息,通常包括开始、振铃、接听、挂断以及状态产生的时间等。
(3)呼叫记录消息(VoiceRecordReport)
订阅录音记录消息(VoiceRecordReport),可以在通话结束后获取通话的录音记录。
(4)ASR实时消息(VoiceRTASRReport)
订阅ASR实时消息(VoiceRTASRReport),可以获取点击拨号通话中的实时文本转换结果。
四、JAVA SDK
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.1.0</version>
</dependency
(1)交互式语音应答(ivrCall)
1:下载SDK工具包
SDK工具包中一共包含了2个类库,一个aliyun-java-sdk-core包,另外一个是alicom-dyvms-api包,将这两个包执行mvn package命令或者mvn deploy命令打包出相应的jar包,添加到工程类库中依赖使用。
SDK&DEMO[下载地址]
2: 编写样例程序
//可自助调整超时时间System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");//云通信产品-语音API服务产品名称(产品名固定,无需修改)final String product = "Dyvmsapi";//产品域名(接口地址固定,无需修改)final String domain = "dyvmsapi.aliyuncs.com";//AK信息final String accessKeyId = "yourAccessKeyId";final String accessKeySecret = "yourAccessKeySecret";//初始化acsClient,暂不支持region化IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);IAcsClient acsClient = new DefaultAcsClient(profile);//组装请求对象-具体描述见控制台-文档部分内容IvrCallRequest request = new IvrCallRequest();//必填-被叫显号,可在语音控制台中找到所购买的显号request.setCalledShowNumber("057156210000");//必填-被叫号码request.setCalledNumber("15000000000");request.setPlayTimes(3L);//必填-语音文件ID或者tts模板的模板号,有参数的模板需要设置模板变量的值//request.setStartCode("ebe3a2b5-c287-42a4-8299-fc40ae79a89f.wav");request.setStartCode("TTS_713900000");request.setStartTtsParams("{\"product\":\"aliyun\",\"code\":\"123\"}");List<MenuKeyMap> menuKeyMaps = new ArrayList<MenuKeyMap>();MenuKeyMap menuKeyMap1 = new MenuKeyMap();menuKeyMap1.setKey("1");menuKeyMap1.setCode("9a9d7222-670f-40b0-a3af.wav");menuKeyMaps.add(menuKeyMap1);MenuKeyMap menuKeyMap2 = new MenuKeyMap();menuKeyMap2.setKey("2");menuKeyMap2.setCode("44e3e577-3d3a-418f-932c.wav");menuKeyMaps.add(menuKeyMap2);MenuKeyMap menuKeyMap3 = new MenuKeyMap();menuKeyMap3.setKey("3");menuKeyMap3.setCode("TTS_71390000");menuKeyMap3.setTtsParams("{\"product\":\"aliyun\",\"code\":\"123\"}");menuKeyMaps.add(menuKeyMap3);request.setMenuKeyMaps(menuKeyMaps);//结束语可以是一个无参模板或者一个语音文件ID,但是如果StartCode是TTS类型的ByeCode也需要是TTS类型的,如果StartCode是录音类型的ByeCode也需要是录音类型的request.setByeCode("TTS_71400007");request.setTimeout(3000);request.setByeTtsParams("{\"product\":\"aliyun\",\"code\":\"123\"}");//可选-外部扩展字段request.setOutId("yourOutId");//hint 此处可能会抛出异常,注意catchIvrCallResponse ivrCallResponse = acsClient.getAcsResponse(request);if(ivrCallResponse.getCode()!=null && ivrCallResponse.getCode().equals("OK")) {//请求成功}
(2)语音回执消息
消息的订阅
云通信的所有业务消息都会通过MNS消息服务向外发送。目前语音服务支持的消息类型有:VoiceReport,VoiceCallReport,VoiceRecordReport。这三个类型的消息分别对应:呼叫记录消息,呼叫中间状态消息,录音记录消息。用户需要先在控制台订阅对应的消息,订阅完消息后,你能拿到消息队列名称(queueName)。比如:Alicom-Queue-xxxxxx-VoiceReport。现在你可以使用我们提供的消息服务sdk接收消息了。首先替换你自己的accessKeyId与accessKeySecret,然后设置你自己需要获取的消息所对应的消息类型及分配给你的对应消息类型的消息队列,启动应用就可以接收对应的消息了。注意不同类型的消息返回的消息体里面包含的字段是不一样的,用户需要依据自己订阅的消息做适当的修改。
下载对应语音的消息DEMO工程,工程所需要的所有依赖jar包都放在DEMO工程的lib目录下,将对于的jar包引入到您的工程当中既可按照DEMO样例编写接收消息的程序。
SDK&DEMO[下载地址]
/*** 只能用于接收云通信的消息,不能用于接收其他业务的消息*/
public class ReceiveAlicomMsgDemo {private static Log logger=LogFactory.getLog(ReceiveAlicomMsgDemo.class);static class MyMessageListener implements MessageListener{private Gson gson=new Gson();@Overridepublic 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();String accessKeyId="yourAccessKeyId";String accessKeySecret="yourAccessKeySecret";String messageType="VoiceReport"; //注意替换成你自己需要获取的消息的类型String queueName="yourQueueName";//在云通信页面开通相应业务消息后,就能在页面上获得对应的queueNamepuller.startReceiveMsg(accessKeyId,accessKeySecret ,messageType,queueName, new MyMessageListener());}
}