From 0b4e6c52858e1430a785ece3536ad284d5f5698c Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Fri, 5 Sep 2025 20:38:40 +0800 Subject: [PATCH] 'commit' --- dsLightRag/Config/Config.py | 8 ++- .../Config/__pycache__/Config.cpython-310.pyc | Bin 2515 -> 2646 bytes dsLightRag/Routes/XunFeiRoute.py | 20 ++++---- .../__pycache__/XunFeiRoute.cpython-310.pyc | Bin 3875 -> 3894 bytes .../static/XunFei/audio_evaluation.html | 48 ++++++++++++++---- 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/dsLightRag/Config/Config.py b/dsLightRag/Config/Config.py index ffd61e81..0f4331df 100644 --- a/dsLightRag/Config/Config.py +++ b/dsLightRag/Config/Config.py @@ -93,4 +93,10 @@ HS_VOICE_TYPE_QINCANG = "BV701_V2_streaming" # 中年男声,用于朗读古 #LibLib的配置 LIBLIB_URL="https://openapi.liblibai.cloud" LIBLIB_ACCESSKEY="sOCtVLVTNOZkRMajlhzCmg" -LIBLIB_SECRETKEY="PUe8QTRG9i0G9EbpedHmIpLQ0FyxoYY9" \ No newline at end of file +LIBLIB_SECRETKEY="PUe8QTRG9i0G9EbpedHmIpLQ0FyxoYY9" + + +# 科大讯飞 +XF_APPID="5b83f8d6" +XF_APISECRET="604fa6cb9c5ab664a0d153fe0ccc6802" +XF_APIKEY="5beb887923204000bfcb402046bb05a6" \ No newline at end of file diff --git a/dsLightRag/Config/__pycache__/Config.cpython-310.pyc b/dsLightRag/Config/__pycache__/Config.cpython-310.pyc index fe88a799783a61352082cad6d5c36bca3912cbf2..7d0935e43d40e89fc248a68b3fc58a8c86ee69fc 100644 GIT binary patch delta 254 zcmcaCd`*NmpO=@50SIQ?+?DZeBCjmtr-|Cn1)@w+OruOw%%aRv%!3&;EjEiWdN48G z+8ob(ijncwWG&Vkfl(Z$NfyRw7C=P`W(Fo{iDt=3mdU1xNoHmyi3TZ#rp9Th2Fc0E zW)=oUQ3|F>sYwz*;pdFL7Ikp8v zart;U0a1KtkWZ8Vl>3>G?HUOe33hc3at#5Aa74JpI|c-Jx*J(fn{ delta 123 zcmca6a#@%+pO=@50SK5nwq>ME1HKH4<^Q_&DqSS7#X7`o3Y+t z_R}=k9M7f-6rJ44u}$|Dmyf3t5XFZE`P>qKvK^hBU4w(YT_fQl!LH6ht|61VIsF-n MCg0{PX5wH30Fdn@Jpcdz diff --git a/dsLightRag/Routes/XunFeiRoute.py b/dsLightRag/Routes/XunFeiRoute.py index e914d1d0..d0dba01c 100644 --- a/dsLightRag/Routes/XunFeiRoute.py +++ b/dsLightRag/Routes/XunFeiRoute.py @@ -2,12 +2,12 @@ import logging import os import uuid import time -from fastapi import APIRouter, HTTPException, BackgroundTasks, Query, UploadFile, File +from fastapi import APIRouter, HTTPException, BackgroundTasks, Query, UploadFile, File, Form from pydantic import BaseModel from typing import Optional import tempfile from Util.ObsUtil import ObsUploader -from Config.Config import OBS_BUCKET, OBS_SERVER +from Config.Config import OBS_BUCKET, OBS_SERVER, XF_APPID, XF_APISECRET, XF_APIKEY from fastapi.responses import StreamingResponse import requests @@ -36,19 +36,19 @@ class AudioEvaluationResponse(BaseModel): # 科大讯飞API配置(需要根据实际情况配置) XUNFEI_CONFIG = { - "appid": "your_appid_here", - "api_key": "your_api_key_here", - "api_secret": "your_api_secret_here" + "appid": XF_APPID, + "api_key": XF_APISECRET, + "api_secret": XF_APIKEY } @router.post("/evaluate-audio", response_model=AudioEvaluationResponse) async def evaluate_audio( background_tasks: BackgroundTasks, - language: str = Query("chinese", description="评测语言: chinese 或 english"), - text: str = Query(..., description="评测文本内容"), - group: str = Query("adult", description="群体类型: adult, youth, pupil"), - check_type: str = Query("common", description="检错严格程度: easy, common, hard"), - grade: str = Query("middle", description="学段: junior, middle, senior"), + language: str = Form("chinese", description="评测语言: chinese 或 english"), + text: str = Form(..., description="评测文本内容"), + group: str = Form("adult", description="群体类型: adult, youth, pupil"), + check_type: str = Form("common", description="检错严格程度: easy, common, hard"), + grade: str = Form("middle", description="学段: junior, middle, senior"), audio_file: UploadFile = File(...)): """ 语音评测接口 - 支持中文和英文篇章朗读判分 diff --git a/dsLightRag/Routes/__pycache__/XunFeiRoute.cpython-310.pyc b/dsLightRag/Routes/__pycache__/XunFeiRoute.cpython-310.pyc index c09079bdfa9c078f5267912622a9c8227e6bf3d5..c352f0b95b0142c41c80e30825b48029d352e759 100644 GIT binary patch delta 1263 zcmZuv&2Jk;6yLFT*K4oWcAWSljz8k~BVI>JA~lzm&{8#NT1ug5iUcEsWin&4u$#5U z>r|WK^DPhiCv3Gq*K-Z*W8#IEKyzxR9d-preMKU9CN zTE1l^6!E?I^ViQGKCvq3(UXOLEmsd1;)M9Jv{s5q`~`@v=B8 zHQk-{=J1@C!#OXH^IicLydo}2U(B8NO1N|$yMPx&tl^fu3a%i9Do?Al_6*@gs*yNJ z437~pA4hO~Mw>(o-3>gyvcuz zUO_qjZ**SG34wnVDe)!sr{fxU7Xj)3O8^Z38vv4pDslD$)&;5!T)!W%74S{-zGf|8 zZ2_?DI4K~Z7|1{w@y{XYv7@2ZAB`Lm#`+_t_a!|F`8V1c%JUc6E}G{ly^9w3Wql1* zxT9ar6(D61Kvp&_>g*Ri9T6eF8=r`fX1v#4g%xW6>jG?*{a0Wc;L7vo@oTp(y;ynjVJs2bUYRrmqF|R$ZP5H^~Ag88*znyo!CTK{#)XmS-8Pa zolHcP8sG+N^PJg6SNWz{u3ds0|63P0HuyuccIj=%5T}QIchV1hCbz`W?gfrVU4A#&LCgFwdDeY>wlL<268gjGavM!cdGmHHzGtoGABZjOZWwd@;m|o4 zvTZoc4*%9#|CAYU9Ak7u`Uiot&*EU}!O;lT$!5C-O7g?NaaTY1Yz#9qL9%Z62Lorg zI-MA_1hW8A0BL{>pGg(a47XEj$5|nS@gWV~6NjLT$CLe!c{2F9@vDMlS*v z;FHss(3gQ6NbSyBY~eR;ng331@%N-%iUjGstpj80-uBl!-;Mdf&i?(K{WCLimt4$? z@F42>EXW#$IT*OU>09o=GYnP~E|x-=Lzoxvo5X6!Yy55W%0f<14DwU~X-OqXG9~T; zVL5(1_V?ZbhAtwM5h@5(gk=QG9K^ut`mBXC-m_iPXDjHdeGGLp8~j1MbiE;{o;`L) z%rJ*T3yed`sGge$mhnA39!rG}l1ICY`k~5yjBk-?{%8Cyncj>WeSWoOe} zN7k?%WuK#V@n1)f@J8J(^*oWWiQ*DM*r^uZNPngLC$8|*^fi*-g31)vB-X`NxYWTJg>U>}86u%XAyA>pCx8Ju0eRdQ5 z+x#bO^HGo-9)mgXtu9LnHIV(|A%=u=coh}(o^RQmy+KQqRiZpFBBYZhSSDwpd1^z l;!hHe@Ex?HVlTrw&h@2+W}UyzRFoP~#hnyuioeV3{sRjQAo>6R diff --git a/dsLightRag/static/XunFei/audio_evaluation.html b/dsLightRag/static/XunFei/audio_evaluation.html index eb9ea657..9ddd7510 100644 --- a/dsLightRag/static/XunFei/audio_evaluation.html +++ b/dsLightRag/static/XunFei/audio_evaluation.html @@ -104,7 +104,6 @@
-
准备就绪
@@ -125,7 +124,7 @@ const textInput = document.getElementById('text'); const recordBtn = document.getElementById('recordBtn'); const stopBtn = document.getElementById('stopBtn'); - const evaluateBtn = document.getElementById('evaluateBtn'); + // 删除提交按钮引用 const statusDiv = document.getElementById('status'); const resultDiv = document.getElementById('result'); const resultContent = document.getElementById('resultContent'); @@ -150,6 +149,24 @@ statusDiv.textContent = '正在获取麦克风权限...'; statusDiv.className = 'status'; + // ==== 插入WebSocket认证代码 ==== + const wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const wsUrl = `${wsProtocol}//${window.location.host}/ws/audio-evaluation?token=${getAuthToken()}`; + const ws = new WebSocket(wsUrl); + + // WebSocket事件处理 + ws.onopen = () => { + console.log('WebSocket连接已建立'); + statusDiv.textContent = 'WebSocket连接已建立,准备录音...'; + }; + + ws.onerror = (error) => { + console.error('WebSocket错误:', error); + statusDiv.textContent = 'WebSocket连接失败,请刷新页面重试'; + statusDiv.className = 'status error'; + }; + // ==== 插入结束 ==== + // 使用更明确的提示并添加详细的错误处理 const stream = await navigator.mediaDevices.getUserMedia({ audio: true }) .catch(err => { @@ -174,8 +191,10 @@ mediaRecorder.onstop = () => { audioBlob = new Blob(audioChunks, { type: 'audio/webm' }); - statusDiv.textContent = '录音完成,可以提交评测'; - evaluateBtn.disabled = false; + statusDiv.textContent = '录音完成,正在自动提交评测...'; + // 添加WebSocket关闭逻辑 + if (ws) ws.close(1000, '录音已完成'); + submitEvaluation(); }; // 添加录音最大时长限制(60秒) @@ -218,8 +237,8 @@ } }); - // 提交评测 - evaluateBtn.addEventListener('click', async () => { + // 将提交评测逻辑提取为独立函数 + async function submitEvaluation() { if (!audioBlob) { statusDiv.textContent = '请先完成录音'; statusDiv.className = 'status error'; @@ -235,7 +254,6 @@ try { statusDiv.textContent = '正在提交评测...'; statusDiv.className = 'status'; - evaluateBtn.disabled = true; const formData = new FormData(); formData.append('audio_file', audioBlob, 'recording.webm'); @@ -268,10 +286,8 @@ console.error('评测失败:', error); statusDiv.textContent = '评测失败: ' + error.message; statusDiv.className = 'status error'; - } finally { - evaluateBtn.disabled = false; } - }); + } // 显示评测结果 function displayResults(results) { @@ -313,6 +329,16 @@ resultContent.innerHTML = html; } + // 在 - \ No newline at end of file +