百度语音TTS
实现步骤
只需三步,1小时内即可完成语音合成接口的调用,让您的应用“开口说话”。
Step1:成为百度AI开放平台的开发者
要调用百度AI开放平台的语音合成能力先要成为百度AI开放平台的开发者,首先让我们花5分钟来注册百度AI开放平台的开发者,并新建一个百度语音合成应用。
先点击此处注册百度账户进入 如下图 的页面快速的建立一个百度账号吧。
我们有账号之后登录,并且点击此处创建一个应用,如下图
然后就能看到创建完的应用和 API KEY 以及 Secret KEY了
Step2:准备数据
语音合成是将文本转换为可以播放的音频文件的服务,我们从大姚的订单库中找一段订单信息的文本如下:
三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)
Step3: 编写一个示例程序
参见如下步骤.
简介
Hi,您好,欢迎使用百度语音合成服务。
本文档主要针对Java开发者,描述百度语音合成接口服务的相关技术内容。如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:
- 在百度云控制台内提交工单,咨询问题类型请选择人工智能服务;
- QQ群快速沟通: AI开放平台官网首页底部“QQ支持群”中,查找“百度语音”。
接口能力
接口名称 | 接口能力简要描述 |
---|---|
语音合成 | 将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的口语输出的技术。 |
注意事项
目前本SDK的功能同REST API,需要联网调用http接口 。REST API 仅支持最多512字(1024 字节)的音频合成,合成的文件格式为mp3。没有其他额外功能。 如果需要使用离线合成等其它功能,请使用Android或者iOS 合成 SDK
请严格按照文档里描述的参数进行开发。请注意以下几个问题:
- 合成文本长度必须小于1024字节,如果本文长度较长,可以采用多次请求的方式。切忌文本长度超过限制。
- 新创建语音合成应用不限制每日调用量,但有QPS限额。详细限额数据可在控制台中查看。完成个人实名认证及企业认证可提高QPS限额。若需更大QPS可进一步商务合作咨询。
- 必填字段中,严格按照文档描述中内容填写。
快速入门
安装Speech Java SDK
Speech Java SDK目录结构
com.baidu.aip
├── auth //签名相关类
├── http //Http通信相关类
├── client //公用类
├── exception //exception类
├── speech
│ └── AipSpeech //AipSpeech类
└── util //工具类
支持 JAVA版本:1.7+
查看源码
Java SDK代码现已公开,您可以查看代码、或者在License范围内修改和编译SDK以适配您的环境。 github链接:https://github.com/Baidu-AIP/java-sdk
使用maven依赖:
添加以下依赖即可。其中版本号可在maven官网查询
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>${version}</version>
</dependency>
直接使用JAR包步骤如下:
-
在官方网站下载Java SDK压缩工具包。
-
将下载的
aip-java-sdk-version.zip
解压后,复制到工程文件夹中。 -
在Eclipse右键“工程 -> Properties -> Java Build Path -> Add JARs”。
-
添加SDK工具包
aip-java-sdk-version.jar
和第三方依赖工具包json-20160810.jar
log4j-1.2.17.jar
。
其中,version
为版本号,添加完成后,用户就可以在工程中使用Speech Java SDK。
新建AipSpeech
AipSpeech是语音识别的Java客户端,为使用语音识别的开发人员提供了一系列的交互方法。
用户可以参考如下代码新建一个AipSpeech,初始化完成后建议单例使用,避免重复获取access_token:
public class Sample {
//设置APPID/AK/SK
public static final String APP_ID = "你的 App ID";
public static final String API_KEY = "你的 Api Key";
public static final String SECRET_KEY = "你的 Secret Key";
public static void main(String[] args) {
// 初始化一个AipSpeech
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
// 可选:设置网络连接参数
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
// 可选:设置代理服务器地址, http和socket二选一,或者均不设置
client.setHttpProxy("proxy_host", proxy_port); // 设置http代理
client.setSocketProxy("proxy_host", proxy_port); // 设置socket代理
// 可选:设置log4j日志输出格式,若不设置,则使用默认配置
// 也可以直接通过jvm启动参数设置此环境变量
System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
// 调用接口
TtsResponse res = client.synthesis("你好百度", "zh", 1, null);
byte[] data = res.getData();
JSONObject res1 = res.getResult();
if (data != null) {
try {
Util.writeBytesToFileSystem(data, "output.mp3");
} catch (IOException e) {
e.printStackTrace();
}
}
if (res1 != null) {
System.out.println(res1.toString(2));
}
}
}
其中示例的log4j.properties文件内容如下:
#可以设置级别:debug>info>error
#debug:显示debug、info、error
#info:显示info、error
#error:只error
log4j.rootLogger=debug,appender1
#log4j.rootLogger=info,appender1
#log4j.rootLogger=error,appender1
#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#样式为TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
#自定义样式
# %r 时间 0
# %t 方法名 main
# %p 优先级 DEBUG/INFO/ERROR
# %c 所属类的全名(包括包名)
# %l 发生的位置,在某个类的某行
# %m 输出代码中指定的讯息,如log(message)中的message
# %n 输出一个换行
log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd HH🇲🇲ss:SSS}][%t][%p] -%l %m%n
在上面代码中,常量APP_ID
在百度云控制台中创建,常量API_KEY
与SECRET_KEY
是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。
配置AipSpeech
如果用户需要配置AipSpeech的一些细节参数,可以在构造AipSpeech之后调用接口设置参数,目前只支持以下参数:
接口 | 说明 |
---|---|
setConnectionTimeoutInMillis | 建立连接的超时时间(单位:毫秒) |
setSocketTimeoutInMillis | 通过打开的连接传输数据的超时时间(单位:毫秒) |
setHttpProxy | 设置http代理服务器 |
setSocketProxy | 设置socket代理服务器 (http和socket类型代理服务器只能二选一) |
语音合成
接口描述
基于该接口,开发者可以轻松的获取语音合成能力
请求说明
- 合成文本长度必须小于1024字节,如果本文长度较长,可以采用多次请求的方式。文本长度不可超过限制
举例,要把一段文字合成为语音文件:
public void synthesis(AipSpeech client)
{
TtsResponse res = client.synthesis("你好百度", "zh", 1, null);
System.out.println(res.getErrorCode());
// 设置可选参数
HashMap<String, Object> options = new HashMap<String, Object>();
options.put("spd", "5");
options.put("pit", "5");
options.put("per", "4");
TtsResponse res = client.synthesis("你好百度", "zh", 1, options);
System.out.println(res.getErrorCode());
JSONObject result = res.getResult(); //服务器返回的内容,合成成功时为null,失败时包含error_no等信息
byte[] data = res.getData(); //生成的音频数据
}
参数 | 类型 | 描述 | 是否必须 |
---|---|---|---|
tex | String | 合成的文本,使用UTF-8编码, 请注意文本长度必须小于1024字节 | 是 |
cuid | String | 用户唯一标识,用来区分用户, 填写机器 MAC 地址或 IMEI 码,长度为60以内 | 否 |
spd | String | 语速,取值0-9,默认为5中语速 | 否 |
pit | String | 音调,取值0-9,默认为5中语调 | 否 |
vol | String | 音量,取值0-15,默认为5中音量 | 否 |
per | String | 发音人选择, 0为女声,1为男声, 3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女 | 否 |
返回样例:
返回TtsResponse类。 如果合成成功,下行数据为二进制语音文件,包含在data中。 如果合成出现错误,则会填充返回值到result中。
返回失败:
// 失败返回
{
"err_no":500,
"err_msg":"notsupport.",
"sn":"abcdefgh",
"idx":1
}
语音转文字
需要把wav音频文件转成16k的频率,必须转,不转百度api解析不出来。显示音频文件不清晰错误。想要转化还必须要有ffmpeg程序,这个自己百度去下载。然后拿转好的文件扔到百度的api中。很简单。
工具类Cover8xTo16x
package com.xiaoxin.yixinai._frame.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Created by liuzhonghua on 2018/8/14.
*/
public class Cover8xTo16x {
static final Logger logger = LoggerFactory.getLogger(Cover8xTo16x.class);
/**
* 音频文件频率8k转16k。必须要转,因为不转百度识别不出来,错误信息是音质太差
* @param sourceFile
* @return
*/
public static File cover8xTo16x(File sourceFile){
String targetPath = null;
try {
//存放ffmpeg程序的目录
File ffmpegPath = new File("E:\\project\\ffmpeg\\bin\\ffmpeg");
targetPath = sourceFile.getAbsolutePath().replaceAll(".wav" , "_16x.wav");
// ffmpeg.exe -i source.wav -ar 16000 target.wav
List<String> wavToPcm = new ArrayList<String>();
wavToPcm.add(ffmpegPath.getAbsolutePath());
wavToPcm.add("-i");
wavToPcm.add(sourceFile.getAbsolutePath());
wavToPcm.add("-ar");
wavToPcm.add("16000");
wavToPcm.add(targetPath);
ProcessBuilder builder = new ProcessBuilder();
builder.command(wavToPcm);
builder.redirectErrorStream(true);
Process process = builder.start();
process.waitFor();
} catch (Exception e) {
logger.error("录音文件8k转化16k失败"+e.getMessage());
e.printStackTrace();
return null;
}
if (StringUtils.isNotEmpty(targetPath)) {
return new File(targetPath);
}
logger.error("传入的文件路径有误");
return null;
}
}
语音识别
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
JSONObject res = client.asr("D:\\websites\\upload\\vox\\vns\\389_37\\4.6.1.ai1_16x.wav", "wav", 16000, null);
System.out.println(res);
错误信息
错误返回格式
若请求错误,服务器将返回的JSON文本包含以下参数:
- error_code:错误码。
- error_msg:错误描述信息,帮助理解和解决发生的错误。
错误码
SDK本地检测参数返回的错误码:
error_code | error_msg | 备注 |
---|---|---|
SDK108 | connection or read data time out | 连接超时或读取数据超时 |
服务端返回的错误码
错误码 | 含义 |
---|---|
500 | 不支持的输入 |
501 | 输入参数不正确 |
502 | token验证失败 |
503 | 合成后端错误 |
百度Open API错误码定义
Error Code | Error Description(Chinese) | Error Description(English) |
---|---|---|
0 | 成功 | Success |
1 | 未知错误 | Unknown error |
2 | 服务暂不可用 | Service temporarily unavailable |
3 | 未知的方法 | Unsupported openapi method |
4 | 接口调用次数已达到设定的上限 | Open api request limit reached |
5 | 请求来自未经授权的IP地址 | Unauthorized client IP address:%s |
6 | 无权限访问该用户数据 | No permission to access data |
7 | 来自该refer的请求无访问权限 | No permission to access data for this referer |
100 | 请求参数无效 | Invalid parameter |
101 | api key无效 | Invalid API key |
102 | session key无效 | Session key invalid or no longer valid |
103 | call_id参数无效 | Invalid/Used call_id parameter |
104 | 无效签名 | Incorrect signature |
105 | 请求参数过多 | Too many parameters |
106 | 未知的签名方法 | Unsupported signature method |
107 | timestamp参数无效 | Invalid/Used timestamp parameter |
108 | 无效的user id | Invalid user id |
109 | 无效的用户资料字段名 | Invalid user info field |
110 | 无效的access token | Access token invalid or no longer valid |
111 | access token过期 | Access token expired |
112 | session key过期 | Session key expired |
114 | 无效的ip参数 | Invalid Ip |
210 | 用户不可见 | User not visible |
211 | 获取未授权的字段 | Unsupported permission |
212 | 没有权限获取用户的email | No permission to access user email |
800 | 未知的存储操作错误 | Unknown data store API error |
801 | 无效的操作方法 | Invalid operation |
802 | 数据存储空间已超过设定的上限 | Data store allowable quota was exceeded |
803 | 指定的对象不存在 | Specified object cannot be found |
804 | 指定的对象已存在 | Specified object already exists |
805 | 数据库操作出错,请重试 | A database error occurred. Please try again |
900 | 访问的应用不存在 | No such application exists |
950 | 批量操作已开始,请先调用end_batch接口结束前一个批量操作 | begin_batch already called, please make sure to call end_batch first |
951 | 结束批量操作的接口调用不应该在start_batch接口之前被调用 | end_batch called before start_batch |
952 | 每个批量调用不能包含多于20个接口调用 | Each batch API can not contain more than 20 items |
953 | 该接口不适合在批量调用操作中被使用 | Method is not allowed in batch mode |
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2020/06/28 07:50