package com.sonic.cow.client.input.tts;

public class TtsInput {

    public TtsInput() {
    }

    public TtsInput(String appId, String cluster, String voiceType) {
        this.app.appid = appId;
        this.app.cluster = cluster;
        this.audio.voice_type = voiceType;
    }

    /**
     * 应用相关配置
     */
    private App app = new App();

    /**
     * 用户相关配置
     */
    private User user = new User();

    /**
     * 音频相关配置
     */
    private Audio audio = new Audio();

    /**
     * 请求相关配置
     */
    private Request request = new Request();

    public App getApp() {
        return app;
    }

    public void setApp(App app) {
        this.app = app;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Audio getAudio() {
        return audio;
    }

    public void setAudio(Audio audio) {
        this.audio = audio;
    }

    public Request getRequest() {
        return request;
    }

    public void setRequest(Request request) {
        this.request = request;
    }

    public static class App {
        /**
         * 应用标识，必需，需要申请
         */
        private String appid;

        /**
         * 应用令牌，必需，可传任意非空字符串，目前未生效，建议使用默认值
         */
        private String token = "access_token";

        /**
         * 业务集群，必需，可选值：volcano_icl 或 volcano_icl_concurr
         */
        private String cluster;

        public App() {

        }

        public String getAppid() {
            return appid;
        }

        public void setAppid(String appid) {
            this.appid = appid;
        }

        public String getToken() {
            return token;
        }

        public void setToken(String token) {
            this.token = token;
        }

        public String getCluster() {
            return cluster;
        }

        public void setCluster(String cluster) {
            this.cluster = cluster;
        }
    }

    public static class User {
        /**
         * 用户标识，必需，可传任意非空字符串，传入值可通过服务端日志追溯
         */
        private String uid;

        public String getUid() {
            return uid;
        }

        public void setUid(String uid) {
            this.uid = uid;
        }
    }

    public static class Audio {
        /**
         * 音色类型，必需，填入以 S_ 开头的声音 ID（SpeakerId），用于语音合成参考音色
         * 备注：声音复刻语音合成请通过下单获取
         */
        private String voice_type;

        /**
         * 音频编码格式，可选值：wav / pcm / ogg_opus / mp3，默认 pcm
         * 备注：wav 不支持流式
         */
        private String encoding = "pcm";

        /**
         * 音量调节，范围 [0.5, 2]，默认 1.0，通常保留一位小数
         * 备注：0.5 表示原音量 0.5 倍，2 表示原音量 2 倍
         */
        private float loudness_ratio = 1.0f;

        /**
         * 音频采样率，默认 24000，可选值：8000、16000、24000
         */
        private int rate = 24000;

        /**
         * 语速，范围 [0.2, 3]，默认 1.0，通常保留一位小数
         */
        private float speed_ratio = 1.0f;

        /**
         * 明确语种，非必需，指定后仅读指定语种的文本
         * 可选值：
         * - 不设置：正常中英混
         * - crosslingual：启用多语种前端（包含 zh, en, ja, es-mx, id, pt-br）
         * - zh：中文为主，支持中英混
         * - en：仅英文
         * - ja：仅日文
         * - es-mx：仅墨西哥西班牙语
         * - id：仅印尼语
         * - pt-br：仅巴西葡萄牙语
         * - de：仅德语（model_type=2 或 3 时支持）
         * - fr：仅法语（model_type=2 或 3 时支持）
         * 备注：
         * - model_type=2（DiT 标准版）建议指定明确语种，支持 zh, en, ja, es-mx, id, pt-br, de, fr
         * - model_type=3（DiT 还原版）必须指定明确语种，仅支持 zh, en
         */
        private String explicit_language;

        /**
         * 参考语种，非必需，给模型提供参考的语种
         * 可选值：
         * - 不设置：西欧语种采用英语
         * - id：西欧语种采用印尼语
         * - es：西欧语种采用墨西哥西班牙语
         * - pt：西欧语种采用巴西葡萄牙语
         */
        private String context_language;

        public String getVoice_type() {
            return voice_type;
        }

        public void setVoice_type(String voice_type) {
            this.voice_type = voice_type;
        }

        public String getEncoding() {
            return encoding;
        }

        public void setEncoding(String encoding) {
            this.encoding = encoding;
        }

        public float getLoudness_ratio() {
            return loudness_ratio;
        }

        public void setLoudness_ratio(float loudness_ratio) {
            this.loudness_ratio = loudness_ratio;
        }

        public int getRate() {
            return rate;
        }

        public void setRate(int rate) {
            this.rate = rate;
        }

        public float getSpeed_ratio() {
            return speed_ratio;
        }

        public void setSpeed_ratio(float speed_ratio) {
            this.speed_ratio = speed_ratio;
        }

        public String getExplicit_language() {
            return explicit_language;
        }

        public void setExplicit_language(String explicit_language) {
            this.explicit_language = explicit_language;
        }

        public String getContext_language() {
            return context_language;
        }

        public void setContext_language(String context_language) {
            this.context_language = context_language;
        }
    }

    public static class Request {
        /**
         * 请求标识，必需，需要保证每次调用传入值唯一，建议使用 UUID
         */
        private String reqid = java.util.UUID.randomUUID().toString();

        /**
         * 合成语音的文本，必需，长度限制 1024 字节（UTF-8 编码）
         */
        private String text;

        /**
         * 文本类型，可选值：plain / ssml，默认 plain
         * 备注：DiT 音色暂不支持 ssml，参考 SSML 标记语言
         */
        private String text_type = "plain";

        /**
         * 时间戳相关，非必需，传入 1 表示启用
         * 备注：启用后返回原文本的时间戳，保留原文中的阿拉伯数字或特殊符号，多个标点连用或空格会被处理但不影响时间戳连贯性
         */
        private int with_timestamp;

        /**
         * 操作，必需，可选值：query（非流式，HTTP 只能用 query）/ submit（流式）
         */
        private String operation = "query";

        /**
         * 复刻 1.0 语速相关，非必需，传入 1 表示启用
         * 备注：用以解决 1.0 的声音复刻合成时语速过快的情况
         */
        private int split_sentence;

        /**
         * 句尾静音，非必需，范围 0~30000ms
         * 备注：设置后可在句尾增加静音时长，仅针对传入文本最后的句尾，需在 extra_param 中设置 enable_trailing_silence_audio=true
         */
        private float silence_duration;

        /**
         * 额外参数，非必需，JSON 格式字符串
         * 支持参数：
         * - mute_cut_remain_ms：句首静音参数，需配合 mute_cut_threshold 使用（如 {"mute_cut_threshold":"400","mute_cut_remain_ms":"100"}）
         * - disable_emoji_filter：布尔值，默认为 false，开启后 emoji 表情在文本中不过滤显示，建议搭配时间戳使用
         * - unsupported_char_ratio_thresh：浮点数，默认 0.3，最大 1.0，检测不支持语种超过该比例返回错误或兜底音频
         * - cache_config：缓存相关参数，开启后相同文本直接读取缓存（1 小时有效），不附带时间戳（如 {"cache_config":{"text_type":1,"use_cache":true}})
         * 备注：MP3 格式句首存在 100ms 内无法消除的静音，WAV 格式可完全消除句首静音
         */
        private String extra_param;

        public String getReqid() {
            return reqid;
        }

        public void setReqid(String reqid) {
            this.reqid = reqid;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public String getText_type() {
            return text_type;
        }

        public void setText_type(String text_type) {
            this.text_type = text_type;
        }

        public int getWith_timestamp() {
            return with_timestamp;
        }

        public void setWith_timestamp(int with_timestamp) {
            this.with_timestamp = with_timestamp;
        }

        public String getOperation() {
            return operation;
        }

        public void setOperation(String operation) {
            this.operation = operation;
        }

        public int getSplit_sentence() {
            return split_sentence;
        }

        public void setSplit_sentence(int split_sentence) {
            this.split_sentence = split_sentence;
        }

        public float getSilence_duration() {
            return silence_duration;
        }

        public void setSilence_duration(float silence_duration) {
            this.silence_duration = silence_duration;
        }

        public String getExtra_param() {
            return extra_param;
        }

        public void setExtra_param(String extra_param) {
            this.extra_param = extra_param;
        }
    }
}