docs(gateway): gateway 剩余文件注释改中文(逐行 1:1,代码零字节改动)
主人 2026-10-03 拍板「注释一律中文」;gateway 至此整包注释中文化完成(本会话共 3 批: 已推库 16 个文件 + 本批剩余文件)。 校验:机械校验(非注释改动行)= 空;剥注释后代码文本逐行比对全等(不一致文件数 0); 全树 go test ./... 58 包 ok / 0 FAIL;交叉编译绿。
This commit is contained in:
1 parent
91e8d7a029
commit
074ffc4ebf
73 files changed
+2529
-2529
No files matched your search
@@ -10,23 +10,23 @@ import (
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/runtime/multimodal/voice"
|
||||
)
|
||||
|
||||
// maxAudioRequestBytes caps the JSON body a /api/v1/audio/* request may carry so
|
||||
// a huge base64 audio payload cannot exhaust memory.
|
||||
// maxAudioRequestBytes 限定 /api/v1/audio/* 请求可携带的 JSON 体大小,
|
||||
// 使巨大的 base64 音频载荷无法耗尽内存。
|
||||
const maxAudioRequestBytes = 32 << 20
|
||||
|
||||
// transcribeRequest is the POST /api/v1/audio/transcribe body. Audio is a base64
|
||||
// (or data: URI) blob; Format is its encoding ("wav"/"mp3"/"ogg").
|
||||
// transcribeRequest 是 POST /api/v1/audio/transcribe 的请求体。Audio 是 base64
|
||||
// (或 data: URI)数据块;Format 是其编码("wav"/"mp3"/"ogg")。
|
||||
type transcribeRequest struct {
|
||||
Audio string `json:"audio"`
|
||||
Format string `json:"format"`
|
||||
DeviceID string `json:"deviceId,omitempty"`
|
||||
}
|
||||
|
||||
// speechRequest is the POST /api/v1/audio/speech body. Voice/format are accepted
|
||||
// for forward compatibility; synthesis currently follows the server's
|
||||
// VOICE_TTS_VOICE_ID / VOICE_TTS_FORMAT config. Instruction is an optional
|
||||
// per-request emotion/tone override for a cloned voice (声音复刻); a system voice
|
||||
// (longxiaochun_v3) ignores it and never receives a free-form instruction.
|
||||
// speechRequest 是 POST /api/v1/audio/speech 的请求体。Voice/format 为前向
|
||||
// 兼容而被接受;合成目前遵循服务端的
|
||||
// VOICE_TTS_VOICE_ID / VOICE_TTS_FORMAT 配置。Instruction 是可选的
|
||||
// 每请求情绪/语气覆盖,用于克隆音色(声音复刻);系统音色
|
||||
// (longxiaochun_v3)忽略它,绝不接收自由形式的指令。
|
||||
type speechRequest struct {
|
||||
Text string `json:"text"`
|
||||
Voice string `json:"voice,omitempty"`
|
||||
@@ -34,9 +34,9 @@ type speechRequest struct {
|
||||
Instruction string `json:"instruction,omitempty"`
|
||||
}
|
||||
|
||||
// handleTranscribe runs STT on the uploaded audio and returns the recognized
|
||||
// text. It is the REST source for native clients, bypassing the 4KB WebSocket
|
||||
// frame limit that would truncate a base64 audio blob.
|
||||
// handleTranscribe 对上传的音频执行 STT 并返回识别出的
|
||||
// 文本。它是原生客户端的 REST 来源,绕过 4KB WebSocket
|
||||
// 帧上限(该上限会截断 base64 音频块)。
|
||||
func (s *Server) handleTranscribe(w http.ResponseWriter, r *http.Request) {
|
||||
r.Body = http.MaxBytesReader(w, r.Body, maxAudioRequestBytes)
|
||||
var req transcribeRequest
|
||||
@@ -76,8 +76,8 @@ func (s *Server) handleTranscribe(w http.ResponseWriter, r *http.Request) {
|
||||
writeJSON(w, http.StatusOK, out)
|
||||
}
|
||||
|
||||
// handleSpeech synthesizes speech for the given text and writes the raw audio
|
||||
// bytes (audio/<format>) back — a binary response, not a JSON envelope.
|
||||
// handleSpeech 为给定文本合成语音并写回原始音频
|
||||
// 字节(audio/<format>)—— 二进制响应,不是 JSON 信封。
|
||||
func (s *Server) handleSpeech(w http.ResponseWriter, r *http.Request) {
|
||||
r.Body = http.MaxBytesReader(w, r.Body, maxAudioRequestBytes)
|
||||
var req speechRequest
|
||||
@@ -120,18 +120,18 @@ func (s *Server) handleSpeech(w http.ResponseWriter, r *http.Request) {
|
||||
_, _ = w.Write(audi.Data)
|
||||
}
|
||||
|
||||
// voiceCloneRequest is the POST /api/v1/audio/voice-clone body. URL is the public
|
||||
// reference audio URL; prefix is the optional voice-name prefix (≤10 alnum chars).
|
||||
// Neither is logged, and the URL is not persisted (owner + audit only, red line).
|
||||
// voiceCloneRequest 是 POST /api/v1/audio/voice-clone 的请求体。URL 是公开的
|
||||
// 参考音频 URL;prefix 是可选音色名前缀(≤10 个字母数字字符)。
|
||||
// 二者都不记日志,URL 也不持久化(仅 owner + 审计,红线)。
|
||||
type voiceCloneRequest struct {
|
||||
URL string `json:"url"`
|
||||
Prefix string `json:"prefix,omitempty"`
|
||||
}
|
||||
|
||||
// handleVoiceClone creates a custom TTS voice from a public reference audio URL
|
||||
// via the Bailian voice-enrollment API (声音复刻 create_voice) and returns the new
|
||||
// voice_id. Owner-only + audited; the reference URL is never written to the audit
|
||||
// trail or the log (red line).
|
||||
// handleVoiceClone 经百炼声音注册 API(声音复刻 create_voice)从公开
|
||||
// 参考音频 URL 创建自定义 TTS 音色,并返回新的
|
||||
// voice_id。仅 owner + 带审计;参考 URL 绝不写入审计
|
||||
// 记录或日志(红线)。
|
||||
func (s *Server) handleVoiceClone(w http.ResponseWriter, r *http.Request) {
|
||||
r.Body = http.MaxBytesReader(w, r.Body, maxAudioRequestBytes)
|
||||
var req voiceCloneRequest
|
||||
@@ -153,7 +153,7 @@ func (s *Server) handleVoiceClone(w http.ResponseWriter, r *http.Request) {
|
||||
voiceID, err := s.voice.CloneVoice(r.Context(), req.URL, req.Prefix)
|
||||
if err != nil {
|
||||
s.auditClaims(r, "audio.voice-clone", "error")
|
||||
// Do not log the cause: a provider error body may echo the reference URL.
|
||||
// 不要记录原因:provider 的错误体可能回显参考 URL。
|
||||
s.log.Warn("voice clone failed")
|
||||
writeError(w, apperr.Wrap(apperr.ErrInternal, "voice_clone_failed", "voice clone failed"))
|
||||
return
|
||||
@@ -162,7 +162,7 @@ func (s *Server) handleVoiceClone(w http.ResponseWriter, r *http.Request) {
|
||||
writeJSON(w, http.StatusOK, map[string]any{"voiceId": voiceID})
|
||||
}
|
||||
|
||||
// audioMime maps an audio format to its Content-Type for the speech response.
|
||||
// audioMime 把音频格式映射为其用于语音响应的 Content-Type。
|
||||
func audioMime(format string) string {
|
||||
switch strings.ToLower(format) {
|
||||
case "mp3", "mpeg":
|
||||
|
||||
Reference in new issue
Block a user