语音服务——阿里云

一、语音通知

语音通知是指通过调用语音呼叫的API,从运营商网络向指定号码发起一通呼叫,呼叫被应答后,播放一段指定的音频。

根据音频形式的不同,语音通知的API分为两个:

  1. 若播放的音频为固定内容的音频文件(mp3/wav),则调用语音文件外呼接口 。
  2. 若播放的音频为带有变量的文本模板,每次调用时根据变量替换值从文本模板转化为音频文件,则调用文本转语音外呼接口。

 

二、语音通知开通流程

  • 购买语音号码
  • 创建语音模板
  • 语音资质审核标准
  • 语音权限访问控制

 

三、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());}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博客】csdn搬家到wordpress

在wordpress的插件中搜索cnblogs2wp&#xff0c;安装后&#xff0c;在工具->导入->选博客搬家&#xff0c; 遇到了些问题 总是遇到博客地址不对 https://blog.csdn.net/weixin_43560272 首先修改了后缀 这是我的博客首页地址绝对没错的啊 后缀绝对改了的 总是说地址…

C++描述杭电OJ 2009.求数列的和 ||

C描述杭电OJ 2009.求数列的和 || Problem Description 数列的定义如下&#xff1a; 数列的第一项为n&#xff0c;以后各项为前一项的平方根&#xff0c;求数列的前m项的和。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;由两个整数n&#xff08;n<10000&…

P2323-[HNOI2006]公路修建问题【并查集】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP2323 题目大意 有n个点&#xff0c;m条边&#xff0c;对于每条边修二级公路和一级公路修建价格不同(一级比二级贵)。要求留下n-1条边使其成为一棵树且至少有k条一级公路&#xff0c;要求最贵的公路价…

Microsoft加入量子计算的竞争

Microsoft在Ignite大会上宣布了自己的量子计算新平台的预览版&#xff0c;并公开了借助近期粒子物理学方面的进展推出拓扑量子计算机的计划。 Microsoft的量子计算平台预览版将包括一个量子计算模拟器&#xff0c;以及一种集成在Visual Studio中的量子计算编程新语言。据Micros…

Window系统多硬盘设置新引导盘

一、系统启动过程 电脑通电后&#xff0c;首先是启动BIOS程序&#xff0c;BIOS自检完毕后&#xff0c;找到硬盘上的主引导记录MBR&#xff0c;MBR读取DPT&#xff08;分区表&#xff09;&#xff0c;从中找出活动的主分区&#xff0c;然后读取活动主分区的PBR&#xff08;分区引…

【Java】jdk和eclipse下载安装

&#xff08;以前忘了写这方面的安装&#xff09; 附一段测试java环境的代码 public class hello {public static void main(String[] args) {System.out.println("Hello World dsadasdaSasdasd");} }jdk安装&#xff1a; 这里我采用不同方式 直接360软件管家搜索jd…

C++描述杭电OJ 2010.水仙花数 ||

C描述杭电OJ 2010.水仙花数 || Problem Description 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;他是这样定义的&#xff1a; “水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如…

使用BigQuery分析GitHub上的C#代码

一年多以前&#xff0c;Google 在GitHub中提供了BigQuery用于查询的GitHub上的开源代码&#xff08;open source code on GitHub available for querying&#xff09;&#xff0c;如果这还不够&#xff0c;您可以免费每月运行1TB的查询&#xff01; 所以在这篇文章中&#xff0…

NOIP2018普及组复赛解析

T1:标题统计 题目大意 输入一个字符串&#xff0c;求字符串除了空格的字符个数 解题思路 这种考你会不会编程的题不会&#xff1f; code #include<cstdio> #include<string> #include<iostream> using namespace std; int ans; string c; int main() {get…

Shell变量的初始值赋值

转载自 Shell变量的初始值赋值 通常在shell中&#xff0c;在变量值为空的时候我们要为变量设置一个默认值&#xff0c;避免在脚本运行的过程中报错&#xff0c;这就是变量的初始值赋值。 通常比较简洁的有以下两种&#xff0c;都能对一个变量赋予一个初始值&#xff0c; ${va…

【博客】博客转移

最近一直在搞博客&#xff0c;随着博客基本转移到wordpress&#xff0c;总算是告一段落。 我通过各种博客搬家的方式都没能把博客转移到wordpress上&#xff0c;后来实在没办法&#xff0c;强行Gutenberg编辑器&#xff0c;一个一个复制粘贴到自己博客上面&#xff0c;总算是实…

AspectCore中的IoC容器和依赖注入

IOC模式和依赖注入是近年来非常流行的一种模式&#xff0c;相信大家都不陌生了&#xff0c;在Asp.Net Core中提供了依赖注入作为内置的基础设施&#xff0c;如果仍不熟悉依赖注入的读者&#xff0c;可以看看由我们翻译的Asp.Net Core中文文档中依赖注入的相关章节: ASP.NET Cor…

[编程入门]阶乘求和:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。

【题目描述】求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字(n不超过20)。#include<iostream> using namespace std;void fun(int n) {long long sn0,s1;for(int i1;i<n;i){for(int j1;j<i;j){s*j;}sns;s1;}cout<<sn<<endl; }int main() {int n;c…

bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP4381 题目大意 有n个岛&#xff0c;n条无向边(保证每个岛都有边连到)。走过的路和岛不可以重走&#xff0c;可以坐船。 坐船要求之前没有任何使用过的船加上道路可以到达那个点才可以坐船。 求最长可…

【总结】找到自适合的学习方法

通过高中与大学的比较 我发现自己大学学的东西要比高中多很多&#xff0c;也要更加的充实。 说白了&#xff0c;其实我认为就是自己擅长与不擅长的学习方式罢了。 1、我更喜欢那种自由轻松一点的学习环境&#xff0c;高中把我压得太紧了&#xff08;老师喜欢提问&#xff09…

HttpClient的性能隐患

最近在进行开发过程中&#xff0c;基于都是接口开发&#xff0c;A站接口访问B接口接口来请求数据&#xff0c;而在这个过程中我们使用的是HttpClient这个框架&#xff0c;当然也是微软自己的框架&#xff0c;性能当前没有问题&#xff0c;但如果你直接使用官方的写法&#xff0…

P5022-旅行【基环树,dfs】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP5022 题目大意 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 解题思路 我们先不考虑基环树。我们可以发现每次走…

【填坑】博客搬家造成的博客重复问题

原本我的博客数量是差不多八十几篇&#xff0c;昨天晚上一看&#xff0c;怎么变成一百三十多篇了。 惊讶之余有点不可思议&#xff0c;查了才发现原来有几十篇是重复的&#xff0c;后来删掉了一些&#xff0c;但还是有很多 有些也不是重复的&#xff0c;我从知乎发的东西也被搬…

[编程入门]猴子吃桃的问题

猴子吃桃问题。猴子第一天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。 第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时&#xff0c;见只剩下一个桃子了…

Javafx的WebEgine执行window对象设置属性后为undefined

一、场景复现 window10 jdk1.8u221 package main;import javafx.application.Application; import javafx.beans.value.ObservableValue; import javafx.concurrent.Worker; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Sta…