40760aa884
- server:Go 网关(WS 流式识别中继/计费配额/微信登录支付 mock/反馈/埋点),gummy provider 已真实联调 - desktop:Tauri 2(全局快捷键 push-to-talk/浮层/托盘/设置/登录购买/反馈/首启引导) - android:Compose 主 App + IME(键盘内录音直传) - ios:App + 键盘扩展(1A spike 实证键盘内不可录音,走 deep link 听写) - design/design-pipeline:设计系统 + token 导出 iOS/Android 主题 - doc:前后端设计文档(HTML);web:官网宣传页;todo:任务看板 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
64 lines
2.0 KiB
Go
64 lines
2.0 KiB
Go
// Package protocol 定义客户端 ↔ 后端的通信契约,是 5 端(server/desktop/android/ios/web)
|
||
// 对齐的唯一真相源。设计依据 doc/backend-architecture.html 第四章。
|
||
package protocol
|
||
|
||
// 音频参数:二进制帧为 16kHz / 16bit / mono PCM,每 100ms 一帧。
|
||
const (
|
||
SampleRate = 16000
|
||
FrameMillis = 100
|
||
FrameBytes = SampleRate * 2 * FrameMillis / 1000 // 3200
|
||
|
||
// MaxSessionSeconds 单会话上限,到点服务端自动截断定稿(SESSION_LIMIT)。
|
||
MaxSessionSeconds = 180
|
||
|
||
// 设备维度 30 分钟滑动窗口限制。
|
||
RateWindowSeconds = 30 * 60
|
||
RateMaxSessions = 30
|
||
RateMaxAudioSeconds = 30 * 60
|
||
MaxConcurrentPerDevice = 1
|
||
|
||
// TrialDailySeconds 每日免费试用时长(秒)。
|
||
TrialDailySeconds = 180
|
||
)
|
||
|
||
// 上行文本帧类型。
|
||
const (
|
||
MsgStart = "start"
|
||
MsgStop = "stop"
|
||
MsgCancel = "cancel"
|
||
)
|
||
|
||
// 下行文本帧类型。
|
||
const (
|
||
MsgPartial = "partial"
|
||
MsgFinal = "final"
|
||
MsgUsage = "usage"
|
||
MsgError = "error"
|
||
)
|
||
|
||
// ClientMsg 客户端上行控制消息(文本帧)。音频走二进制帧。
|
||
type ClientMsg struct {
|
||
Type string `json:"type"` // start | stop | cancel
|
||
SessionID string `json:"session_id"`
|
||
SampleRate int `json:"sample_rate,omitempty"` // start 必填,当前仅支持 16000
|
||
Format string `json:"format,omitempty"` // start 必填,当前仅支持 pcm16
|
||
}
|
||
|
||
// ServerMsg 服务端下行消息(文本帧)。
|
||
type ServerMsg struct {
|
||
Type string `json:"type"` // partial | final | usage | error
|
||
SessionID string `json:"session_id,omitempty"`
|
||
|
||
// partial / final
|
||
Text string `json:"text,omitempty"`
|
||
|
||
// usage:识别中每 2s 及 stop 后下发,驱动 UI 实时刷新余额
|
||
SessionSeconds int `json:"session_seconds,omitempty"`
|
||
BalanceSeconds int64 `json:"balance_seconds,omitempty"`
|
||
TrialRemaining int `json:"trial_remaining,omitempty"`
|
||
|
||
// error
|
||
Code string `json:"code,omitempty"`
|
||
Message string `json:"message,omitempty"`
|
||
}
|