省的不用交押金的共享单车语音识别

语音识别类产品的分类及应用场景 - A5创业网
扫一扫,联系编辑获得审核机会
符合以下要求,获得报道机会
1. 新公司求报道
2. 好项目求报道
3. 服务商求报道
4. 投资融资爆料
客服热线:400-995-7855
当前位置:&&&
语音识别类产品的分类及应用场景
& 13:43&&来源:&
  本文主要针对人工智能中的感知智能展开分享,聊聊其中的&语音识别类产品&。
  媒体和AI巨头们乐于给大众描绘一幅幅精彩的未来生活蓝图:人工智能可以化身为你的爱车,在沙漠、森林或小巷中风驰电掣;可以是智慧公正的交警,控制红绿灯、缓解交通的拥挤;还可以是给人以贴心照顾的小助理,熟悉你生活中的每一处小怪癖。
  在看到这些美妙的畅想之后,作为一个严谨认真的AI产品经理,我不禁想去探索上述美好未来的实现路径;今天,让我们从人工智能中的感知智能开始&&聊聊&语音识别类产品&。
  一、定义
  语音识别是将人类的声音信号转化为文字的过程。
  语音识别、人脸识别和OCR等都属于人工智能中的感知智能,其核心功能是将物理世界的信息转化成可供计算机处理的信息,为后续的认知智能提供基础。
  二、语音识别能满足或支撑的需求层次
  1、人与人之间的信息同步
  转化成文字的语音信息,由于少了时间轴的约束,在同等量级的情况下,人类使用眼睛获取的速度远远快于耳朵。当然,确实也损失掉了一些信息,比如情绪。
  2、检索 & 语义抽取
  利用语义建模,对某些业务场景中比较关注的词/语义进行检索,或者将其抽取出来并进行结构化记录。
  3、人机交互
  使用更自然的方式与机器/虚拟助理进行交互,实现拟人对话、对设备的操控或者问题答案的获取。
  4、数据挖掘
  通过对数据的聚类或者与各维度数据体系打通,可以对个人/人群/特定领域的语义数据进行价值挖掘。
  下面,我将以语音识别需求场景之&人机交互&为例,对业界的语音识别产品进行归类和说明。如果大家比较感兴趣,我后续文章可以再对其他的几类需求层次进行进一步的分析。
  三、分类
  根据识别内容的范围,语音识别可分为&封闭域识别&和&开放域识别&。
  1、封闭域识别
  识别范围为预先指定的字/词集合。
  即,算法只在开发者预先设定的封闭域识别词的集合内进行语音识别,对范围之外的语音会拒识。因此,可将其声学模型和语言模型进行裁剪,使得识别引擎的运算量变小;并且,可将引擎封到嵌入式芯片或者本地化的SDK中,从而使识别过程完全脱离云端,摆脱对网络的依赖,并且不会影响识别率。
  业界厂商提供的引擎部署方式包括云端和本地化(如:芯片,模块和纯软件SDK)。
  产品形态:流式传输-同步获取
  典型的应用场景:不涉及到多轮交互和多种语义说法的场景。
  比如,对于简单指令交互的智能家居和电视盒子,语音控制指令一般只有&打开窗帘&、&打开中央台&等;或者语音唤醒功能&Alexa&。但是,一旦涉及到程序猿大大们在后台配置识别词集合之外的命令,如&给小编来一块钱打赏呗&,识别系统将拒识这段语音,不会返回相应的文字结果,更不会做相应的回复或者指令动作。
  2、开放域识别
  无需预先指定识别词集合,算法将在整个语言大集合范围中进行识别。为适应此类场景,声学模型和语音模型一般都比较大,引擎运算量也较大。如果将其封装到嵌入式芯片或者本地化的SDK中,耗能较高并且影响识别效果。
  因此,业界厂商基本上都只以云端形式提供(云端包括公有云形式和私有云形式)。至于本地化形式,只提供带服务器级别计算能力的嵌入式系统(如会议字幕系统)。
  产品形态,按照音频录入和结果获取方式可分为3种:
  1)产品形态1:流式上传-同步获取,应用/软件会对说话人的语音进行自动录制,并将其连续上传至云端,说话人在说完话的同时能实时地看到返回的文字。
  语音云服务厂商的产品接口中,会提供音频录制接口和格式编码算法,供客户端边录制边上传,并与云端建立长连接,同步监听并获取中间(或者最终完整)的识别结果。
  对于时长的限制,由语音云服务厂商自定义,一般有&1分钟和&5小时两种,两者有可能会采用不同的模型(时长限制&5小时的模型会采用LSTM长时相关性建模)。
  典型应用场景1:
  主要在输入场景,如输入法、会议/法院庭审时的实时字幕上屏;
  与麦克风阵列和语义结合的人机交互场景,如具备更自然交互形态的智能音响。比如用户说&转发小编这篇文章&,在无配置的情况下,识别系统也能够识别这段语音,并返回相应的文字结果。
  2)产品形态2:已录制音频文件上传-异步获取,音频时长一般&3/5小时。用户需自行调用软件接口或是硬件平台预先录制好规定格式的音频,并使用语音云服务厂商提供的接口进行音频上传,上传完成之后便可以断掉连接。用户通过轮询语音云服务器或者使用回调接口进行结果获取。
  由于长语音的计算量较大,计算时间较长,因此采取异步获取的方式可以避免由于网络问题带来的结果丢失。也因为语音转写系统通常是非实时处理的,这种工程形态也给了识别算法更多的时间进行多遍解码。而长时的语料,也给了算法使用更长时的信息进行长短期记忆网络建模。在同样的输入音频下,此类型产品形态牺牲了一部分实时率,花费了更高的资源消耗,但是却可以得到最高的识别率。在时间允许的使用场景下,&非实时已录制音频转写&无疑是最推荐的产品形态。
  典型应用场景2:
  A)已经录制完毕的音/视频字幕配置;
  B)实时性要求不高的客服语音质检和UGC语音内容审查场景等。
  3)产品形态3:已录制音频文件上传-同步获取,音频时长一般小于&1分钟。用户需自行预先录制好规定格式的音频,并使用语音云服务厂商提供的接口进行音频上传。此时,客户端与云端建立长连接,同步监听并一次性获取完整的识别结果。使用的模型会根据语音云厂商产品策略的不同,而跟随采用上述两/三种模型中的任意一种。
  典型应用场景3:
  作为前两者的补充,适用于无法用音频录制接口进行实时音频流上传,或者结果获取的实时性要求比较高的场景。
  四、概念厘清
  1、离线 VS 在线
  在较多的客户认知中,离/在线的区别在于&识别过程是否需要通过云端请求&,即&识别引擎是在云端还是本地&。而云计算中的离/在线产品的引擎都处在云端,区别在于&计算过程中,客户端是否需要与云端进行实时数据交互&,即上述所述的&流式上传-同步获取&和&已录制音频文件上传-异步获取&方式。
  两者的定义在人工智能产品领域中有较多冲突,因此并不建议使用&离/在线&概念进行相关产品定义。
  2、语音识别 VS 语义识别
  语音识别为感知智能,语义识别为认知智能,前者为后者的前提基础。语音识别将声音转化成文字,语义识别提取文字中的相关信息和相应意图,再通过云端大脑决策,使用执行模块进行相应的问题回复或者反馈动作。
  注:一般来说,为了减少不必要的理解干扰,从业者更倾向于说&自然语言处理(NLP)&等概念,极少使用&语义识别&的说法。
  最后,结合一小丢丢NLP的人机交互场景栗子作为收尾:
  &给小编这篇文章点个赞呗&,在无后台配置的情况下,封闭域的语音识别系统会拒识这段语音,而开放域的识别系统却能够识别这段语音,返回相应的文字结果。
  不过,现阶段的开放域语义系统在大概率情况下,还是会回复得比较生硬,并且也不会自动识别出相应的意图并做出指令。按照现有比较通用的方法,这个功能需要使用封闭域的NLP,在后台预先配置相关答案,并且根据预先配置的信息抽取意图,再根据意图类别和槽位信息执行相应的动作&&即调用微信的点赞接口(假设可以)进行相应的点赞操作。
  听起来好绕呀,是不是觉得还是自己手动点个赞简单粗暴省事得多了呢?
  然而,一切现代人类做起来自然而然 & 毫不费力的动作,都是建构在经过了亿万年的学习进化、兆亿次闭环重复练习的智力基因基础上的;任何人工智能技术,也需要巨量的数据训练和一定的演变周期。
  并且,在所有的科技发展进程中,率先取得突破并能在应用领域成熟的产品,往往都是在封闭域首先出现的。现在,NLP正处封闭域产品化阶段(比如Amazon Echo、Google Home等),而语音识别的产品成熟化已经走过了封闭域、到达了开放域,正在向各行各业的应用场景输送自己的洪荒之力!
  附:脑图:语音识别类产品的分类及应用场景
  作者:焦糖玛奇朵 ,&AI产品经理大本营&成员之一。
  本文由人人都是产品经理专栏作家 @黄钊 授权发布,未经作者许可,禁止转载。
  题图由作者提供
扫一扫关注A5创业网公众号
责任编辑:西瓜
互联网时代,不少朋友信奉营销至上。当然我们也看到了很多貌似营销玩好的所谓案例,很多朋友重视营销忽视了产品,守护袁昆却发现越来越多的朋友吐槽互联网太虚了。
提起抖音大家印象里就是颜值爆表、有着迷人大长腿的小姐姐,在这个以年轻人为主,崇尚酷、潮和有趣的短视频社区上,高颜值和古灵精怪是吸粉的利器。不过,据一帧平台抖音创作者榜显示,上一周主打暖萌的一禅小和尚以2.2亿总播放量登上抖音APP周榜的第三的位置。
某种意义上看,与其说网易云音乐推出了内容创作者扶持计划,不如说它启动了一个全新的音乐生态策略。通过和内容创作者共享收益,来共同打造移动音乐生态闭环,网易云音乐商业化方向应该是走对了
小程序商城已经越来越火爆,深得很多商家和企业的青睐,许多商家也顺应潮流构架了自己的小程序,但是单单拥有小程序商城是不足够的,还要学会商城小程序运营。
要实现项目推广,创业者,你究竟缺什么?营销的定位与聚焦!即找准营销的方向、并花大心力做出“有影响力”的聚焦性运营效果来。创业者如何聚焦营销定位?一、方式有很多,二、产品和营销同样重要,想专心做产品就需要借助外力。
中美贸易战的头条被滴滴司机事件迅速抢走,紧接这是某更蹭热点结果自己成了热点,加之之前内涵段子被关等一系列事件。本文不是蹭热点,没有事件回顾和爆料。作为一名产品产品经理,仅从产品和互联网的角度,引以为戒,做对和做好产品。
这篇文章写出来不知道是会被运营同学喜欢还是讨厌,喜欢的人可能会觉得我的建议还是有一些用处的。讨厌的人可能会想你一个做产品的,不要掺合我们运营的事情,何况我只是站在一个局外人的角度给的建议,有一些细节毕竟不能做到感同身受。而之所以写这篇文章,也是源于跟我触过的运营的同学打交道的感悟。
知乎为一款问答类型的软件,用户可以在其中提问并邀请其他用户进行回答。总体来讲:知乎的用户学历以及收入水准相对较高。他们在此分享自己的知识,经验与见解。值得一提的是,知乎还是很多有志于进入产品领域工作的小白了解产品经理的第一站,本文为知乎产品分析报告。
我们选取近三个月的每日评论统计数据进行观察,发现评论数总体趋于增加,从评价情况来看,大部分用户认为藏书馆是优秀的产品,对其持正面评价,体现在对出版类图书的丰富、借阅功能的强大、良好的用户体验设计等,希望藏书馆越做越好。基本反馈主要问题为:软件bug有点多,不支持横屏,设备支持太少,不支持电脑与ipa
Pinterest是国外最火爆的社交平台之一,以瀑布流的形式为用户推荐图片、GIF和视频。创立9年来,其估值已经达到了123亿美金,月活用户超过2亿。这家硅谷独角兽的崛起并不是靠运气-Pinterest从成立之初就秉持着增长黑客的理念,不断贯彻“数据驱动增长”,将理论落到了实处。
创业好项目
你这么懂用户,怎么用户不买你账?
扫描二维码关注A5创业网了解最新创业资讯服务
&徐州八方网络科技有限公司&版权所有&
举报投诉邮箱:
扫一扫关注最新创业资讯21ic官方微信-->
当前位置: /
/ 语音识别
选择承包方
项目工作中
发布时间:
截止时间:
项目周期:5-10天
已有竞标:
项目标签:
项目预算:小于¥10000
当前预算:小于¥10000潜在追加预算:¥1000远期可能追加投入:¥3000
现居地址: 广州市 白云区
竞标并认证后可查看联系方式
个人&团队:
扫码分享项目
竞标并认证后可查看联系方式
项目内容描述
人气:1313
身份认证会员
竞标者(5)
通过认证后,可查看发包方联系方式。
江苏省 南京市
广东省 深圳市
广东省 深圳市
新疆维吾尔自治区
浙江省 台州市
给发包方留言
留言内容不能为空且不能大于500字
手机认证后方可留言哦~
重庆创梦科技工作室,硬件开发及技术服务,电话:①⑦③③⑧⑥③⑤⑦⑤⑧
刚做完一个android apk,就是利用百度语音离线SDK进行开发的,识别率99%,不知道你们这个运行环境是怎么样的,纯linux系统吗?
此项目现处于 已过期 状态
上次登录时间:
会员身份:
注册时间: 10:34
发包数量:
中标次数:
竞争最激烈的项目TOP10
已有47位竞
已有38位竞
已有35位竞
已有34位竞
已有31位竞
已有29位竞
已有27位竞
已有24位竞
已有24位竞
已有23位竞
发包方预算:前期:¥10,000-¥50,000中期:¥10,000-¥50,000后期:¥10,000-¥50,000
天发包方要求的开发时间: 5-10天
可以给出具体项目周期
暂时无法给出具体周期,需要详谈
联系方式:
竞标方案:
客服QQ 客服QQ:数加&大数据分析及展现
数加&大数据应用
管理与监控
阿里云办公
培训与认证
域名与网站(万网)
数加&人工智能
数加&大数据基础服务
互联网中间件
开发者工具
智能语音交互
&&&&&&&&&RESTful API
RESTful API
更新时间: 16:37:16
1. 简介短语音识别REST API支持以POST方式整段上传长度不多于一分钟的语音文件。识别结果将以JSON格式在请求响应中一次性返回,开发者需保证在识别结果返回前连接不被中断。
2. 选取语音模型和编码格式开发者需要根据自身应用场景选取合适的语音模型。不同的语音模型对应不同的编码与数据格式,并在特定的场景下获得更高的识别准确度。
customer-service-8k
customer-service
entertainment
3. 上传语音文件
短语识别请求实例
POST https://nlsapi.aliyun.com/recognize?model=chat//8k语音请求url增加参数&appkey=nls-service-8kAuthorization: Dataplus *****Content-type: audio/pcm; samplerate=16000Accept: application/jsonDate: Sat, 11 Mar 2017 08:33:32 GMTContent-Length: *[audio data]一个完整的语音识别请求需包含以下要素:
3.2 输入参数
目前的版本号是”2.0”
语音模型,详见 2
Authorization
鉴权, 详见 3.3.1
Content-type
必须以audio/开头,标明用户音频数据编码类型与采样率,详见 3.3.2
识别结果返回格式,仅支持application/json
鉴权,HTTP 1.1协议中规定的GMT时间,例如:Wed, 05 Sep. :00 GMT
Content-Length
语音文件长度
调用阿里巴巴智能语音交互平台的任何功能前都需经过严格的鉴权验证。在处理用户请求前,服务端会校验Authorization Header以确保用户请求在传输过程中没有被恶意篡改或替换。
Authorization: Dataplus access_id:signatureAuthorization以固定字符串Dataplus开头,开发者需要将从阿里云申请到的access_id和经过计算的signature以:分隔并以Base64编码后加入Header。
3.3.1.1 signature的计算与略有区别,计算语音服务的signature需要首先对语音文件进行两次MD5和Base64编码,然后将编码结果与Reqeust Method,Accept,Content-Type和Date Header合并产生特征值,最后用阿里云取得的access_key对特征值进行HMAC-SHA1加密生成signature。
// 1.对body做两次MD5+BASE64加密String bodyMd5 = MD5Base64(MD5Base64(body));// 2.特征值String feature = method + "\n" + accept + "\n" + bodyMd5 + "\n" + content_type + "\n" + date;// 2.对特征值HMAC-SHA1加密String signature = HMACSha1(feature, access_secret);3.3.1.2 计算 MD5+BASE64public static String MD5Base64(String s) throws UnsupportedEncodingException {
if (s == null)
return null;
String encodeStr = "";
//string 编码必须为utf-8
byte[] utfBytes = s.getBytes("UTF-8");
MessageDigest mdTemp;
mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(utfBytes);
byte[] md5Bytes = mdTemp.digest();
BASE64Encoder b64Encoder = new BASE64Encoder();
encodeStr = b64Encoder.encode(md5Bytes);
} catch (Exception e) {
throw new Error("Failed to generate MD5 : " + e.getMessage());
return encodeStr;}3.3.1.3 计算 HMAC-SHA1public static String HMACSha1(String data, String key) {
String result;
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
result = (new BASE64Encoder()).encode(rawHmac);
} catch (Exception e) {
throw new Error("Failed to generate HMAC : " + e.getMessage());
return result;}用来表明用户上传的音频数据格式和采样率,例如:
Content-Type: audio/wav; samplerate=8000如果没有提供samplerate字段,采样率默认为16K。目前支持的音频编码格式如下:
阿里优化opus
4. 识别结果返回HTTP状态码200表示识别成功,请求结果以application/json格式在Response Body中返回;其他的HTTP错误码表示识别失败,具体的错误消息以application/json格式在Response Body中返回。
4.1 识别成功与识别失败
request_id
识别请求id
ASR识别结果
识别成功实例
"request_id":"e4f64a180feecbe478889",
"result":"测试五秒钟长度的语音"}
4.2 识别失败
request_id
识别请求id
error_code
具体的错误代码
error_message
具体的错误消息
识别失败实例
"request_id":"e4f64a180feecbe478889",
"error_code":80103,
"error_message":"Failed to invoke auth service!"}
4.3 错误码定义
status_code
请求格式有误
鉴权验证失败
检查Accept类型,必须为application/json
处理请求超时
超出最大并发量
服务器内部错误
服务不可用
服务不可用
5. 代码示例5.1 请求DEMOpackage com.alibaba.idst.nls;import java.io.File;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.nio.file.FileSystem;import java.nio.file.FileSystems;import java.nio.file.Files;import java.nio.file.Path;import com.alibaba.fastjson.JSON;import com.alibaba.idst.nls.response.HttpResponse;import com.alibaba.idst.nls.utils.HttpUtil;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HttpAsrDemo {
private static
Logger logger = LoggerFactory.getLogger(HttpAsrDemo.class);
private static String url = "http://nlsapi.aliyun.com/recognize?";
//private static String url = "http://nlsapi.aliyun.com/recognize?&appkey=nls-service-8k";
//8k语音请求url增加参数&appkey=nls-service-8k
public static void main(String[] args) throws IOException {
//请使用https://ak-console.aliyun.com/ 页面获取的Access 信息
//请提前开通智能语音服务(https://data.aliyun.com/product/nls)
String ak_id = args[0];
String ak_secret = args[1];
//使用对应的ASR模型 详情见文档部分2
String model = "chat";
url = url+"model="+model;
//读取本地的语音文件
Path path = FileSystems.getDefault().getPath("src/main/resources/demo.wav");
byte[] data = Files.readAllBytes(path);
HttpResponse response = HttpUtil.sendAsrPost(data,"pcm",16000,url,ak_id,ak_secret);
logger.info(JSON.toJSONString(response));
5.2 请求服务的HttpUtil类package com.alibaba.idst.nls.utils;/** * Created by songsong.sss on 16/5/23. */import java.io.*;import java.net.HttpURLConnection;import java.net.URL;import java.security.MessageDigest;import java.text.SimpleDateFormat;import java.util.*;import javax.crypto.spec.SecretKeySpec;import com.alibaba.idst.nls.response.HttpResponse;import javax.crypto.Mac;import
org.slf4j.Logger;import
org.slf4j.LoggerFactory;import sun.misc.BASE64Encoder;@SuppressWarnings("restriction")public class HttpUtil {
static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
* 计算MD5+BASE64
public static String MD5Base64(byte[] s) throws UnsupportedEncodingException {
if (s == null){
return null;
String encodeStr = "";
//string 编码必须为utf-8
MessageDigest mdTemp;
mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(s);
byte[] md5Bytes = mdTemp.digest();
BASE64Encoder b64Encoder = new BASE64Encoder();
encodeStr = b64Encoder.encode(md5Bytes);
/* java 1.8以上版本支持
Encoder encoder = Base64.getEncoder();
encodeStr = encoder.encodeToString(md5Bytes);
} catch (Exception e) {
throw new Error("Failed to generate MD5 : " + e.getMessage());
return encodeStr;
* 计算 HMAC-SHA1
public static String HMACSha1(String data, String key) {
String result;
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
byte[] rawHmac = mac.doFinal(data.getBytes());
result = (new BASE64Encoder()).encode(rawHmac);
/*java 1.8以上版本支持
Encoder encoder = Base64.getEncoder();
result = encoder.encodeToString(rawHmac);
} catch (Exception e) {
throw new Error("Failed to generate HMAC : " + e.getMessage());
return result;
* 等同于javaScript中的 new Date().toUTCString();
public static String toGMTString(Date date) {
SimpleDateFormat df = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK);
df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT"));
return df.format(date);
* 发送POST请求
public static HttpResponse sendAsrPost(byte[] audioData, String audioFormat, int sampleRate, String url,String ak_id, String ak_secret) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
HttpResponse response = new HttpResponse();
URL realUrl = new URL(url);
* http header 参数
String method = "POST";
String accept = "application/json";
String content_type = "audio/"+audioFormat+";samplerate="+sampleRate;
int length = audioData.length;
String date = toGMTString(new Date());
// 1.对body做MD5+BASE64加密
String bodyMd5 = MD5Base64(audioData);
String md52 = MD5Base64(bodyMd5.getBytes());
String stringToSign = method + "\n" + accept + "\n" + md52 + "\n" + content_type + "\n" + date ;
// 2.计算 HMAC-SHA1
String signature = HMACSha1(stringToSign, ak_secret);
// 3.得到 authorization header
String authHeader = "Dataplus " + ak_id + ":" + signature;
// 打开和URL之间的连接
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", accept);
conn.setRequestProperty("content-type", content_type);
conn.setRequestProperty("date", date);
conn.setRequestProperty("Authorization", authHeader);
conn.setRequestProperty("Content-Length", String.valueOf(length));
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
OutputStream stream = conn.getOutputStream();
// 发送请求参数
stream.write(audioData);
// flush输出流的缓冲
stream.flush();
stream.close();
response.setStatus(conn.getResponseCode());
// 定义BufferedReader输入流来读取URL的响应
if (response.getStatus() ==200){
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
in = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
if (response.getStatus() == 200){
response.setResult(result);
response.setMassage("OK");
response.setMassage(result);
System.out.println("post response status code: ["+response.getStatus()+"], response massage : ["+response.getMassage()+"] ,result :["+response.getResult()+"]");
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
// 使用finally块来关闭输出流、输入流
if (out != null) {
out.close();
if (in != null) {
in.close();
} catch (IOException ex) {
ex.printStackTrace();
return response;
* 发送POST请求
public static HttpResponse sendTtsPost(String textData,String audioType, String audioName,String url,String ak_id, String ak_secret) {
PrintWriter out = null;
BufferedReader in = null;
String result = "";
HttpResponse response = new HttpResponse();
URL realUrl = new URL(url);
* http header 参数
String method = "POST";
String content_type = "text/plain";
String accept = "audio/"+audioType+",application/json";
int length = textData.length();
String date = toGMTString(new Date());
// 1.对body做MD5+BASE64加密
String bodyMd5 = MD5Base64(textData.getBytes());//
String md52 = MD5Base64(bodyMd5.getBytes());
String stringToSign = method + "\n" + accept + "\n" + bodyMd5 + "\n" + content_type + "\n" + date ;
// 2.计算 HMAC-SHA1
String signature = HMACSha1(stringToSign, ak_secret);
// 3.得到 authorization header
String authHeader = "Dataplus " + ak_id + ":" + signature;
// 打开和URL之间的连接
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", accept);
conn.setRequestProperty("content-type", content_type);
conn.setRequestProperty("date", date);
conn.setRequestProperty("Authorization", authHeader);
conn.setRequestProperty("Content-Length", String.valueOf(length));
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
OutputStream stream = conn.getOutputStream();
// 发送请求参数
stream.write(textData.getBytes());
// flush输出流的缓冲
stream.flush();
stream.close();
response.setStatus(conn.getResponseCode());
// 定义BufferedReader输入流来读取URL的响应
InputStream is = null;
String line = null;
if (response.getStatus() ==200){
is=conn.getInputStream();
in = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
while ((line = in.readLine()) != null) {
result += line;
FileOutputStream fileOutputStream = null;
File ttsFile = new File(audioName+"."+audioType);
fileOutputStream = new FileOutputStream(ttsFile);
byte[] b=new byte[1024];
int len=0;
while(is!=null&&(len=is.read(b))!=-1){
//先读到内存
fileOutputStream.write(b, 0, len);
if (response.getStatus() == 200){
response.setResult(result);
response.setMassage("OK");
System.out.println("post response status code: ["+response.getStatus()+"], generate tts audio file :" + audioName+"."+audioType);
response.setMassage(result);
System.out.println("post response status code: ["+response.getStatus()+"], response massage : ["+response.getMassage()+"]");
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
// 使用finally块来关闭输出流、输入流
if (out != null) {
out.close();
if (in != null) {
in.close();
} catch (IOException ex) {
ex.printStackTrace();
return response;
5.3 请求结果类package com.alibaba.idst.nls.response;public class HttpResponse {
private int status;
private String result;
private String massage;
public int getStatus() {
return status;
public void setStatus(int status) {
this.status = status;
public String getResult() {
return result;
public void setResult(String result) {
this.result = result;
public String getMassage() {
return massage;
public void setMassage(String massage) {
this.massage = massage;
智能语音交互(Intelligent Speech Intera...
语音通知是指通过调用语音呼叫的API,通过阿里云语音服务,从运营...
自然语言处理是由IDST的专业团队研发,旨在帮助用户更好的处理文...
本文导读目录
以上内容是否对您有帮助?
更新不及时
缺少代码/图片示例
太简单/步骤待完善
更新不及时
缺少代码/图片示例
太简单/步骤待完善
感谢您的打分,是否有意见建议想告诉我们?
感谢您的反馈,反馈我们已经收到

我要回帖

更多关于 小区的车位需要交押金 的文章

 

随机推荐