语音服务——阿里云
一、語音通知
語音通知是指通過調用語音呼叫的API,從運營商網絡向指定號碼發起一通呼叫,呼叫被應答后,播放一段指定的音頻。
根據音頻形式的不同,語音通知的API分為兩個:
?
二、語音通知開通流程
- 購買語音號碼
- 創建語音模板
- 語音資質審核標準
- 語音權限訪問控制
?
三、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());} }?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 什么是荧光猪肉
- 下一篇: Shell变量的初始值赋值