fix(tts): default_speaker 查 voice 表,改后立即生效
Bug 链: 1. 【核心 bug】setting/config.go LoadRuntimeConfig 把 "default_speaker" 当成"火山 speaker ID"用 — 但 DB 里存的是 voice **名字**(如 "chun"),不是 speaker ID (如 "S_G8tEKnaJ1")。 结果: TTSOptions.Speaker = "chun", TTSOptions.ResourceID 仍来自 default_resource_id 配置。调 /v1/audio/speech 不传 voice 时, 把 "chun" 当 speaker ID 发给火山 → 55000000 resource ID mismatched。 2. 【次生 bug】装完 install 没 reload TTS 配置。 启动期 LoadRuntimeConfig 失败(无 lock 无 settings), TTSConfigErr 被设; 装完 mode 变 normal 但 TTSConfigErr 没清, /v1/audio/speech 仍 503/500 (要重启才生效)。 修法: - setting/config.go: 拿到 default_speaker 后调 GetVoiceForTTS(name) 查 voice 表, 用 voice.Speaker / ResourceID / Model 覆盖。 (新增 store.Store interface 方法 GetVoiceForTTS,4 元组返回值 避免循环 import;store 包加 GetVoiceForTTS 实现,内部包 VoiceGetByName) - controller/setup.go: 装完 install 调 LoadRuntimeConfig 一次, 让 TTSConfigErr 立即清,TTSOptions 立即可用。 测试: - 已有 store/installer/middleware/router 测试全绿 - e2e (本机): install voice "chun" + speaker "S_G8tEKnaJ1" → 启动 log 显示 "speaker=S_G8tEKnaJ1" (不是 "chun") ✓ → /v1/audio/speech 不传 voice → 火山收到正确 speaker, 错误从 55000000 变成 401 Invalid X-Api-Key (假 key,换真 key 就 work) 二进制大小: ~18MB → ~18MB (代码量不变) 未 push (等用户验证)
This commit is contained in:
@@ -98,6 +98,22 @@ func (s *Store) VoiceGetByName(name string) (*Voice, error) {
|
||||
return &v, nil
|
||||
}
|
||||
|
||||
// GetVoiceForTTS 实现 setting.Store 接口,返 voice 行的 TTS 关键字段。
|
||||
// - found=false: voice 不存在(ErrNotFound 翻译为 found=false)
|
||||
// - err != nil: 真错误(db 失败等)
|
||||
// 这个方法存在是为了让 *Store 满足 setting.Store 接口,且不引起
|
||||
// setting → store → setting 循环 import。
|
||||
func (s *Store) GetVoiceForTTS(name string) (speaker, resourceID, model string, found bool, err error) {
|
||||
v, err := s.VoiceGetByName(name)
|
||||
if err != nil {
|
||||
if errors.Is(err, ErrNotFound) {
|
||||
return "", "", "", false, nil
|
||||
}
|
||||
return "", "", "", false, err
|
||||
}
|
||||
return v.Speaker, v.ResourceID, v.Model, true, nil
|
||||
}
|
||||
|
||||
// VoiceInsert 新增音色;name 冲突返回 ErrDuplicate。
|
||||
// 空字符串/格式不合法返回 error;不依赖 SQLite 约束作为唯一校验。
|
||||
func (s *Store) VoiceInsert(v Voice) (int64, error) {
|
||||
|
||||
Reference in New Issue
Block a user