一、前言
国内做语音识别的公司有很多,大家所熟知的几家公司主要有科大讯飞、阿里云、百度、腾讯等,由于各家的API或者SDK对接方式都差不多,本文采用百度的API进行演示。
二、对接流程
第一步:成为开发者
三步完成账号的基本注册与认证:
STEP1:点击进入控制台,选择需要使用的AI服务项。若为未登录状态,将跳转至登录界面,请您使用百度账号登录。如还未持有百度账户,可以点击此处注册百度账号。
STEP2:首次使用,登录后将会进入开发者认证页面,请填写相关信息完成开发者认证。注:(如您之前已经是百度云用户或百度开发者中心用户,此步可略过。)
STEP3:通过控制台左侧导航,选择语音能力引擎,进入语音技术的控制面板,进行相关操作。
![](https://i-blog.csdnimg.cn/blog_migrate/3639e0b74e45305050d79ad07eb21ae5.png)
第二步:领取免费额度
因为本文是个人版本的demo,所以使用的是免费额度(180天),正式企业应用也有一定的免费额度,当然后期使用肯定是需要付费的。
点击去领取:
![](https://i-blog.csdnimg.cn/blog_migrate/2edb496dccbcdc2c710c7bf57b9227f9.png)
选中语音识别:
![](https://i-blog.csdnimg.cn/blog_migrate/ef2ca5feab3ba1e7d116b5b72de4d445.png)
点击全选或者根据自己需要选择即可
点击0元领取,然后刷新列表就可以看到自己已经领取成功了
第三步:创建应用
需要创建应用才可正式调用语音技术能力,基于应用创建成功后获取的API Key及Secret Key,进行接口调用操作,及相关配置。按照下图所示的操作流程,完成创建操作即可。
1.点击去创建
![](https://i-blog.csdnimg.cn/blog_migrate/2e602a01ed2029d12fdd4ae446e291d9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/260c51087a591d139153ac495932d464.png)
应用名称: 用于标识您所创建的应用的名称,支持中英文、数字、下划线及中横线,此名称一经创建完毕,不可修改。
接口选择: 每个应用可以勾选业务所需的所有AI服务的接口权限(仅可勾选具备免费试用权限的接口能力),语音技术下全部接口已默认勾选,创建应用完毕,此应用即具备了所勾选服务的调用权限。
语音包名:如果您需要使用语音技术SDK服务(iOS/Android),需要绑定包名信息,以便生成授权License。
应用归属:可选择个人使用或公司使用服务,若为公司使用,可与专属商务经理沟通,获取专业的售前支持。
应用描述: 对此应用的业务场景进行描述。
第四步:获取密钥
在创建完毕应用后,平台将会分配给我们此应用的相关凭证,主要为AppID、API Key、Secret Key。
![](https://i-blog.csdnimg.cn/blog_migrate/eed230a5eb0b5148a66abda784209ae9.png)
第五步:生成签名
使用创建应用所分配到的AppID、API Key及Secret Key,进行Access Token(用户身份验证和授权的凭证)的生成。具体如下:
请求URL数据格式:
向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:
grant_type: 必须参数,固定为client_credentials;
client_id: 必须参数,应用的API Key;
client_secret: 必须参数,应用的Secret Key;
注:
API Key、Secret Key 均可在百度智能云控制台 各技术方向概览页的应用列表 处获取,若无应用请先进行创建;
API Key、Secret Key用于接口调用鉴权,请务必注意保密,不可在公开文档或代码中以明文展示,否则可能导致账号被盗用。
例如:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2
java版本示例:
packagecom.baidu.ai.aip.auth;
importorg.json.JSONObject;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.List;
importjava.util.Map;
/**
* 获取token类
*/
publicclassAuthService {
/**
* 获取权限token
* @return 返回示例:
* {
* "access_token": "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567",
* "expires_in": 2592000
* }
*/
publicstaticStringgetAuth() {
// 官网获取的 API Key 更新为你注册的
StringclientId="百度云应用的AK";
// 官网获取的 Secret Key 更新为你注册的
StringclientSecret="百度云应用的SK";
returngetAuth(clientId, clientSecret);
}
/**
* 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.
* @param ak - 百度云官网获取的 API Key
* @param sk - 百度云官网获取的 Secret Key
* @return assess_token 示例:
* "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
*/
publicstaticStringgetAuth(Stringak, Stringsk) {
// 获取token地址
StringauthHost="https://aip.baidubce.com/oauth/2.0/token?";
StringgetAccessTokenUrl=authHost
// 1. grant_type为固定参数
+"grant_type=client_credentials"
// 2. 官网获取的 API Key
+"&client_id="+ak
// 3. 官网获取的 Secret Key
+"&client_secret="+sk;
try {
URLrealUrl=newURL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnectionconnection= (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
Map<String, List<String>>map=connection.getHeaderFields();
// 遍历所有的响应头字段
for (Stringkey : map.keySet()) {
System.err.println(key+"--->"+map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));
Stringresult="";
Stringline;
while ((line=in.readLine()) !=null) {
result+=line;
}
/**
* 返回结果示例
*/
System.err.println("result:"+result);
JSONObjectjsonObject=newJSONObject(result);
Stringaccess_token=jsonObject.getString("access_token");
returnaccess_token;
} catch (Exceptione) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
returnnull;
}
}
服务器返回的JSON文本参数如下:
access_token: 要获取的Access Token;
expires_in: Access Token的有效期(秒为单位,有效期30天);
其他参数忽略,暂时不用;
例如:
{
"refresh_token": "25.b55fe1d287227ca97aab219bb249b8ab.315360000.1798284651.282335-8574074",
"expires_in": 2592000,
"scope": "public wise_adapt",
"session_key": "9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI",
"access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
"session_secret": "dfac94a3489fe9fca7c3221cbf7525ff"
}
若请求错误,服务器将返回的JSON文本包含以下参数:
error: 错误码;关于错误码的详细信息请参考下方鉴权认证错误码。
error_description: 错误描述信息,帮助理解和解决发生的错误。
例如:
{
"error": "invalid_client",
"error_description": "unknown client id"
}
鉴权认证错误码:
error | error_description | 解释 |
invalid_client | unknown client id | API Key不正确 |
invalid_client | Client authentication failed | Secret Key不正确 |
第六步:启动开发
百度提供了两种对接方式:API与SDK。我们这里选择了API的方式进行对接。
请求说明
语音数据上传 POST 方式有 2 种:
JSON 格式 POST 上传本地音频文件。
RAW 格式 POST 上传本地音频文件。
JSON 方式
音频文件,读取二进制内容后,进行 base64 编码后放在 speech 参数内。
音频文件的原始大小, 即二进制内容的字节数,填写 “len” 字段
由于使用 json 格式, header 为:Content-Type:application/json注意: 由于 base64 编码后,数据会增大 1/3。
RAW方式
音频文件,读取二进制内容后,直接放在 body 中。
Content-Length 的值即为音频文件的大小。(一般代码会自动生成)。
由于使用 raw 方式, 采样率和文件格式需要填写在 Content-Type 中 :Content-Type: audio/pcm;rate=16000
JSON方式上传音频
语音数据和其他参数通过标准 JSON 格式串行化 POST 上传, JSON 里包括的参数:
字段名 | 类型 | 可需 | 描述 |
format | string | 必填 | 语音文件的格式,pcm/wav/amr/m4a。不区分大小写。推荐pcm文件 |
rate | int | 必填 | 采样率,16000、8000,固定值 |
channel | int | 必填 | 声道数,仅支持单声道,请填写固定值 1 |
cuid | string | 必填 | 用户唯一标识,用来区分用户,计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内。 |
token | string | 必填 | 开放平台获取到的开发者[access_token] |
获取 Access Token "access_token") | |||
dev_pid | int | 选填 | 不填写lan参数生效,都不填写,默认1537(普通话 输入法模型),dev_pid参数点击这里 |
lm_id | int | 选填 | 自训练平台模型id,填dev_pid = 1537生效 |
lan | string | 选填,废弃参数 | 历史兼容参数,已不再使用 |
speech | string | 必填 | 本地语音文件的二进制语音数据 ,需要进行base64 编码。与len参数连一起使用。 |
len | int | 必填 | 本地语音文件的的字节数,单位字节 |
上传示例
JSON 格式 POST 上传本地文件
固定头部 header
Content-Type:application/json
请求示例
POSThttp://vop.baidu.com/server_api
speech 参数填写为 文件内容 base64 后的结果:
{
"format":"pcm",
"rate":16000,
"dev_pid":1537,
"channel":1,
"token":xxx,
"cuid":"baidu_workshop",
"len":4096,
"speech":"xxx", // xxx为 base64(FILE_CONTENT)
}
返回示例
{
"corpus_no":"6433214037620997779",
"err_msg":"success.",
"err_no":0,"result":["北京科技馆。"],
"sn":"371191073711497849365"
}
注意事项
len 字段表示原始语音大小字节数,不是 base64 编码之后的长度。
RAW 方式上传音频
语音数据直接放在 HTTP BODY 中,控制参数以及相关统计信息通过 header 和 url 里参数传递。
Header 参数说明
字段名 | 数据类型 | 可需 | 描述 |
format | string(格式见下面示例) | 必填 | 语音格式,pcm/wav/amr/(m4a仅支持极速版)。不区分大小写,推荐使用pcm文件 |
rate | int(格式见下面示例) | 必填 | 采样率 16000、8000, 固定值 |
语音数据的采样率和压缩格式在 HTTP-HEADER 里的 Content-Type 表明,例:
Content-Type: audio/pcm;rate=16000
url 参数说明
字段名 | 可需 | 描述 |
cuid | 必填 | 用户唯一标识,用来区分用户,计算 UV 值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为 60 字符以内。 |
token | 必填 | 开放平台获取到的开发者 [access_token] |
获取 Access Token "access_token") | ||
dev_pid | 选填 | 不填写 lan 参数生效,都不填写,默认 1537(普通话 输入法模型),dev_pid参数点击这里 |
lm_id | int | 选填 |
lan | 选填,废弃参数 | 历史兼容参数,已不再使用。 |
URL 示例
POSThttp://vop.baidu.com/server_api?dev_pid=1537&cuid=******&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328
// 或者使用自训练平台
POSThttp://vop.baidu.com/server_api?dev_pid=8002&lm_id=1234&cuid=******&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328
raw 方式测试示例
curl-i-XPOST-H"Content-Type: audio/pcm;rate=16000""http://vop.baidu.com/server_api?dev_pid=1537&cuid=xxxxx&token=1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328"--data-binary"@/home/test/test.pcm"
三、demo示例
第一步:准备音频文件
![](https://i-blog.csdnimg.cn/blog_migrate/65206206dddcd91204322502aa402656.png)
第二步:生成token
packagecom.speech.demo.common;
importcom.alibaba.fastjson2.JSONObject;
importjava.io.IOException;
importjava.net.HttpURLConnection;
importjava.net.URL;
/**
* token的获取类
* 将apiKey和secretKey换取token,注意有效期保存在expiresAt
*/
publicclassTokenHolder {
publicstaticfinalStringASR_SCOPE="audio_voice_assistant_get";
publicstaticfinalStringTTS_SCOPE="audio_tts_post";
/**
* url , Token的url,http可以改为https
*/
privatestaticfinalStringurl="http://aip.baidubce.com/oauth/2.0/token";
/**
* asr的权限 scope 是 "audio_voice_assistant_get"
* tts 的权限 scope 是 "audio_tts_post"
*/
privateStringscope;
/**
* 网页上申请语音识别应用获取的apiKey
*/
privateStringapiKey;
/**
* 网页上申请语音识别应用获取的secretKey
*/
privateStringsecretKey;
/**
* 保存访问接口获取的token
*/
privateStringtoken;
/**
* 当前的时间戳,毫秒
*/
privatelongexpiresAt;
/**
* @param apiKey 网页上申请语音识别应用获取的apiKey
* @param secretKey 网页上申请语音识别应用获取的secretKey
*/
publicTokenHolder(StringapiKey, StringsecretKey, Stringscope) {
this.apiKey=apiKey;
this.secretKey=secretKey;
this.scope=scope;
}
/**
* 获取token,refresh 方法后调用有效
*
* @return
*/
publicStringgetToken() {
returntoken;
}
/**
* 获取过期时间,refresh 方法后调用有效
*
* @return
*/
publiclonggetExpiresAt() {
returnexpiresAt;
}
/**
* 获取token
*
* @return
* @throws IOException http请求错误
* @throws DemoException http接口返回不是 200, access_token未获取
*/
publicvoidrefresh() throwsIOException, DemoException {
StringgetTokenURL=url+"?grant_type=client_credentials"
+"&client_id="+ConnUtil.urlEncode(apiKey) +"&client_secret="+ConnUtil.urlEncode(secretKey);
// 打印的url出来放到浏览器内可以复现
System.out.println("token url:"+getTokenURL);
URLurl=newURL(getTokenURL);
HttpURLConnectionconn= (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
Stringresult=ConnUtil.getResponseString(conn);
System.out.println("Token result json:"+result);
parseJson(result);
}
/**
* @param result token接口获得的result
* @throws DemoException
*/
privatevoidparseJson(Stringresult) throwsDemoException {
JSONObjectjson=JSONObject.parseObject(result);
if (json.getString("access_token") ==null) {
// 返回没有access_token字段
thrownewDemoException("access_token not obtained, "+result);
}
if (json.getString("scope") ==null) {
// 返回没有scope字段
thrownewDemoException("scopenot obtained, "+result);
}
// scope = null, 忽略scope检查
if (scope!=null&&!json.getString("scope").contains(scope)) {
thrownewDemoException("scope not exist, "+scope+","+result);
}
token=json.getString("access_token");
expiresAt=System.currentTimeMillis() +json.getLong("expires_in") *1000;
}
}
第三步:调用API测试
语音识别测试:
packagecom.speech.demo.test;
importcom.alibaba.fastjson2.JSONObject;
importcom.speech.demo.common.ConnUtil;
importcom.speech.demo.common.DemoException;
importcom.speech.demo.common.TokenHolder;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.Base64;
publicclassAsrMain {
/**
* 默认以json方式上传音频文件
*/
privatefinalbooleanMETHOD_RAW=false;
/**
* 填写网页上申请的appkey 如 $apiKey="kVcnfD9iW2XVZSMaLMrtLYIz"
*/
privatefinalStringAPP_KEY="你的appKey";
/**
* 填写网页上申请的APP SECRET 如 $SECRET_KEY="O9o1O213UgG5LFn0bDGNtoRN3VWl2du6"
*/
privatefinalStringSECRET_KEY="你的secretKey";
// 需要识别的文件
privatefinalStringFILENAME="16k.pcm";
/**
* 文件格式, 支持pcm/wav/amr 格式,极速版额外支持m4a 格式
*/
privatefinalStringFORMAT=FILENAME.substring(FILENAME.length() -3);
privateStringCUID="1234567JAVA";
// 采样率固定值
privatefinalintRATE=16000;
privateStringURL;
privateintDEV_PID;
//private int LM_ID;//测试自训练平台需要打开此注释
privateStringSCOPE;
// 普通版 参数
{
// 可以改为https
URL="http://vop.baidu.com/server_api";
// 1537 表示识别普通话,使用输入法模型。 其它语种参见文档
DEV_PID=1537;
SCOPE="audio_voice_assistant_get";
}
// 自训练平台 参数
/*{
//自训练平台模型上线后,您会看见 第二步:“”获取专属模型参数pid:8001,modelid:1234”,按照这个信息获取 dev_pid=8001,lm_id=1234
DEV_PID = 8001;
LM_ID = 1234;
}*/
/* 极速版 参数
{
URL = "http://vop.baidu.com/pro_api"; // 可以改为https
DEV_PID = 80001;
SCOPE = "brain_enhanced_asr";
}
*/
/* 忽略scope检查,非常旧的应用可能没有
{
SCOPE = null;
}
*/
publicstaticvoidmain(String[] args) throwsIOException, DemoException {
AsrMaindemo=newAsrMain();
// 填写下面信息
Stringresult=demo.run();
System.out.println("识别结束:结果是:");
System.out.println(result);
// 如果显示乱码,请打开result.txt查看
Filefile=newFile("result.txt");
FileWriterfo=newFileWriter(file);
fo.write(result);
fo.close();
System.out.println("Result also wrote into "+file.getAbsolutePath());
}
publicStringrun() throwsIOException, DemoException {
TokenHolderholder=newTokenHolder(APP_KEY, SECRET_KEY, SCOPE);
holder.refresh();
Stringtoken=holder.getToken();
Stringresult=null;
if (METHOD_RAW) {
result=runRawPostMethod(token);
} else {
result=runJsonPostMethod(token);
}
returnresult;
}
privateStringrunRawPostMethod(Stringtoken) throwsIOException, DemoException {
Stringurl2=URL+"?cuid="+ConnUtil.urlEncode(CUID) +"&dev_pid="+DEV_PID+"&token="+token;
//测试自训练平台需要打开以下信息
//String url2 = URL + "?cuid=" + ConnUtil.urlEncode(CUID) + "&dev_pid=" + DEV_PID + "&lm_id="+ LM_ID + "&token=" + token;
StringcontentTypeStr="audio/"+FORMAT+"; rate="+RATE;
//System.out.println(url2);
byte[] content=getFileContent(FILENAME);
HttpURLConnectionconn= (HttpURLConnection) newURL(url2).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestProperty("Content-Type", contentTypeStr);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.getOutputStream().write(content);
conn.getOutputStream().close();
System.out.println("url is "+url2);
System.out.println("header is "+"Content-Type :"+contentTypeStr);
Stringresult=ConnUtil.getResponseString(conn);
returnresult;
}
publicStringrunJsonPostMethod(Stringtoken) throwsDemoException, IOException {
byte[] content=getFileContent(FILENAME);
Stringspeech=base64Encode(content);
JSONObjectparams=newJSONObject();
params.put("dev_pid", DEV_PID);
//params.put("lm_id",LM_ID);//测试自训练平台需要打开注释
params.put("format", FORMAT);
params.put("rate", RATE);
params.put("token", token);
params.put("cuid", CUID);
params.put("channel", "1");
params.put("len", content.length);
params.put("speech", speech);
// System.out.println(params.toString());
HttpURLConnectionconn= (HttpURLConnection) newURL(URL).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
conn.setDoOutput(true);
conn.getOutputStream().write(params.toString().getBytes());
conn.getOutputStream().close();
Stringresult=ConnUtil.getResponseString(conn);
params.put("speech", "base64Encode(getFileContent(FILENAME))");
System.out.println("url is : "+URL);
System.out.println("params is :"+params.toString());
returnresult;
}
privatebyte[] getFileContent(Stringfilename) throwsDemoException, IOException {
Filefile=newFile(filename);
if (!file.canRead()) {
System.err.println("文件不存在或者不可读: "+file.getAbsolutePath());
thrownewDemoException("file cannot read: "+file.getAbsolutePath());
}
FileInputStreamis=null;
try {
is=newFileInputStream(file);
returnConnUtil.getInputStreamContent(is);
} finally {
if (is!=null) {
try {
is.close();
} catch (IOExceptione) {
e.printStackTrace();
}
}
}
}
privateStringbase64Encode(byte[] content) {
Base64.Encoderencoder=Base64.getEncoder(); // JDK 1.8 推荐方法
Stringstr=encoder.encodeToString(content);
/*char[] chars = Base64Util.encode(content); // 1.7 及以下,不推荐,请自行跟换相关库
String str = new String(chars);*/
returnstr;
}
}
说明:
appKey和secretKey填写你自己创建应用的即可,demo中使用的是我的
语音合成测试:
packagecom.speech.demo.test;
importcom.speech.demo.common.ConnUtil;
importcom.speech.demo.common.DemoException;
importcom.speech.demo.common.TokenHolder;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.net.HttpURLConnection;
importjava.net.URL;
publicclassTtsMain {
publicstaticvoidmain(String[] args) throwsIOException, DemoException {
(newTtsMain()).run();
}
/**
* 填写网页上申请的appkey 如 $apiKey="kVcnfD9iW2XVZSMaLMrtLYIz"
*/
privatefinalStringappKey="你的appKey";
/**
* 填写网页上申请的APP SECRET 如 $SECRET_KEY="O9o1O213UgG5LFn0bDGNtoRN3VWl2du6"
*/
privatefinalStringsecretKey="你的secretKey";
// text 的内容为"欢迎使用百度语音合成"的urlencode,utf-8 编码
// 可以百度搜索"urlencode"
privatefinalStringtext="欢迎使用百度语音";
// 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
// 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美
privatefinalintper=0;
// 语速,取值0-15,默认为5中语速
privatefinalintspd=5;
// 音调,取值0-15,默认为5中语调
privatefinalintpit=5;
// 音量,取值0-9,默认为5中音量
privatefinalintvol=5;
// 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
privatefinalintaue=6;
// 可以使用https
publicfinalStringurl="http://tsn.baidu.com/text2audio";
privateStringcuid="1234567JAVA";
privatevoidrun() throwsIOException, DemoException {
TokenHolderholder=newTokenHolder(appKey, secretKey, TokenHolder.ASR_SCOPE);
holder.refresh();
Stringtoken=holder.getToken();
// 此处2次urlencode, 确保特殊字符被正确编码
Stringparams="tex="+ConnUtil.urlEncode(ConnUtil.urlEncode(text));
params+="&per="+per;
params+="&spd="+spd;
params+="&pit="+pit;
params+="&vol="+vol;
params+="&cuid="+cuid;
params+="&tok="+token;
params+="&aue="+aue;
params+="&lan=zh&ctp=1";
System.out.println(url+"?"+params); // 反馈请带上此url,浏览器上可以测试
HttpURLConnectionconn= (HttpURLConnection) newURL(url).openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(5000);
PrintWriterprintWriter=newPrintWriter(conn.getOutputStream());
printWriter.write(params);
printWriter.close();
StringcontentType=conn.getContentType();
if (contentType.contains("audio/")) {
byte[] bytes=ConnUtil.getResponseBytes(conn);
Stringformat=getFormat(aue);
Filefile=newFile("result."+format); // 打开mp3文件即可播放
// System.out.println( file.getAbsolutePath());
FileOutputStreamos=newFileOutputStream(file);
os.write(bytes);
os.close();
System.out.println("audio file write to "+file.getAbsolutePath());
} else {
System.err.println("ERROR: content-type= "+contentType);
Stringres=ConnUtil.getResponseString(conn);
System.err.println(res);
}
}
// 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
privateStringgetFormat(intaue) {
String[] formats= {"mp3", "pcm", "pcm", "wav"};
returnformats[aue-3];
}
}
第四步:结果展示
语音识别结果展示:
![](https://i-blog.csdnimg.cn/blog_migrate/eedb3a9bd7f0b27a274f2c33daa1f380.png)
语音合成结果展示:
![](https://i-blog.csdnimg.cn/blog_migrate/9709a46fdb646d00a005f0705b9aacab.png)
demo示例git地址:
https://gitlab.supcon5t.com/zhaojun/Sup-Speech-Demo.git
四、在线调试
如果不想在本地调试,也可以在线调试,百度提供了在线调试的方式:在线调试地址
![](https://i-blog.csdnimg.cn/blog_migrate/03a68836a7a9302b79453c57340d5416.png)
五、总结
总体来说整个对接还是比较简单的,主要是用appKey和secretKey生成token,然后按照API要求进行调用即可
其他厂商的API调用基本也差不多这样,当然他们也提供SDK的集成方式,至于选择哪种方式都可以