
# 声音复刻接口
#### 前提条件
- 确保已按照[配置Java环境](https://support.huaweicloud.com/sdkreference-sis/sis_05_0041.html)配置完毕。
- 请参考[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)获取最新版本SDK包。
- 使用预置音色或注册的声音合成语音。
- 仅上海一局点支持该接口。
 
#### 初始化Client
初始化vcsClient详见[表1]。
 表1vcsClient初始化参数 
| 参数名称            | 是否必选 | 参数类型   | 描述                                                                                                                        |
|:---|:---|:---|:---|
| ak              | 是    | String | 用户的ak，可参考[AK/SK认证](https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html)。                                    |
| sk              | 是    | String | 用户的sk，可参考[AK/SK认证](https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html)。                                    |
| region          | 是    | String | 区域，如：cn-east-3，具体请参考[终端节点](https://support.huaweicloud.com/api-sis/sis_03_0004.html)。                                     |
| projectId       | 是    | String | 项目ID，同region一一对应，参考获取项目ID。                                                                                                |
| serviceEndPoint | 否    | String | 终端节点，一般使用默认即可，例如：https://\*\*\*\*\*.myhuaweicloud.com，详见[终端节点](https://support.huaweicloud.com/api-sis/sis_03_0004.html)。 |
   
#### 请求参数
请求类型为vcsRequest，详见[表2]。
 表2vcsRequest 
| 参数名称      | 是否必选 | 参数类型   | 描述                                                                         |
|:---|:---|:---|:---|
| path      | 是    | String | 待注册的录音数据，使用base64编码，大小不超过6MB。支持wav、mp3、m4a格式，采样率不小于16kHz，时长在5-25秒，支持单、双通道。 |
| audioPath | 是    | String | 待合成音频存储路径。                                                                 |
| text      | 是    | String | 待合成文本，文本的长度不大于300字符。                                                       |
| config    | 是    | Object | 详见[表3]。                                   |
   
 表3Config 
| 参数名称        | 是否必选 | 参数类型    | 描述                                                                                     |
|:---|:---|:---|:---|
| audioFormat | 否    | String  | 合成音频的格式。支持wav、mp3、pcm，默认wav                                                            |
| sampleRate  | 否    | String  | 合成音频的采样率。支持8kHz、16kHz、24kHz，默认16kHz                                                    |
| voiceName   | 是    | String  | 合成所使用的音色名称，可选择用户注册的音色或预置音色。预置音色取值范围参考[表4]            |
| speed       | 否    | Integer | 语速。 取值范围：-500\~500 默认值：0   |
| pitch       | 否    | Integer | 音高。 取值范围： -500\~500 默认值：0 |
| volume      | 否    | Integer | 音量。 取值范围：0\~100 默认值：50     |
   
 表4Timbre 
| 参数名称 | voice_name                  | 类型   | 使用场景 | 支持采样率（Hz）  |
|:---|:---|:---|:---|:---|
| 华小莉  | chinese_huaxiaoli_common    | 标准女声 | 中英混合 | 8k/16k/24k |
| 华小智  | chinese_huaxiaozhi_common   | 男童声  | 中英混合 | 8k/16k/24k |
| 华小天  | chinese_huaxiaotian_common  | 朝气男声 | 中英混合 | 8k/16k/24k |
| 华小媛  | chinese_huaxiaoyuan_common  | 成熟女声 | 中英混合 | 8k/16k/24k |
| 华小静  | chinese_huaxiaojing_common  | 女童声  | 中英混合 | 8k/16k/24k |
| 华小博  | chinese_huaxiaobo_common    | 标准男声 | 中英混合 | 8k/16k/24k |
| 华小柔  | chinese_huaxiaorou_common   | 标准女声 | 中英混合 | 8k/16k/24k |
| 华小悠  | chinese_huaxiaoyou_common   | 嘹亮女声 | 中英混合 | 8k/16k/24k |
| 华小晴  | chinese_huaxiaoqing_common  | 青春女声 | 中英混合 | 8k/16k/24k |
| 华小溪  | chinese_huaxiaoxi_common    | 温柔女声 | 中英混合 | 8k/16k/24k |
| 华小彤  | chinese_huaxiaotong_common  | 俏皮女声 | 中英混合 | 8k/16k/24k |
| 华小雅  | chinese_huaxiaoya_common    | 标准女声 | 中英混合 | 8k/16k/24k |
| 华小伟  | chinese_huaxiaowei_common   | 成熟男声 | 中英混合 | 8k/16k/24k |
| 华小帅  | chinese_huaxiaoshuai_common | 标准男声 | 中英混合 | 8k/16k/24k |
| 华小杰  | chinese_huaxiaojie_common   | 温柔男声 | 中英混合 | 8k/16k/24k |
   
#### 响应参数
Java SDK响应结果为Json格式，正确响应详见[表5]，错误响应详见[表7]。
 表5响应参数说明 
| 参数名称    | 参数类型   | 描述                                                              |
|:---|:---|:---|
| traceId | String | 服务内部的令牌，可用于在日志中追溯具体流程。                                          |
| result  | Object | 调用成功时为合成语音内容，调用失败时无此字段，详见[表6]。 |
   
 表6result数据结构 
| 参数名称 | 参数类型   | 描述                                                                       |
|:---|:---|:---|
| data | String | 生成的语音数据，以Base64编码格式返回。用户如需生成音频，需要将返回的Base64编码格式的数据解码成byte数组，再保存为对应格式的音频。 |
   
 表7错误响应 
| 参数名称      | 参数类型   | 描述                     |
|:---|:---|:---|
| errorCode | String | 调用失败时的错误码。 调用成功时无此字段。  |
| errorMsg  | String | 调用失败时的错误信息。 调用成功时无此字段。 |
   
#### 请求示例
- 说明："endpoint"即调用API的请求地址，不同服务不同区域的"endpoint"不同，具体请参见终端节点，当前仅支持上海一。
- 调用合成API，将文本合成为语音。
```
package com.huawei.sis.demo.cn_demo;
import com.huawei.sis.bean.AuthInfo;
import com.huawei.sis.bean.SisConfig;
import com.huawei.sis.bean.SisConstant;
import com.huawei.sis.bean.request.VcsCloneRequest;
import com.huawei.sis.bean.response.VoiceCloneResponse;
import com.huawei.sis.client.VcsClient;
import com.huawei.sis.exception.SisException;
import com.huawei.sis.util.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 声音复刻Demo
 * <p>
 * Copyright 2021 Huawei Technologies Co.,Ltd.
 */
public class VcsDemo {
    private static final Logger log = LoggerFactory.getLogger(VcsDemo.class);
    // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全；
    private String ak = System.getenv("HUAWEICLOUD_SDK_AK");
    private String sk = System.getenv("HUAWEICLOUD_SDK_SK");
    private String region = "";    // 区域，如cn-east-3
    private String projectId = ""; // 项目id，在我的凭证查看。参考https://support.huaweicloud.com/api-sis/sis_03_0008.html
    private String serviceEndPoint = "";  // 可选参数,传入new AuthInfo(ak, sk, region, projectId);
    private String voiceName = ""; // 音色名称，可以使用注册音色或预置音色
    private String text = ""; //  待合成文本
    private String audioPath = "";  // 待合成结果保存路径,例如"D://SIS/audio.wav"
    // 使用该脚本前,保证要使用的声音已经注册,voiceName为声音名称。若没有注册声音,请使用VcsRegisterAndRequest.java脚本，注册声音和查询声音
    public static void main(String[] args) {
        VcsDemo demo = new VcsDemo();
        demo.vcsDemo();
    }
    /**
     * 定义config，所有参数可选，设置超时时间等。
     *
     * @return SisConfig
     */
    private SisConfig getConfig() {
        SisConfig config = new SisConfig();
        // 设置连接超时，默认10000ms
        config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT);
        // 设置读取超时，默认10000ms
        config.setReadTimeout(SisConstant.DEFAULT_READ_TIMEOUT);
        // 设置代理, 一定要确保代理可用才启动此设置。 代理初始化也可用不加密的代理，new ProxyHostInfo(host, port);
        // 设置代理，可参考 config.setProxy(new ProxyHostInfo(host, port, user, password));
        return config;
    }
    private void setParameters(VcsCloneRequest request) {
        // 1. 设置音频格式，默认wav
        request.getVoiceCloneConfig().setAudioFormat("wav");
        // 2. 设置采样率，24000、16000、8000，默认16000
        request.getVoiceCloneConfig().setSampleRate("16000");
        // 3. 设置音色，如 chinese_huaxiaoli_common、chinese_huaxiaotian_common
        request.getVoiceCloneConfig().setVoiceName(voiceName);
        // 4. 设置语速，取值范围为 -500~500，默认值为0
        request.getVoiceCloneConfig().setSpeed(0);
        // 5. 设置音调，取值范围为 -500~500，默认值为0
        request.getVoiceCloneConfig().setPitch(0);
        // 6. 设置音量，取值范围为 0~100，默认值为50
        request.getVoiceCloneConfig().setVolume(50);
    }
    /**
     * 声音复刻demo。
     */
    private void vcsDemo() {
        synthesisVoice();
    }
    private void synthesisVoice() {
        try {
            // 1. 初始化VcsClient
            // 定义authInfo，根据ak，sk，region，projectId
            AuthInfo authInfo = new AuthInfo(ak, sk, region, projectId);
            // 设置config，主要与超时有关
            SisConfig config = getConfig();
            // 根据authInfo和config，构造VcsClient
            VcsClient vcsClient = new VcsClient(authInfo, config);
            // 2. 配置请求
            VcsCloneRequest request = new VcsCloneRequest(voiceName, text);
            setParameters(request);
            request.setSaved(true);  // 是否对合成结果进行保存
            request.setSavePath(audioPath); // 保存路径
            // 3. 发送请求，获取响应。具体结果可通过response.getXX获取。
            VoiceCloneResponse response = vcsClient.synthesisVoice(request);
            log.info(JsonUtils.obj2Str(response, true));
        } catch (SisException e) {
            log.info("error_code:" + e.getErrorCode() + " error_msg:" + e.getErrorMsg());
        }
    }
}
```
#### 响应示例
状态码：200
成功响应示例
```
{  
    "trace_id": "567e8537-a89c-13c3-a882-826321939651",
     "result":{ 
        "data":
"/+MgxAAUeHpMAUkQAANhuRACAIAgKHKQmRisVo0aNAgQIIQyCgGBiwfB8H4IAgCAJg+D4Ph+IAQBBywfB8HwQDGAwfB8Hwf..." 
   }  
}
```
状态码：400
失败响应示例
```
{  
    "error_code": "SIS.1207",  
    "error_msg": "'sample_rate' is invalid"          
}
```
