You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

54 lines
1.6 KiB

package console
import (
"strings"
"yunyan/comm"
"github.com/gin-gonic/gin"
)
// ============================ TTS 音色表下发 ============================
//
// 音色是服务商固定的枚举(见 comm/ttsvoice.go),不该让运营在后台逐个录入——
// 录错一个字客户端就合成失败。后台配 agent 时从这里取候选,只做「选哪一个」。
//
// 只读接口,不落库;改音色表要改代码重新发布。
// getTTSVoices 返回音色表。可按 provider(azure/alibaba)、language、gender 过滤,
// 都不传则返回全部服务商的全量表。
//
// 响应:
//
// { "providers": ["azure","alibaba"],
// "voices": [ {provider,language,gender,voice_id,name}, ... ] }
//
// 前端按 (provider, language, gender) 分组后取第一个作默认值——与运行时
// comm.PickVoice 的口径一致(列表顺序即优先级)。
func (this *serverComp) getTTSVoices(c *gin.Context) {
var req struct {
Provider string `json:"provider"`
Language string `json:"language"`
Gender int32 `json:"gender"`
}
_ = c.ShouldBindJSON(&req)
providers := comm.TTSProviders()
if p := strings.TrimSpace(req.Provider); p != "" {
providers = []string{p}
}
voices := make([]comm.TTSVoice, 0, 64)
for _, p := range providers {
if strings.TrimSpace(req.Language) != "" {
voices = append(voices, comm.VoicesOf(p, req.Language, req.Gender)...)
continue
}
for _, v := range comm.TTSVoices(p) {
if req.Gender != comm.GenderUnset && v.Gender != req.Gender {
continue
}
voices = append(voices, v)
}
}
writeOK(c, gin.H{"providers": comm.TTSProviders(), "voices": voices})
}