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}) }