From 888f5ed0e40d9ca5a761e25fd51a10bcef969c2c Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Fri, 21 Mar 2025 20:17:45 +0800 Subject: [PATCH] 'commit' --- AI/WxMini/CallAi.py | 5 +- AI/WxMini/GetToken.py | 27 ++++--- AI/WxMini/OssUtil.py | 22 ++++++ AI/WxMini/RedisUtil.py | 65 +++++++++++++++++ AI/WxMini/Start.py | 68 ++++++++++++++++++ AI/WxMini/TtsConfig.py | 18 +++++ .../__pycache__/GetToken.cpython-310.pyc | Bin 955 -> 1238 bytes AI/WxMini/__pycache__/OssUtil.cpython-310.pyc | Bin 0 -> 834 bytes AI/WxMini/__pycache__/TTS.cpython-310.pyc | Bin 0 -> 1913 bytes .../__pycache__/TtsConfig.cpython-310.pyc | Bin 0 -> 495 bytes .../9eeb73db-e0af-44f6-8e9d-d25f896ec841.mp3 | Bin 0 -> 12240 bytes .../f3062647-9282-408e-a7b9-3145b9d84dd6.mp3 | Bin 0 -> 16704 bytes AI/WxMini/tests/test_tts.mp3 | Bin 17424 -> 0 bytes AI/WxMini/tts.py | 31 ++++---- 14 files changed, 205 insertions(+), 31 deletions(-) create mode 100644 AI/WxMini/OssUtil.py create mode 100644 AI/WxMini/RedisUtil.py create mode 100644 AI/WxMini/Start.py create mode 100644 AI/WxMini/TtsConfig.py create mode 100644 AI/WxMini/__pycache__/OssUtil.cpython-310.pyc create mode 100644 AI/WxMini/__pycache__/TTS.cpython-310.pyc create mode 100644 AI/WxMini/__pycache__/TtsConfig.cpython-310.pyc create mode 100644 AI/WxMini/audio/9eeb73db-e0af-44f6-8e9d-d25f896ec841.mp3 create mode 100644 AI/WxMini/audio/f3062647-9282-408e-a7b9-3145b9d84dd6.mp3 delete mode 100644 AI/WxMini/tests/test_tts.mp3 diff --git a/AI/WxMini/CallAi.py b/AI/WxMini/CallAi.py index 8af855ae..f14e88d8 100644 --- a/AI/WxMini/CallAi.py +++ b/AI/WxMini/CallAi.py @@ -1,9 +1,6 @@ from openai import OpenAI +from TtsConfig import * -# 阿里云中用来调用 deepseek v3 的密钥 -MODEL_API_KEY = "sk-01d13a39e09844038322108ecdbd1bbc" -MODEL_NAME = "qwen-plus" -#MODEL_NAME = "deepseek-v3" # 初始化 OpenAI 客户端 client = OpenAI( diff --git a/AI/WxMini/GetToken.py b/AI/WxMini/GetToken.py index 9b7c1697..32f96bf0 100644 --- a/AI/WxMini/GetToken.py +++ b/AI/WxMini/GetToken.py @@ -1,20 +1,19 @@ #! /usr/bin/env python # coding=utf-8 import json +from datetime import datetime from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest - -from Config import * +from TtsConfig import * def getToken(): # 创建AcsClient实例 client = AcsClient( - 'LTAI5t5jxkgJtRK8wew8fnbq', 'b8HXNGz7IkI3Dhv7BZx9BNBEZy1uku', - "cn-shanghai" + ACCESS_KEY_ID, ACCESS_KEY_SECRET, "cn-shanghai" ) - # 创建request,并设置参数。 + # 创建request,并设置参数 request = CommonRequest() request.set_method('POST') request.set_domain('nls-meta.cn-shanghai.aliyuncs.com') @@ -23,17 +22,23 @@ def getToken(): try: response = client.do_action_with_exception(request) - #print(response) - jss = json.loads(response) if 'Token' in jss and 'Id' in jss['Token']: token = jss['Token']['Id'] - #expireTime = jss['Token']['ExpireTime'] - #print("token = " + token) + expireTime = jss['Token']['ExpireTime'] + # 转换为本地时间 + expire_date = datetime.fromtimestamp(expireTime) + # 格式化输出 + formatted_date = expire_date.strftime("%Y-%m-%d %H:%M:%S") + print("过期时间:", formatted_date) + # 计算时间差(秒数) + now = datetime.now() + time_diff = (expire_date - now).total_seconds() + print("距离过期还有(秒):", time_diff) return token - #print("expireTime = " + str(expireTime)) except Exception as e: print(e) + if __name__ == '__main__': - print(getToken()) \ No newline at end of file + print(getToken()) diff --git a/AI/WxMini/OssUtil.py b/AI/WxMini/OssUtil.py new file mode 100644 index 00000000..9c7b6ad4 --- /dev/null +++ b/AI/WxMini/OssUtil.py @@ -0,0 +1,22 @@ +import oss2 +from TtsConfig import * + +# 初始化 OSS Bucket +auth = oss2.Auth(ACCESS_KEY_ID, ACCESS_KEY_SECRET) +bucket = oss2.Bucket(auth, ENDPOINT, BUCKET_NAME) + + +# 上传 MP3 文件到 OSS +def upload_mp3_to_oss(file_path, oss_object_name): + """ + 上传 MP3 文件到 OSS + :param file_path: 本地 MP3 文件路径 + :param oss_object_name: OSS 中存储的文件名 + """ + try: + # 上传文件 + with open(file_path, 'rb') as file: + bucket.put_object(oss_object_name, file) + print(f"文件 {file_path} 已成功上传到 OSS,存储为 {oss_object_name}") + except Exception as e: + print(f"上传失败: {e}") \ No newline at end of file diff --git a/AI/WxMini/RedisUtil.py b/AI/WxMini/RedisUtil.py new file mode 100644 index 00000000..62a5bc4d --- /dev/null +++ b/AI/WxMini/RedisUtil.py @@ -0,0 +1,65 @@ +import redis +from AlyConfig import * + +# 初始化 Redis 连接池 +pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, password=REDIS_PASSWORD) + +def set_tts_token(token, expire_time=750): + """ + 设置 TTS Token 到 Redis,并设置过期时间 + :param token: TTS Token 字符串 + :param expire_time: 过期时间(秒),默认 750 秒 + """ + try: + # 从连接池获取 Redis 连接 + r = redis.Redis(connection_pool=pool) + # 设置键值对,并设置过期时间 + r.set('tts_token', token, ex=expire_time) + print(f"TTS Token 已成功设置,过期时间为 {expire_time} 秒") + except Exception as e: + print(f"设置 TTS Token 失败: {e}") + + +def get_tts_token(): + """ + 从 Redis 获取 TTS Token + :return: TTS Token 字符串(如果不存在,返回 None) + """ + try: + # 从连接池获取 Redis 连接 + r = redis.Redis(connection_pool=pool) + # 获取 TTS Token + token = r.get('tts_token') + if token: + return token.decode('utf-8') # 将 bytes 转换为字符串 + else: + print("TTS Token 不存在或已过期") + return None + except Exception as e: + print(f"获取 TTS Token 失败: {e}") + return None + + +def close_redis_connection(): + """ + 显式关闭 Redis 连接池 + """ + try: + pool.disconnect() + print("Redis 连接池已关闭") + except Exception as e: + print(f"关闭 Redis 连接池失败: {e}") + + +if __name__ == '__main__': + # 示例:设置 TTS Token + tts_token = "your_tts_token_here" # 替换为你的 TTS Token + set_tts_token(tts_token) + + # 示例:获取 TTS Token + retrieved_token = get_tts_token() + if retrieved_token: + print("获取到的 TTS Token:", retrieved_token) + + # 显式关闭 Redis 连接池 + close_redis_connection() \ No newline at end of file diff --git a/AI/WxMini/Start.py b/AI/WxMini/Start.py new file mode 100644 index 00000000..f902013c --- /dev/null +++ b/AI/WxMini/Start.py @@ -0,0 +1,68 @@ +import os +import uuid + +from fastapi import FastAPI, Form, HTTPException +from openai import OpenAI +from TtsConfig import * +from WxMini.OssUtil import upload_mp3_to_oss +from WxMini.TTS import TTS + +# 初始化 FastAPI 应用 +app = FastAPI() + +# 初始化 OpenAI 客户端 +client = OpenAI( + api_key=MODEL_API_KEY, + base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", +) + + +@app.post("/reply") +async def reply(prompt: str = Form(...)): + """ + 接收用户输入的 prompt,调用大模型并返回结果 + :param prompt: 用户输入的 prompt + :return: 大模型的回复 + """ + try: + # 调用大模型 + response = client.chat.completions.create( + model=MODEL_NAME, + messages=[ + {"role": "system", "content": "你是一个非常好的聊天伙伴,可以疏导用户,帮他解压,一句控制在20字以内。"}, + {"role": "user", "content": prompt} + ], + max_tokens=500 + ) + + # 提取生成的回复 + if response.choices and response.choices[0].message.content: + result = response.choices[0].message.content.strip() + # 调用tts进行生成mp3 + # 生成一个uuid的文件名 + uuid_str = str(uuid.uuid4()) + tts_file = "audio/" + uuid_str + ".mp3" + t = TTS(tts_file) + t.start(result) + # 文件上传到oss + upload_mp3_to_oss(tts_file, tts_file) + # 删除临时文件 + try: + os.remove(tts_file) + print(f"临时文件 {tts_file} 已删除") + except Exception as e: + print(f"删除临时文件失败: {e}") + # 完整的url + url = 'https://ylt.oss-cn-hangzhou.aliyuncs.com/' + tts_file + return {"success": True, "url": url} + else: + raise HTTPException(status_code=500, detail="大模型未返回有效结果") + except Exception as e: + raise HTTPException(status_code=500, detail=f"调用大模型失败: {str(e)}") + + +# 运行 FastAPI 应用 +if __name__ == "__main__": + import uvicorn + + uvicorn.run(app, host="0.0.0.0", port=5500) diff --git a/AI/WxMini/TtsConfig.py b/AI/WxMini/TtsConfig.py new file mode 100644 index 00000000..bd57b404 --- /dev/null +++ b/AI/WxMini/TtsConfig.py @@ -0,0 +1,18 @@ +# 驿来特账号的AK,SK +ACCESS_KEY_ID = 'LTAI5t5jxkgJtRK8wew8fnbq' +ACCESS_KEY_SECRET = 'b8HXNGz7IkI3Dhv7BZx9BNBEZy1uku' + +ENDPOINT = 'https://oss-cn-hangzhou.aliyuncs.com' +BUCKET_NAME = 'ylt' + + +# Redis 配置 +REDIS_HOST = '10.10.14.14' # Redis 服务器地址 +REDIS_PORT = 18890 # Redis 端口 +REDIS_DB = 0 # Redis 数据库编号 +REDIS_PASSWORD = None # Redis 密码(如果没有密码,设置为 None) + +# 阿里云中用来调用 deepseek v3 的密钥 +MODEL_API_KEY = "sk-01d13a39e09844038322108ecdbd1bbc" +MODEL_NAME = "qwen-plus" +#MODEL_NAME = "deepseek-v3" \ No newline at end of file diff --git a/AI/WxMini/__pycache__/GetToken.cpython-310.pyc b/AI/WxMini/__pycache__/GetToken.cpython-310.pyc index 35337dd4bc36206970cce77df7280bd312cb7458..62caaaf71fb91676d010a4d88d4e473bb83af042 100644 GIT binary patch delta 854 zcmY+B%}*0S6u@U@yPxe=K}As#;Lw;JAewk;h|$!lXhcIB4IAU8GF#Hv-EC$ELEIIR zYLp}H0S_33Thyf<$))Sr6RH%$YOd;bQX^Db1S7B>TSt)=Dxr1;wT}bqU`>a*u*MhhsnMQi z&oPP&C??Ibp&>f(08K&vBIAWY5%i)%b9fHrGZXO_Y%L~6X}(!!P6ax$(36`Q$+;sr zI+VLv$lWRA%CjakWq0fK_S%Q-)$e<&-wLw>Li6MO&c}_ees}BL_S*9P=9`^QZ}&Hs z3;A9qflFduEf!1VvVFTWWshG=dj1j1rQ&3%!cqvuC&;7gjCA~K%y-4d1ib1t6D{DZ zCd5Q;vbx6;$@AwDll#2dumfk>_h^vlrTJ;6$?LwCPsgvw`74&;96iTMci9#{Ze?pe zbE}*?v?H_Akkisd0-M%rwFEn#5gUxZlCgW2z(k0GQwNG{;O-P%vvsjA9rE?GA$tck)JSh5Jtv+)U;Z>my loAn9*!T+}*5u%N`KAmkimoZ3zxK^akz|x=)Z8!_X{ssQM-}e9j delta 613 zcmY+A&ubGw6vyYy%+Bs6X;6r^!6HZxHU~wK+K8oKV$rk`e>51~%bI4k$(qfiPBzUC zcC8Tqfv^{k=~29R6#PFt1pEWUe?hFXX%RY)_ugk_zVqhI{4l@k>CVDJ0;zF#^=D&; zPSVRSx7Caz4j!`Nj6G;$3q#DrBW-HYIa5!oAg*!t5n0U9x!%HZ#W5T9a z0FEKVzCJYqtcY+UAcsia=VqWdixh935;wC5hcueNr6Y4#1r%zkNYYOPTHI|Fy;koF zwf7oFs_!}Vp^tKjvbFT2@}RWlue}|#8r%MhoqXTv=l8|lJL~FR{_(5wqtSY)Rl4)A zdAMG%2KNf(!j?6>-D~wm$-21FZPrAiS#xLf+0)(1=$i1N-%vDjNr}}5ND_U)Z!$A; zYfyI%e77TJ+JSV1pJUN;a$TQ+^BKv-=o{IvR+S!O3K-~L#u9L97^_S&kOD?hf70wS z7$5M7%qsEBuWFjp=+`(u1!L6!+y|- zxS?Yx?n%T=+(1FW;S_O0hkwWgpKRuQ^4*tt(w0#?;hvmx&v(xE9k@;^l|W$GJ3p#B z1fic%(rqFnH{keJ!5PTFHKavM2yx65%^p+Q612D>7<3tF2?MJr zBmRb7RLEeCFI0f!*eFC1eIAbg5ZuCfh8jS!M4qM>3B#MDfg5CtU^EVt6j8J!U}Q^| zkbi0xV-$T8aF}2S4YZC7+Q94RC0&AA)S*HLqx1b3EkfTy8gODm00e0xCIGW2+!G>X zJDSC_C=&}JF$o#0xwqQf-;{?(ugC|_9yPyx30HRH5mjv!vu@cd*X1dzX6kO4O=snU zjrZZkP8a-e_e1!7xf|{HzV1xkH7iWF%XKpwO#_}6u5M)?ifMMypADjiItFq JlR_FN=|6AM`!@gp literal 0 HcmV?d00001 diff --git a/AI/WxMini/__pycache__/TTS.cpython-310.pyc b/AI/WxMini/__pycache__/TTS.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8a9ba14496cac819aa4a12c29230c52c6a338e3 GIT binary patch literal 1913 zcmZWp>u(fQ6rVeUt# zYL}=+^-+oHRoOIHnx^_>zl|DZh8Z+nC1wL_m}z90bA*83j(B7cEASgp-lyM6YsIz?jGA|wTsSBzgys~1+UaLz}pVKZnnI&dG7~>1HHxE z7W2SRsht+k-Gh$|$~G8$3kW752_QhIJSv$ARj3NHngBO7nxY2iI!)6I%qiN?A!Qqd zlFxS((9zn1Ys}QUF!%-#fz(Szq+W153A3e)pj4>@Qlk<$k&&Vv*nT$)vbsnIJwCIk z<8})@A1{S!`Ted?te{6|R+m#`LbkfHvQRlIcKK-tGAsFwF#Yw?ds{mx-{<*#ogaaR zU7p+Bx&8gleS^Cl*XabTt>qzMSQco3Wi`VQ4yBe_h)yzOxDhw386RP#!p4}@R#?O= zq=59wFq9b;7;5JTCT~(EQlO(wm8uLZQ?NE>(&r?oE%H@!c_3`CL5ByH*C*tG{n-o< z3)o;FWRDA@WcM-Z_*|%E8#t$6?b;<4GZm^=X0DH|>Kh=0#vyeh{7=+=uR=n#O^ovQ?0fhQ*lJqs>|B{Yvgd;|R$6_Q636c>KUlzcDSp28K zd=Jfl?*uHXtY(DTkf3M5{xGBzL`CECU|U7hf`}S0F{`#mQj>zsaTm100((1<10{&- z55RQja_uuRLVDw>QyH((q_SFhEtl1V((f0A7I=NkHFdjO?qfs#3yAJH5N2x7vAzAw z5lX522DG?#&~pk*r0g!wFWEshEfn|%m`~)2yraxmp{HZW4SE=NhM6yvkN55pTK>bG zJ90wbzGu(Q9iQHJ9e08M7zA0XlM)0Em&r$ZFT&t0AXFm9uS!&+|NUfY*oZF(T*h41 zz-xqEX;~s;StXD57jfNaSqJ*}h9!ZKT>=I}JWvX}w|?BFSZiEx{A5T5F*GA( zsEw+R7K~T29oMq@v(T@#n=|2sn|GIvgvTz2V^>kVU5%<=)UHp$_h{^Rcxx=0_&K^V zey4IMoSLsKUI>p*)aS>+6nzhBrFLViJ~s;oqtR*b5MDeKT{*veZF>3Ix8bo9cbBH4 zGvm>T-@?ktXkucydNKNZsXqTpcz7W?d!e>;3eJM7+Tvw6UcWRBL2K75wT06VE;=z& zpIZp0jxT>RU0e7vi3Lz$|4Q{HoDI+XSigO8rX2-9e1K^}Y3edH(_*;szR(qKE(EDgg>D$}xhy)23~y*@wBDeZ+>Z@I|gYMGb)#VXmASxEa~ zeh1Cns;EvRv0wLqb@J0h=no5utm+j_d!j@nc_9xYai|OiqO8al7m}z%Aqj{S1Yy;_ z-$Yq&y(%e-+f{WPyRJXNUwzYn=TEGQbq9MOV9S`=rsctj_E{fc&$rYGhK_>`)Aes` z*ZZ%hw!_vBb3=n?2Q^h)cV;`rzB{oEJoeS8S--aL9Bh5r5A?vZ{Ezha%($KtI?Er@ z`KKg{$9WddRdYVuPLeE{dj-|=>^6z}>)l>>dzX`P6}_uJjGi*$Id&Qh{G;OdrojCJ DskwrT literal 0 HcmV?d00001 diff --git a/AI/WxMini/audio/9eeb73db-e0af-44f6-8e9d-d25f896ec841.mp3 b/AI/WxMini/audio/9eeb73db-e0af-44f6-8e9d-d25f896ec841.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..88fd6ffbee62909dd2a141b489b2f8bbc138ba9d GIT binary patch literal 12240 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 literal 0 HcmV?d00001 diff --git a/AI/WxMini/audio/f3062647-9282-408e-a7b9-3145b9d84dd6.mp3 b/AI/WxMini/audio/f3062647-9282-408e-a7b9-3145b9d84dd6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..491861ca83fe98ca045890b060e3f48e9da6425b GIT binary patch literal 16704 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 diff --git a/AI/WxMini/tts.py b/AI/WxMini/tts.py index 03602845..3450d794 100644 --- a/AI/WxMini/tts.py +++ b/AI/WxMini/tts.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -import threading import nls import os from GetToken import * @@ -9,10 +8,8 @@ TOKEN = getToken() # 参考https://help.aliyun.com/document_detail/450255.html APPKEY = "90RJcqjlN4ZqymGd" # 获取Appkey请前往控制台:https://nls-portal.console.aliyun.com/applist - class TTS: - def __init__(self, _file): - self._th = threading.Thread(target=self._run) + def __init__(self, _file): self._file = _file self._f = None @@ -21,17 +18,8 @@ class TTS: # 确保目录存在 os.makedirs(os.path.dirname(self._file), exist_ok=True) self._f = open(self._file, "wb") - self._th.start() - - def on_close(self, *args): - if self._f: - self._f.close() - - def on_data(self, data, *args): - if self._f: - self._f.write(data) - def _run(self): + # 初始化 TTS tts = nls.NlsSpeechSynthesizer( url=URL, token=TOKEN, @@ -39,10 +27,21 @@ class TTS: on_data=self.on_data, on_close=self.on_close ) + + # 同步执行 TTS 生成 tts.start(self._text, voice="xiaobei", aformat="mp3") + def on_close(self, *args): + if self._f: + self._f.close() + print("TTS 生成完成,文件已关闭") + + def on_data(self, data, *args): + if self._f: + self._f.write(data) + if __name__ == '__main__': - TEXT = '大壮正想去摘取花瓣,谁知阿丽和阿强突然内讧' + TEXT = '你好,听到你心情不好我很抱歉。可以告诉我是什么让你感到如此糟糕吗?有时候把烦恼说出来会让我们感觉好一些。无论发生了什么,我都会在这里认真倾听,和你一起面对。记住,每个困难都会过去,明天总是新的开始。' t = TTS("tests/test_tts.mp3") - t.start(TEXT) + t.start(TEXT) \ No newline at end of file