VoiceInfoDTO.java 4.4 KB
package com.xly.tts.bean;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 语音信息数据传输对象
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class VoiceInfoDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 语音唯一标识(如:zh-CN-XiaoxiaoNeural)
     */
    private String name;

    /**
     * 语音显示名称(友好名称)
     */
    private String displayName;

    /**
     * 语言区域代码(如:zh-CN, en-US, ja-JP)
     */
    private String locale;

    /**
     * 性别:Male, Female
     */
    private String gender;

    /**
     * 建议的使用代码
     */
    private String suggestedCode;

    /**
     * 语音类型:Standard, Neural
     */
    @Builder.Default
    private String voiceType = "Neural";

    /**
     * 是否本地可用
     */
    @Builder.Default
    private Boolean localAvailable = true;

    /**
     * 状态:available, unavailable, deprecated
     */
    @Builder.Default
    private String status = "available";

    /**
     * 采样率
     */
    private Integer sampleRate;

    /**
     * 比特率
     */
    private Integer bitRate;

    /**
     * 语速范围(如:-50% 到 +50%)
     */
    private String rateRange;

    /**
     * 音量范围
     */
    private String volumeRange;

    /**
     * 音高范围
     */
    private String pitchRange;

    /**
     * 描述信息
     */
    private String description;

    /**
     * 创建时间戳
     */
    private Long createTime;

    /**
     * 更新时间戳
     */
    private Long updateTime;

    /**
     * 是否为默认语音
     */
    @Builder.Default
    private Boolean isDefault = false;

    /**
     * 是否为推荐语音
     */
    @Builder.Default
    private Boolean isRecommended = false;

    /**
     * 排序权重
     */
    @Builder.Default
    private Integer sortWeight = 0;

    /**
     * 额外属性(JSON格式)
     */
    private String extraProperties;

    // 便捷方法

    /**
     * 获取语言代码(如:zh, en, ja)
     */
    public String getLanguageCode() {
        if (locale != null && locale.contains("-")) {
            return locale.split("-")[0];
        }
        return locale;
    }

    /**
     * 获取国家/地区代码(如:CN, US, JP)
     */
    public String getCountryCode() {
        if (locale != null && locale.contains("-")) {
            String[] parts = locale.split("-");
            if (parts.length > 1) {
                return parts[1];
            }
        }
        return "";
    }

    /**
     * 是否为中文语音
     */
    public Boolean isChinese() {
        return locale != null && locale.startsWith("zh-");
    }

    /**
     * 是否为英文语音
     */
    public Boolean isEnglish() {
        return locale != null && locale.startsWith("en-");
    }

    /**
     * 是否为女性语音
     */
    public Boolean isFemale() {
        return "Female".equalsIgnoreCase(gender);
    }

    /**
     * 是否为男性语音
     */
    public Boolean isMale() {
        return "Male".equalsIgnoreCase(gender);
    }

    /**
     * 获取语音分类
     */
    public String getCategory() {
        if (isChinese()) {
            return "中文语音";
        } else if (isEnglish()) {
            return "英文语音";
        } else if (locale != null) {
            String lang = getLanguageCode();
            switch (lang) {
                case "ja": return "日语语音";
                case "ko": return "韩语语音";
                case "fr": return "法语语音";
                case "de": return "德语语音";
                case "es": return "西班牙语语音";
                default: return "其他语音";
            }
        }
        return "未知";
    }

    /**
     * 获取完整的显示名称
     */
    public String getFullDisplayName() {
        StringBuilder sb = new StringBuilder();

        if (displayName != null) {
            sb.append(displayName);
        } else if (name != null) {
            sb.append(name);
        }

        if (locale != null) {
            sb.append(" (").append(locale).append(")");
        }

        if (gender != null) {
            sb.append(" - ").append("Female".equalsIgnoreCase(gender) ? "女声" : "男声");
        }

        return sb.toString();
    }
}