package com.hfkj.tts;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hfkj.config.CommonSysConst;
import com.huawei.sis.bean.AuthInfo;
import com.huawei.sis.bean.SisConfig;
import com.huawei.sis.bean.SisConstant;
import com.huawei.sis.bean.request.TtsCustomRequest;
import com.huawei.sis.bean.response.TtsCustomResponse;
import com.huawei.sis.client.TtsCustomizationClient;
import com.huawei.sis.exception.SisException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;


public class HWYunSisService {

    private static Logger log = LoggerFactory.getLogger(HWYunSisService.class);

    private static final int DEFAULT_PITCH = 0;
    private static final int DEFAULT_SPEED = 0;
    private static final int DEFAULT_VOLUME = 50;

    private static String ak = "SQ9ERSS9KKJ7VC72TK4D";
    private static String sk = "YqG2MDTsjXPel5URmKpOfyePrzbMWCU9YdzCUPmp";
    // 区域，如cn-north-1、cn-north-4
    private static String region = "cn-east-3";
    // 项目id。登录管理控制台，鼠标移动到右上角的用户名上，在下拉列表中选择我的凭证，在项目列表中查看项目id。多项目时，展开“所属区域”，从“项目ID”列获取子项目ID。
    private static String projectId = "075456f65780107f2f4ec013ff43b487";
    // 待合成的文本
    private static String text = "";
    // 设置本地音频保存路径.可选择不保存到本地
    private static String path = "";


    /**
     * 用于语音合成参数设置，例如发声人、音高、语速、音量、采样率、连接超时。所有参数均可以不设置，采用默认。
     *
     * @param request 语音合成请求
     */
    private static void setParameter(TtsCustomRequest request) {

        // 设置语音格式，可选MP3，pcm等，默认wav
        request.setAudioFormat("mp3");
        // 音高，[-500, 500], 默认0
        request.setPitch(DEFAULT_PITCH);
        // 语速，[-500, 500]，默认0
        request.setSpeed(DEFAULT_SPEED);
        // 音量，[0, 100]，默认50
        request.setVolume(DEFAULT_VOLUME);
        // 当前支持8000和16000，默认8000
        request.setSampleRate("8000");
        // 设置property，特征字符串，{language}_{speaker}_{domain}
        request.setProperty("chinese_huaxiaowen_common");

        // 设置返回数据是否保存，默认不保存。若保存，则需要设置一下保存路径，如D:/1.wav
        request.setSaved(true);
        request.setSavePath(path);
    }

    /**
     * 定义config，所有参数可选，设置超时时间等。
     *
     * @return SisConfig
     */
    private static SisConfig getConfig() {
        SisConfig config = new SisConfig();
        // 设置连接超时，默认10000ms
        config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT);
        // 设置读取超时，默认10000ms
        config.setReadTimeout(SisConstant.DEFAULT_READ_TIMEOUT);
        // 设置代理, 一定要确保代理可用才启动此设置。 代理初始化也可用不加密的代理，new ProxyHostInfo(host, port);
        // ProxyHostInfo proxy = new ProxyHostInfo(host, port, username, password);
        // config.setProxy(proxy);
        return config;
    }

    /**
     * 根据文本和api，获取生成的音频数据
     */
    public static String ttsCustomDemo(JSONObject object) {
        try {
            log.info("========= START 华为云生成音频数据 START ===========");

            // 1. 初始化TtsCustomizationClient
            // 定义authInfo，根据ak，sk，region, projectId.
            AuthInfo authInfo = new AuthInfo(ak, sk, region, projectId);
            // 定义config，所有参数可选，设置超时时间。
            SisConfig config = getConfig();
            // 根据authInfo和config，构造TtsCustomizationClient
            TtsCustomizationClient tts = new TtsCustomizationClient(authInfo, config);

            text =  "惠支付收款" + object.getString("price") + "元";

            path = CommonSysConst.getSysConfig().getFilesystem() + "/tts/" +  object.getString("price") + ".mp3";

            File file = new File(path);
            if (file.exists()) {
                log.info("返回服务器语音内容 " + JSON.toJSONString(path));
                return "/filesystem/tts/" +  object.getString("price") + ".mp3";
            }
                // 2. 配置请求
            TtsCustomRequest request = new TtsCustomRequest(text);
            // 设置参数，所有参数均可选，如果要保存合成音频文件，需要在request设置
            setParameter(request);

            // 3. 发送请求，获取响应。具体结果可通过response.getXX获取。
            TtsCustomResponse response = tts.getTtsResponse(request);

            log.info("华为云-参数: " + JSON.toJSONString(response));

            if (response.getResult().getData() != null) {
                return "/filesystem/tts/" +  object.getString("price") + ".mp3";
            }

            return null;

        } catch (SisException e) {
            e.printStackTrace();
            System.out.println("error_code:" + e.getErrorCode() + "\nerror_msg:" + e.getErrorMsg());
            return null;

        } finally {
            log.info("========= END 华为云生成音频数据 END ===========");
        }

    }

}
