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