From 1f72404b8926126383d78f525d5fb61b3acbbd08 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Tue, 25 Mar 2025 10:03:22 +0800 Subject: [PATCH] 'commit' --- AI/WxMini/Start.py | 5 +++-- AI/WxMini/Utils/MySQLUtil.py | 6 +++--- AI/WxMini/Utils/TtsUtil.py | 15 ++++++++++++--- .../__pycache__/MySQLUtil.cpython-310.pyc | Bin 1685 -> 1708 bytes .../Utils/__pycache__/TtsUtil.cpython-310.pyc | Bin 2000 -> 2289 bytes AI/WxMini/__pycache__/Start.cpython-310.pyc | Bin 5037 -> 5108 bytes 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/AI/WxMini/Start.py b/AI/WxMini/Start.py index 22e1769d..cb78bc81 100644 --- a/AI/WxMini/Start.py +++ b/AI/WxMini/Start.py @@ -149,7 +149,8 @@ async def reply(session_id: str = Form(...), prompt: str = Form(...)): # 生成 TTS 音频数据(不落盘) t = TTS(None) # 传入 None 表示不保存到本地文件 - audio_data = await asyncio.to_thread(t.generate_audio, result) # 假设 TTS 类有一个 generate_audio 方法返回音频数据 + audio_data, duration = await asyncio.to_thread(t.generate_audio, result) # 假设 TTS 类有一个 generate_audio 方法返回音频数据 + print(f"音频时长: {duration} 秒") # 将音频数据直接上传到 OSS await asyncio.to_thread(upload_mp3_to_oss_from_memory, tts_file, audio_data) @@ -159,7 +160,7 @@ async def reply(session_id: str = Form(...), prompt: str = Form(...)): url = 'https://ylt.oss-cn-hangzhou.aliyuncs.com/' + tts_file # 记录聊天数据到 MySQL - await save_chat_to_mysql(app.state.mysql_pool, session_id, prompt, result,url) + await save_chat_to_mysql(app.state.mysql_pool, session_id, prompt, result,url,duration) logger.info("用户输入和大模型反馈已记录到 MySQL 数据库。") return { diff --git a/AI/WxMini/Utils/MySQLUtil.py b/AI/WxMini/Utils/MySQLUtil.py index 157ecc71..a8b0028b 100644 --- a/AI/WxMini/Utils/MySQLUtil.py +++ b/AI/WxMini/Utils/MySQLUtil.py @@ -25,12 +25,12 @@ async def init_mysql_pool(): # 保存聊天记录到 MySQL -async def save_chat_to_mysql(mysql_pool, session_id, prompt, result,audio_url): +async def save_chat_to_mysql(mysql_pool, session_id, prompt, result,audio_url,duration): async with mysql_pool.acquire() as conn: async with conn.cursor() as cur: await cur.execute( - "INSERT INTO t_chat_log (session_id, user_input, model_response,audio_url, create_time) VALUES (%s, %s, %s, %s, NOW())", - (session_id, prompt, result,audio_url) + "INSERT INTO t_chat_log (session_id, user_input, model_response,audio_url,duration,create_time) VALUES (%s, %s, %s, %s, %s,NOW())", + (session_id, prompt, result,audio_url,duration) ) await conn.commit() logger.info("用户输入和大模型反馈已记录到 MySQL 数据库。") diff --git a/AI/WxMini/Utils/TtsUtil.py b/AI/WxMini/Utils/TtsUtil.py index 9624a0c6..b766e59f 100644 --- a/AI/WxMini/Utils/TtsUtil.py +++ b/AI/WxMini/Utils/TtsUtil.py @@ -1,7 +1,8 @@ -# -*- coding: utf-8 -*- import nls from WxMini.Utils.TokenUtil import * from WxMini.Milvus.Config.MulvusConfig import * +from pydub import AudioSegment +import io URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1" @@ -34,7 +35,9 @@ class TTS: def generate_audio(self, text): """ - 生成 TTS 并返回音频数据(不保存到文件) + 生成 TTS 并返回音频数据和时长 + :param text: 要生成音频的文本 + :return: 音频数据(bytes)和时长(秒) """ self._text = text self._audio_data = bytearray() # 重置音频数据 @@ -50,7 +53,13 @@ class TTS: # 同步执行 TTS 生成 tts.start(self._text, voice="xiaobei", aformat="mp3") - return bytes(self._audio_data) # 返回生成的音频数据 + audio_bytes = bytes(self._audio_data) # 获取生成的音频数据 + + # 计算音频时长 + audio = AudioSegment.from_file(io.BytesIO(audio_bytes), format="mp3") + duration = len(audio) / 1000 # 转换为秒 + + return audio_bytes, duration # 返回音频数据和时长 def on_close(self, *args): """ diff --git a/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc b/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc index 8ec19b77074e0ea04363706ed0c957a5a11a6bc6..98649a68a8938539718fd4ffe0a56bda89044ce7 100644 GIT binary patch delta 331 zcmbQryM~uHpO=@50SMOeJxV{ck@q@dA{&Sc1sp&cBz+i&i?;xYM#dV31q=%rOc*>F zQW!iKX1Ua|)vzsKL=sW0Wv^jhz?8yR!&t*q!(78s!Uvm+l5BiBDZ79K{eUwZ$G6gI1}h%mCr0o__8KiQtuo>6gfJ*yhyt;x$+ z{X=eX`9=l@`ow$q2gBI`{y}hdXs~P0Ek1~v0LS3qaQ`5eTf7jyi&MOxqpxcbKgei7 O5TO7f6eoMK`2YaYW>LNX delta 287 zcmZ3(JC&C=pO=@50SFYCAEhtd$a|eJo)yG}0(Kw`l0FQ?#hZXcBV!H20)~YQCJdeo zDGVMAvz%*LYgiXBB8jNfvemFHU`k=EVXR@QVXk3GV_C=qQO(Fu!#dfO$(Ye*awU_t zSWr15BLfIV0&xmMFoPzuUsdVkT}+;g3X^%5RVSM;S2MCt-oR`!`5m(Z9~UFnKRy;7 zMy+3Z|BK`|+pvf*vdIG7R3tY!jMW~fWg4p*W7Oomtp27^T)vUPfj;pb{=p$Ic7T5n koE;kM8WhC`Q4`=8931W+Z6yUQcBf|N)=k6LLrx$I+GAdcEjuhEu<7_ z!4@o-u2m4FzEA`aq2Q??{s-c54jvSf<{-s`Coj%yODc7S`SH#7ns0vJ_c{Kn-F9QK z2vDoT{+6GM)a)c2s2xdO0Msm+C6qxBP(Wc3XD~$>auHBW$qb-m+Q@_`90BQ2Q-=?w zp@dxuqGv0#;Eu3-i8-QH_-zqoeFJ!#pM!lcvit(}z^K+qa+KnOUupYwZ@~F`hz?5$8R^iITID`^rqGw>WlB|^Y7MH zX2&N4^VU}8TKSc(@p?gNTA@4+z%jr()E{`Kh8+qNt0d?0QdSgJO?7SOyR^yD5caR3 zom2a?*y1oCMdIK&t^$Az=eS!M%N2@D8UG`uj1X|eYw35*X z*Os)!lm2L^|4IgzCun6n;GZ8>7OwdSeEun?l~!7PC6`u;tRE^j&sJao3tCX|r1(o1 Fe*xDz=kWjl delta 629 zcmew;c!8fUpO=@50SL5zJWSW%oX97`s5entMu|C!*_|PUC55$xA%(S>DT*b9F_=M< z?IlR5pC;oiMy-jxUpZKTyp;?^T$8&PZ5TN>A7?aSH z5(0^`7MCOzm8@hb;+!1FEG7c7w+KvdgIMxFf^Tv)vjrauki`zf&Olu3G5H{~CmYam z)>5y@7A!g*@Aq^(+0pxC|JOZ=O%1G1-Dp}bMlK*Z?P5>W#*M=G8J)x z1X&V`(u>jT0Ed$K{|XjAT^+{Em8#$pok~}`x@atL>w>!WkI1+4ARBHz{SYH$|1@j!oyVr vlF?)>lAfH*VP{<=3*>=?kZgyWa*M+zH$SB`C)JJ-WE4o8gAoK-n1q-BW@LRy diff --git a/AI/WxMini/__pycache__/Start.cpython-310.pyc b/AI/WxMini/__pycache__/Start.cpython-310.pyc index 5f4411abb7ea139e0d53d2d238bdb083fde864a1..fbbaaf2eb2f5e19243ed37e623f812c9c0eb9221 100644 GIT binary patch delta 543 zcmY+B&1(}u7{=dscav=5?q;)_&!*DFkLIIkwSpcLJ$TZq3cU!Wbb@w~jczB1WtN~h zh+rT(ij^ANc=6;x0>z6|5d0&8Cl6}w(wpdP)Pn=h!#mIX=6zx2P31?$Xz6+i#JX>M zxwbU-*7&8A3u3DYeH7Y!CZ8BSKgBol2XnH?Y%mKI(e!~%;RAxS~mG!d%Ic8@Y+C|v}SyZ~3FARFZ9JgKpq zpz8yY$lU(ko6XhrmghCs z=|;<|6*x)1ON~|1_Sd3-&zcVI^0VfHq88K8LRBuJiCNhc)vTOCN#>u;61GSC<~a%5 P{G@#=(NQrkDL;P$^`(xO delta 528 zcmY*VOKTHR6h7z9WHKptCiBWPX+ewD=F#*4uIs{;ZdK^Agx;VXYNC@X!Fb1Lvl1Ez z%(50IdtH=q;nD~ABML7353YRQNfGLW@4MeUeD^zt^R4=(YIY4{4&?dxY^{7RN|9Fk1GJrae{*riE&!XjnO_7MljEoDiD-|$^^s1__OwY7+eZ23lJ#Gk$MwY z;RYaZNRX{eQL1HrC0Uum2qT+Uxt3@%U1U{Z9|5b0qU8EH{6{O4M`9v3PP#5Nu zoaIGcR^tuf2yd$V*P|hZ&Ji4wtQA`o&OAgV))Xa?7r8PBldZi}w_zJNNmj+obsM

hB5YeZ!k5>O&cpvJU>1+Lt z8V`-@_CRYrVtd_-QgAjn|A@@dx7`Hq(abq8DcC4&96@87)YPw~Echuprf` z6Snu;tzLU)x7+EocllnoQ}^Rn#dmSbTEe&Sf%Rgutjr-*C_1Ps9(sx;Z$b!aNKpSt h4f@?e4}H|1k>4~I_R=l;8o^#H+=uxmI{HNY^%q}kgZlsg