From 692ddab386d9ece4e146b41b1ec8c348e7ba3fc0 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sun, 31 Aug 2025 12:47:06 +0800 Subject: [PATCH] 'commit' --- dsLightRag/Routes/XueBanRoute.py | 89 ------------------ .../__pycache__/XueBanRoute.cpython-310.pyc | Bin 8802 -> 6820 bytes 2 files changed, 89 deletions(-) diff --git a/dsLightRag/Routes/XueBanRoute.py b/dsLightRag/Routes/XueBanRoute.py index 0ef0f98a..fc027b66 100644 --- a/dsLightRag/Routes/XueBanRoute.py +++ b/dsLightRag/Routes/XueBanRoute.py @@ -18,95 +18,6 @@ router = APIRouter(prefix="/api", tags=["学伴"]) # 配置日志 logger = logging.getLogger(__name__) -# 保留原有的HTTP接口,用于向后兼容 -@router.post("/xueban/upload-audio") -async def upload_audio(file: UploadFile = File(...)): - """ - 上传音频文件并进行ASR处理 - 原有接口,用于向后兼容 - - 参数: file - 音频文件 - - 返回: JSON包含识别结果 - """ - try: - # 记录日志 - logger.info(f"接收到音频文件: {file.filename}") - - # 保存临时文件 - timestamp = datetime.now().strftime("%Y%m%d%H%M%S") - file_ext = os.path.splitext(file.filename)[1] - temp_file_name = f"temp_audio_{timestamp}{file_ext}" - temp_file_path = os.path.join(tempfile.gettempdir(), temp_file_name) - - with open(temp_file_path, "wb") as f: - content = await file.read() - f.write(content) - - logger.info(f"音频文件已保存至临时目录: {temp_file_path}") - - # 调用ASR服务进行处理 - asr_result = await process_asr(temp_file_path) - - # 删除临时文件 - os.remove(temp_file_path) - logger.info(f"临时文件已删除: {temp_file_path}") - - # 使用大模型生成反馈 - logger.info(f"使用大模型生成反馈,输入文本: {asr_result['text']}") - response_generator = get_xueban_response_async(asr_result['text'], stream=False) - feedback_text = "" - async for chunk in response_generator: - feedback_text += chunk - logger.info(f"大模型反馈生成完成: {feedback_text}") - - # 使用流式TTS生成语音 - import io - audio_chunks = [] - - # 定义音频回调函数,收集音频块 - def audio_callback(audio_chunk): - audio_chunks.append(audio_chunk) - - # 获取LLM流式输出并断句 - text_stream = stream_and_split_text(asr_result['text']) - - # 初始化TTS处理器 - tts = StreamingVolcanoTTS(max_concurrency=2) - - # 流式处理文本并生成音频 - await tts.synthesize_stream(text_stream, audio_callback) - - # 合并所有音频块 - if audio_chunks: - tts_temp_file = os.path.join(tempfile.gettempdir(), f"tts_{timestamp}.mp3") - with open(tts_temp_file, "wb") as f: - for chunk in audio_chunks: - f.write(chunk) - logger.info(f"TTS语音合成成功,文件保存至: {tts_temp_file}") - else: - raise Exception("TTS语音合成失败,未生成音频数据") - - # 上传TTS音频文件到OBS - tts_audio_url = upload_file_to_obs(tts_temp_file) - os.remove(tts_temp_file) # 删除临时TTS文件 - logger.info(f"TTS文件已上传至OBS: {tts_audio_url}") - - # 返回结果,包含ASR文本和TTS音频URL - return JSONResponse(content={ - "success": True, - "message": "音频处理和语音反馈生成成功", - "data": { - "asr_text": asr_result['text'], - "feedback_text": feedback_text, - "audio_url": tts_audio_url - } - }) - - except Exception as e: - logger.error(f"音频处理失败: {str(e)}") - return JSONResponse(content={ - "success": False, - "message": f"音频处理失败: {str(e)}" - }, status_code=500) - # 新增WebSocket接口,用于流式处理 @router.websocket("/xueban/streaming-chat") async def streaming_chat(websocket: WebSocket): diff --git a/dsLightRag/Routes/__pycache__/XueBanRoute.cpython-310.pyc b/dsLightRag/Routes/__pycache__/XueBanRoute.cpython-310.pyc index b319f121f0485963b327a6d0a52d297b436e3e63..2125f9d3fd835369f3659c665b11f4dac874f642 100644 GIT binary patch delta 1621 zcmZWpO>7%Q6!!T4H$P77I6sb^wk9#8MWRV7K`DsP5Pv1zkhH4&cmM{e(?C_tzYinuLf1v+wL$GbC?iji^=8T#^m*M zWv${=Xl1!_xw2YIdCch;rcW)`kY5bXMOARC?iVD<=H;KmwJ3yOT~DrMPv=z96x`rU z__kLK@)1bN3%%RfF>+Z&ZMW58T!pQ6(^VmxwN+BEHZ|(o9uq2Yq1#{`&vM%wYgHlP z@x5Rz)z8~l_uHF_usy4 zpc?^R1+ekqN%_s_eBm*H=PFTyj@dODZoA=g&f1M_8OpsxM&!lZr{mMOy9A)poHdwr zjTsvPDjks|KXq2uo6u)Ls|vN4$IIvvM3+$8-BNL=vFTY3Q$bg#aL4r4<*)JLYP4<& zc4k3^-3|~E+2WSRRHA-nfwG2689#<$j$@cqhr12vk^vN}C})m)jj1T>TEY_?^`@d` z2ZB(!n_s+wEU7RxJ(K6~F@d>-XF44#7tyELeOyqV_=n~hJ`P{Ch|2?s1icS73Eb`}YM-2EC*7XB&bZ@W)nx<-mzm9tn zecfOft;vRMv9^a=hT{7I?H^dnqOXkv23Z35M9xjjlBM1o6Sqk86k7B0x5>LZx({LB zx2TFBE*vQ;E;=^!uIs6Y?QVh2Q+~&GO={qA_@RI@OK!VqwNCYK{B4ZBhMSN z|Bj8xR{2FevcFh{23_K&DE8o;+W`%upt8 zmQIkT`n)?4p(sJe(G4VMB zJp_j>j`4N0VrXsws3ACW$88IS{kEqBYg;12=$W%<>~ zcVMl0T*dGs1#0a#_IY%;DvL8;y{l`(q2enDs06-%fO^sN!BD$!7z}hINncrDQ}J_- rOMRQ2$Ip$x>4*p71g|tH2h)If4UvIxG87LDk-$zilAVsvj*@=>_5;Nv delta 3561 zcmZWsU2qh~5uVxI`~T7DkaYS(I@u`r9DWjhmJ8dl2zg1WlDFg~Ra?nJ65S!?B`>Z#qzXv)u8&4m05C)Gb2Ot!(Jw9>O{t`%h`^NrFz z%KWmcPhd4HaLhJJqpfnNw35|MQ5KZlpkKl2j!B?zWA$=7Ymmcz5(}}$V^Xw(HJO@r z&@{6a&^!ivTUaaXT`4O4~c{qFq*v)YB*V3)wj?}v2OivUha)&*5`An zY@Dr)=UFnl&XD?&DLFyWeDN2AH{Na(9z_)h`2n4vN4zR2QARa#Shz?o2~(63RV+zU zq-0|-D^S&b*imxgI>aP4k%GV^jb0=g+KYvvXd1XwcgZtFG;vBONUB$pm~B)zQ&+HQ zq~x0-&l6_fO$v6+R`P3hJmdgqBqEVfk&=w_t3=s71X}!e2p%&ihbAqBRHFfai(VY6 zy%f+SGgMN9=$%!DcpI1IVD2Wew7J%rGY|8Q3kAqo!KFDjkR$GmW>^PE!L7M8_fw?c zdac-H9q!j$5B5V|?WthF(@)+aCkSLaz-o^<3tn{v_$|UgqqN{t>sXMj7^ell<}cN2 zKFvENSn*OaM)<$0QDSunAgjNGXw?8(H6~iYf^CfKB(FLk9K^|uH+=0+UqI?_)kqah zs2a4I2hnCEwSk33=~1eNv>FI4V8T^n!3F3vYJmr~Y9ni6%@#U4Eg94HI-^3nhhGN{+O_Sxu}>ZPsc>;Q}UGiUgc^s+FvLQea`$F)kb+cE~2P7izy> z+q3u{qC+I|SpEW%F$}-CPfpIwmKHA0EWCTR^5YY8pWQ5fdUO8v#rdgI+k0LrPanH8 zaXh>>Tt0odGWk~J^p*0NpZ#a{)SYwh&Hd(ddE#vO$%)hDH)qS&J~h38;hCeA^EbM~ zNPpN@?O5L%YA#+sULO0^ozL{jJCo*)dh!X6}=ZDsSJsbMadF*7@!* zoK+;m(kt^zVP!gxb^&R z_41onU}t6W*WF=5QsrUwxvSK$D=L@cX@lfff{&%$*1km_*G_?_?(nM|Z}CuHK!pg; z3V0Mhh%r(k8bQ7=;6Q|8yRpY}IXS~%WnKqhRHB|eX`7YaxJe^VC(*a47ji zq9`kh;Yfpw_sfO^O*{@@H~&Eiz=6z1Q67CI%h>0gJ`0Dv$ink7)EVW&2w>ez@UBB zrQL`(mz8`d>_1c!;It((LH=UPQC)d5P?*NTY+{E z>m5;Lg>SyE`Cc5GI3k2*CT8>xJhF>p=jBasW`}pv+8&(jNAWU> zgD4K6czEmYQ5DsXde^u)HZ0x&LjQwz2i>Q;eD8KGN9pBqLQcLe#||smjCmEqom7$; zAYCSbrI$>ohBPRTD13+h4_{sJ6?BJ%!Z)DUh+-28_(PEJr%-$i#TF2Ty*IANU7L6} zYMw@otG8PUav-?_sC>j_-_7K)uH zox=*RkF!U zKRAHG(bF}5rF}EI0vjo9&_`;+-+2iZ z_9`*UiOi!evnS>AFDDt_h0E@2?_oKi#(+L%W5yBE^Q1>Ojo;U&$7#i%l=I90k9TRfYpUPrx@TYi2cZeW2-guOLkf zDVK%tv9DQ8qYp=B8O3mfys(&v-Yhada=i2Dbe82)@-u)OQP$`q&Fz6k>O2^rq!_dX K+nlTG=>GvlnJyOq