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:
@@ -11,6 +11,7 @@ import (
|
||||
|
||||
"github.com/volcano-tts/tts-api/common"
|
||||
"github.com/volcano-tts/tts-api/dto"
|
||||
"github.com/volcano-tts/tts-api/telemetry"
|
||||
)
|
||||
|
||||
// MetricsRecorder 是适配器向上报告埋点的接口。
|
||||
@@ -83,7 +84,7 @@ func Synthesis(
|
||||
|
||||
if common.DebugLog {
|
||||
log.Printf("TTS upstream: resource_id=%s speaker=%s model=%q format=%s sample_rate=%d speech_rate=%d additions=%q",
|
||||
opts.ResourceID, opts.Speaker, opts.Model, opts.Format, opts.SampleRate, opts.SpeechRate, extractAdditionsForLog(body))
|
||||
opts.ResourceID, telemetry.MaskSpeaker(opts.Speaker), opts.Model, opts.Format, opts.SampleRate, opts.SpeechRate, extractAdditionsForLog(body))
|
||||
}
|
||||
|
||||
resp, err := client.PostStream(ctx, "https://openspeech.bytedance.com/api/v3/tts/unidirectional", headers, body)
|
||||
@@ -144,7 +145,7 @@ func Synthesis(
|
||||
mtr.UpstreamFinished(opts.Speaker, opts.Model, opts.Format, "ok", duration, parsed.FirstChunk, parsed.Chunks, len(finalData), 0)
|
||||
|
||||
log.Printf("TTS 合成成功 - 音色=%s 格式=%s 文本=%d字 音频=%d字节 分片=%d 耗时=%v",
|
||||
opts.Speaker, clientFormat, len(text), len(finalData), parsed.Chunks, duration)
|
||||
telemetry.MaskSpeaker(opts.Speaker), clientFormat, len(text), len(finalData), parsed.Chunks, duration)
|
||||
|
||||
return &dto.SynthesisResult{
|
||||
AudioData: finalData,
|
||||
|
||||
Reference in New Issue
Block a user