fix(voice): 改用火山「新版控制台」API Key 鉴权(ASR 握手真机验通✅)
一直误用旧版 5 头方案(X-Api-App-Key+Access-Key+App-ID),火山始终 401 grant not found。 用户提供官方文档「新版本控制台」证实:新版只需**单个 X-Api-Key** 头。改对后真机联调: - frame.go setVolcAuthHeaders: X-Api-Key + X-Api-Resource-Id + X-Api-Request-Id + X-Api-Sequence:-1 (删旧 App-Key/Access-Key/App-ID/Connect-Id;去 appID 参数) - asr/tts 调用点同步;config.go 删 Config.AppID;voicecheck/voiceconfig 删 VOLC_APP_ID - 删临时诊断工具 voiceprobe 真机结果:ASR 握手✅(volc.bigasr.sauc.duration 有效);TTS 用 seed-tts-2.0 会话正常建立 (不再 resource mismatch),但暂无音频返回→双向 TTS 事件/payload 待调(下一步)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -8,25 +8,18 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// volcAppKey 是火山语音网关 V3 端点(ASR/TTS/实时对话)**固定**的 App Key 常量——所有客户端
|
||||
// 都用同一个值(官方 demo 硬编码),与账号无关;真正的账号鉴权走 X-Api-Access-Key(新版 API Key)。
|
||||
// 缺这个头握手会被拒:HTTP 400 "app key not found in header or query"。
|
||||
const volcAppKey = "PlgvMymc7f3tQnJ6"
|
||||
|
||||
// setVolcAuthHeaders 按火山 V3 二进制流端点的鉴权规范挂头:固定 App Key + 账号 App ID +
|
||||
// 新版 API Key(Access Key) + 资源 ID + 连接 ID。**不是** Authorization: Bearer(那是 OpenAI
|
||||
// 兼容端点用的,流式二进制端点不认)。App ID 用于解析账号资源授权(缺它会 401 grant not found)。
|
||||
func setVolcAuthHeaders(hdr http.Header, apiKey, appID, resourceID string) {
|
||||
// 直接赋 map(不走 Set)以**保留精确大小写**:Go 的 Header.Set 会把 "X-Api-App-ID"
|
||||
// 规范化成 "X-Api-App-Id",而火山网关按精确大小写匹配(官方 demo 用 X-Api-App-ID)。
|
||||
// 新版 API Key 走 X-Api-Access-Key;X-Api-App-Key 是网关固定常量,缺它 400 "app key not found"。
|
||||
hdr["X-Api-App-Key"] = []string{volcAppKey}
|
||||
hdr["X-Api-Access-Key"] = []string{apiKey}
|
||||
// setVolcAuthHeaders 按火山「新版控制台」API Key 鉴权挂头(文档 6561/1354869「新版本控制台」表)。
|
||||
// 新版只需**单个 X-Api-Key**(控制台的 APP Key)——**不用**旧版的 X-Api-App-Key+X-Api-Access-Key+App-ID,
|
||||
// 也不是 Authorization: Bearer。此前误用旧 5 头方案,火山始终 401 "grant not found in SaaS storage"。
|
||||
// - X-Api-Key = 控制台 API Key(用户那把 key)
|
||||
// - X-Api-Resource-Id= 资源 ID(如 volc.bigasr.sauc.duration / volc.seedasr.sauc.duration / volc.service_type.10029)
|
||||
// - X-Api-Request-Id = 随机 UUID
|
||||
// - X-Api-Sequence = 固定 "-1"
|
||||
func setVolcAuthHeaders(hdr http.Header, apiKey, resourceID string) {
|
||||
hdr["X-Api-Key"] = []string{apiKey}
|
||||
hdr["X-Api-Resource-Id"] = []string{resourceID}
|
||||
hdr["X-Api-Connect-Id"] = []string{newConnectID()}
|
||||
if appID != "" {
|
||||
hdr["X-Api-App-ID"] = []string{appID}
|
||||
}
|
||||
hdr["X-Api-Request-Id"] = []string{newConnectID()}
|
||||
hdr["X-Api-Sequence"] = []string{"-1"}
|
||||
}
|
||||
|
||||
// handshakeDetail 从失败的 WS 握手响应里榨出可诊断信息:HTTP 状态 + 火山排障用的
|
||||
|
||||
Reference in New Issue
Block a user