fix(privacy): speaker ID 不再裸奔(3 处)

speaker 是火山复刻音色 ID,用户付费资产,不能裸奔。
本次修复 3 处泄漏:

1. controller/tts.go: /metrics label 用 sha1(speaker)[:8] 替代
   - /metrics 无鉴权,Prometheus 可枚举,原值直接暴露是最大的泄漏面
   - 哈希替代保留 per-voice 聚合能力,反推不出原值
   - Admin UI 想看原名通过 /api/voices 拿 name 字段

2. setting/config.go: 启动日志 LogStartupSummary 用 MaskSpeaker
   - API Key 早用 maskAPIKey,speaker 漏了
   - 现在 S_G8tEKnaJ1 形式

3. adapter/volcano/synthesis.go: 合成 debug + 成功日志用 MaskSpeaker
   - 之前 resource_id=xxx speaker=原始ID 直接打
   - 现在打码

新增 telemetry/labels.go:
- SpeakerLabel(s) -> sha1(s)[:8] (8 字符十六进制,稳定、不可逆、同输入同输出)
- MaskSpeaker(s) -> 前 4 + **** + 后 4 (空串返中文未设置,长度 <=4 全打码)
- 空 speaker label -> 'unknown' (Prometheus 禁止空 label)

单测 telemetry/labels_test.go 覆盖:
- SpeakerLabel: 同输入同输出 / 不同输入不同输出 / 空串 unknown / 长度 8 / 全是 hex
- MaskSpeaker: 各种长度边界 + 真实火山 ID 形式

e2e 验证(本机):
- 启动日志看到打码形式,无明文
- 自动化 grep 原始 ID 在 server log: 0 匹配
- go test ./... 全绿

未 push(用户要求先修后等 M2 一起发)
This commit is contained in:
sun
2026-08-29 21:42:57 +08:00
parent dbaee35400
commit 51bd7ae37a
4 changed files with 52 additions and 5 deletions
+3 -1
View File
@@ -12,6 +12,7 @@ import (
"github.com/volcano-tts/tts-api/adapter/volcano"
"github.com/volcano-tts/tts-api/common"
"github.com/volcano-tts/tts-api/telemetry"
)
// 全部环境变量读取的单一入口:其它包不允许直接 os.Getenv,只读这里的全局 Config。
@@ -318,7 +319,8 @@ func LogStartupSummary() {
checks := []ttsCheck{
{"BYTEDANCE_TTS_API_KEY", maskAPIKey(TTSOptions.APIKey), TTSOptions.APIKey != ""},
{"BYTEDANCE_TTS_RESOURCE_ID", TTSOptions.ResourceID, TTSOptions.ResourceID != ""},
{"BYTEDANCE_TTS_SPEAKER", TTSOptions.Speaker, TTSOptions.Speaker != ""},
// speaker 是火山复刻音色 ID(用户付费资产),日志里打码,避免明文落盘
{"BYTEDANCE_TTS_SPEAKER", telemetry.MaskSpeaker(TTSOptions.Speaker), TTSOptions.Speaker != ""},
}
missingCount := 0
for _, c := range checks {