diff --git a/src/pages/ReportEditor.tsx b/src/pages/ReportEditor.tsx index b5e22b3..e03e7a7 100644 --- a/src/pages/ReportEditor.tsx +++ b/src/pages/ReportEditor.tsx @@ -897,11 +897,11 @@ export default function ReportEditor() { async function getXfAuthUrl(apiKey: string, apiSecret: string): Promise { const host = 'iat-api.xfyun.cn'; const date = new Date().toUTCString(); - const signatureOrigin = `host: "${host}"\ndate: "${date}"\nGET /v2/iat HTTP/1.1`; - const signature = CryptoJS.HmacSHA256(signatureOrigin, apiSecret).toString(CryptoJS.enc.Base64); + const signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2/iat HTTP/1.1`; + const signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(signatureOrigin, apiSecret)); const authorizationOrigin = `api_key="${apiKey}", algorithm="hmac-sha256", headers="host date request-line", signature="${signature}"`; - const authorization = btoa(authorizationOrigin); - return `wss://iat-api.xfyun.cn/v2/iat?authorization=${encodeURIComponent(authorization)}&date=${encodeURIComponent(date)}&host=${encodeURIComponent(host)}`; + const authorization = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(authorizationOrigin)); + return `wss://iat-api.xfyun.cn/v2/iat?authorization=${authorization}&date=${date}&host=${host}`; } function floatTo16BitPCM(input: Float32Array): ArrayBuffer { @@ -925,6 +925,12 @@ export default function ReportEditor() { const toggleListening = async () => { if (isListening) { setIsListening(false); + if (xfWsRef.current && xfWsRef.current.readyState === WebSocket.OPEN) { + try { + const endFrame = { data: { status: 2, format: 'audio/L16;rate=16000', encoding: 'raw', audio: '' } }; + xfWsRef.current.send(JSON.stringify(endFrame)); + } catch {} + } if (xfWsRef.current) { try { xfWsRef.current.close(); } catch {} xfWsRef.current = null; } if (xfAudioContextRef.current) { try { xfAudioContextRef.current.close(); } catch {} xfAudioContextRef.current = null; } if (xfMediaStreamRef.current) { xfMediaStreamRef.current.getTracks().forEach(t => t.stop()); xfMediaStreamRef.current = null; } @@ -955,7 +961,7 @@ export default function ReportEditor() { const pcmBuffer = floatTo16BitPCM(inputData); const base64Audio = arrayBufferToBase64(pcmBuffer); const frame: any = { data: { status: frameStatus, format: 'audio/L16;rate=16000', encoding: 'raw', audio: base64Audio } }; - if (frameStatus === 0) { frame.common = { app_id: xfConfig.appId }; frame.business = { language: 'zh_cn', domain: 'iat', accent: 'mandarin' }; } + if (frameStatus === 0) { frame.common = { app_id: xfConfig.appId }; frame.business = { language: 'zh_cn', domain: 'iat', accent: 'mandarin', dwa: 'wpgs' }; } ws.send(JSON.stringify(frame)); frameStatus = 1; }; diff --git a/src/pages/SystemSettings.tsx b/src/pages/SystemSettings.tsx index 38c2a6e..b510cde 100644 --- a/src/pages/SystemSettings.tsx +++ b/src/pages/SystemSettings.tsx @@ -429,7 +429,7 @@ export default function SystemSettings() {

- 讯飞语音配置 + 讯飞语音听写Websocket接口配置