百度语音TTS

/ Java / 没有评论 / 4562浏览

百度语音TTS

实现步骤

只需三步1小时内即可完成语音合成接口的调用,让您的应用“开口说话”。

1

Step1:成为百度AI开放平台的开发者

要调用百度AI开放平台的语音合成能力先要成为百度AI开放平台的开发者,首先让我们花5分钟来注册百度AI开放平台的开发者,并新建一个百度语音合成应用。

先点击此处注册百度账户进入 如下图 的页面快速的建立一个百度账号吧。

2

我们有账号之后登录,并且点击此处创建一个应用如下图

3

然后就能看到创建完的应用和 API KEY 以及 Secret KEY

4

Step2:准备数据

语音合成是将文本转换为可以播放的音频文件的服务,我们从大姚的订单库中找一段订单信息的文本如下:

三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)

Step3: 编写一个示例程序

参见如下步骤.

简介

Hi,您好,欢迎使用百度语音合成服务。

本文档主要针对Java开发者,描述百度语音合成接口服务的相关技术内容。如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:

接口能力

接口名称接口能力简要描述
语音合成将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的口语输出的技术。

注意事项

目前本SDK的功能同REST API,需要联网调用http接口 。REST API 仅支持最多512字(1024 字节)的音频合成,合成的文件格式为mp3。没有其他额外功能。 如果需要使用离线合成等其它功能,请使用Android或者iOS 合成 SDK

请严格按照文档里描述的参数进行开发。请注意以下几个问题:

  1. 合成文本长度必须小于1024字节,如果本文长度较长,可以采用多次请求的方式。切忌文本长度超过限制。
  2. 新创建语音合成应用不限制每日调用量,但有QPS限额。详细限额数据可在控制台中查看。完成个人实名认证及企业认证可提高QPS限额。若需更大QPS可进一步商务合作咨询
  3. 必填字段中,严格按照文档描述中内容填写。

快速入门

安装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包步骤如下

  1. 官方网站下载Java SDK压缩工具包。

  2. 将下载的aip-java-sdk-version.zip解压后,复制到工程文件夹中。

  3. 在Eclipse右键“工程 -> Properties -> Java Build Path -> Add JARs”。

  4. 添加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_KEYSECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。

配置AipSpeech

如果用户需要配置AipSpeech的一些细节参数,可以在构造AipSpeech之后调用接口设置参数,目前只支持以下参数:

接口说明
setConnectionTimeoutInMillis建立连接的超时时间(单位:毫秒)
setSocketTimeoutInMillis通过打开的连接传输数据的超时时间(单位:毫秒)
setHttpProxy设置http代理服务器
setSocketProxy设置socket代理服务器 (http和socket类型代理服务器只能二选一)

语音合成

接口描述

基于该接口,开发者可以轻松的获取语音合成能力

请求说明

举例,要把一段文字合成为语音文件:

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();            //生成的音频数据
}
参数类型描述是否必须
texString合成的文本,使用UTF-8编码, 请注意文本长度必须小于1024字节
cuidString用户唯一标识,用来区分用户, 填写机器 MAC 地址或 IMEI 码,长度为60以内
spdString语速,取值0-9,默认为5中语速
pitString音调,取值0-9,默认为5中语调
volString音量,取值0-15,默认为5中音量
perString发音人选择, 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文本包含以下参数:

错误码

SDK本地检测参数返回的错误码

error_codeerror_msg备注
SDK108connection or read data time out连接超时或读取数据超时

服务端返回的错误码

错误码含义
500不支持的输入
501输入参数不正确
502token验证失败
503合成后端错误

百度Open API错误码定义

Error CodeError 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
101api key无效Invalid API key
102session key无效Session key invalid or no longer valid
103call_id参数无效Invalid/Used call_id parameter
104无效签名Incorrect signature
105请求参数过多Too many parameters
106未知的签名方法Unsupported signature method
107timestamp参数无效Invalid/Used timestamp parameter
108无效的user idInvalid user id
109无效的用户资料字段名Invalid user info field
110无效的access tokenAccess token invalid or no longer valid
111access token过期Access token expired
112session key过期Session key expired
114无效的ip参数Invalid Ip
210用户不可见User not visible
211获取未授权的字段Unsupported permission
212没有权限获取用户的emailNo 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