%% 方案C — H5端企微 JS-SDK 录音转文字时序图 sequenceDiagram participant U as 用户 participant IB as InputBar.vue participant UWV as useWecomVoice participant API as /api/wecom/jsapi-config participant WX as 企微服务器 participant WV as 企微WebView Note over U,WV: 阶段1:初始化(页面加载时,幂等) IB->>UWV: init() UWV->>WV: 检查 window.wx 是否存在 alt JS-SDK 未加载 UWV->>WV: 动态加载 jweixin-1.2.0.js end UWV->>API: GET /api/wecom/jsapi-config?url=当前页面URL API->>API: get_jsapi_ticket() + sha1 签名 API-->>UWV: { corp_id, agent_id, timestamp, nonce_str, signature } UWV->>WV: wx.config({ appId, timestamp, ..., jsApiList: ['startRecord','stopRecord','translateVoice'] }) WV-->>UWV: wx.ready() 回调 UWV-->>IB: state.isReady = true Note over U,WV: 阶段2:录音 U->>IB: 按下语音按钮 🎤 IB->>UWV: startRecording() UWV->>WV: wx.startRecord() UWV-->>IB: state.isRecording = true IB->>IB: UI 切换为录音状态(按钮变红+提示"松开识别文字") Note over U,WV: 阶段3:停止录音+转文字 U->>IB: 松开语音按钮 IB->>UWV: stopAndTranslate() UWV->>WV: wx.stopRecord() WV-->>UWV: { localId: "wxLocalId_xxx" } UWV-->>IB: state.isTranslating = true UWV->>WV: wx.translateVoice({ localId, isShowProgressTips: 1 }) WV->>WX: 上传录音+请求语音识别 WX-->>WV: 返回识别文字 WV-->>UWV: { translateResult: "帮我重置密码" } UWV-->>IB: 返回识别文字 IB->>IB: inputText.value += translateResult IB->>IB: state.isTranslating = false, state.isRecording = false Note over U,WV: 异常分支 alt 录音超过60秒 WV-->>UWV: 自动触发 stopRecord 回调 UWV->>UWV: 自动执行 translateVoice end alt 转文字失败 WV-->>UWV: fail 回调 { errMsg } UWV-->>IB: showToast("语音识别失败") end