2024 年最新 Python 使用 gewe 框架搭建微信机器人实现语音智能回复(详细教程)

Gewe 个微框架

GeWe(个微框架)是一个创新性的软件开发框架,专注于IPAD协议,为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程,使开发者能够高效、灵活地构建和定制通信协议,以满足不同应用场景的需求。

灵活可扩展:GeWe框架采用灵活可扩展的设计理念,为开发者提供了丰富的选项和配置,确保协议能够适应不同的应用场景和需求。
高效数据传输:通过优化传输算法和数据压缩机制,GeWe框架构建的IPAD协议能够更快地传输数据,提高用户体验并节省带宽资源。
安全性与隐私保护:GeWe框架重视安全性和隐私保护,提供了一系列的加密和身份验证机制,确保数据在传输过程中得到保护,防止未经授权的访问。
丰富的功能模块:GeWe框架提供了丰富的功能模块,包括消息处理、好友管理、群组操作等,使个人微信号具备更多功能和扩展性。
友好的开发接口:GeWe框架提供简洁友好的开发接口,使得开发者能够轻松地扩展个人微信号的功能,如开发自动回复机器人、定时任务等。

GeWe框架是一个功能强大、灵活可扩展的软件开发框架,为个人和企业提供了丰富的功能和保障。通过利用GeWe框架,开发者可以高效地构建和定制通信协议,满足不同的应用需求。同时,GeWe框架也重视安全性和隐私保护,确保数据在传输过程中的安全性。

官方文档网站:http://doc.geweapi.com/

在这里插入图片描述

注意:Gewe 详细接口调用请自行测试

登陆微信 Pad 协议

注册登陆 gewe 后台:http://manager.geweapi.com/#/login?redirect=%2Faccount%2Findex

在这里插入图片描述

登陆微信 Pad 协议:http://manager.geweapi.com/#/account/wechat

在这里插入图片描述

项目结构预览

基于百度智能云、Gewe Pad 端、本地电脑端内网穿透实现。

详细流程图预览
在这里插入图片描述
源码结构

在这里插入图片描述

源码结构说明

.env               		环境变量设置
audio_api	  			百度智能云合成语音 / 识别语音
bot.py             		监听 gewe 消息回调(主函数)
download_msg.py 	    请求 gewe 下载语音消息
ffmpeg.exe 				音频处理工具
mp3_to_silk				mp3格式 -> silk格式
send_msg				请求 gewe 发送语音消息
silk_to_pcm				silk格式 -> pcm格式
silk_v3_decoder.exe     silk 解码操作
silk_v3_encoder.exe     silk 编码操作
util.py 			    工具类

配置环境变量

.env 环境变量配置

APP_ID=百度云语音合成、识别 APP_ID
API_KEY=百度云语音合成、识别 API_KEY
SECRET_KEY=百度云语音合成、识别 SECRET_KEY
QIANFAN_API_KEY=百度云千帆大模型 API_KEY
QIANFAN_SECRET_KEY=百度云千帆大模型 SECRET_KEY
X_GEWE_TOKEN=GEWE Token
GEWE_APP_ID=GEWE 设备号

百度智能云千帆大模型

百度智能云使用参考博客:https://wrist.blog.csdn.net/article/details/134628415

一站式企业级大模型平台,提供先进的生成式AI生产及应用全流程开发工具链。直接调用ERNIE-Bot 4.0及其他主流大模型,并提供可视化开发工具链,支持数据闭环管理、专属大模型定制、大模型训练调优、插件编排等功能。

在这里插入图片描述

千帆大模型链接地址:https://cloud.baidu.com/product/wenxinworkshop

chat_api.py

import json
import osimport requestsAPI_KEY = os.getenv("QIANFAN_API_KEY")
SECRET_KEY = os.getenv("QIANFAN_SECRET_KEY")payload = {"user_id": "python","messages": [],"system": "每次回答不允许换行,并且不超过50个字。","disable_search": False,"enable_citation": False
}def get_access_token():  # 这里是获取token一般不用管"""使用 AK,SK 生成鉴权签名(Access Token):return: access_token,或是None(如果错误)"""url = "https://aip.baidubce.com/oauth/2.0/token"params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}return str(requests.post(url, params=params).json().get("access_token"))def chat_answer(text):url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + get_access_token()headers = {'Content-Type': 'application/json'}payload["messages"] = [{"role": "user","content": text}]json_payload = json.dumps(payload)# 发送请求response = requests.request("POST", url, headers=headers, data=json_payload)result = response.json().get("result")  # 提取并打印AI的回复return result

ffmpeg 下载安装

FFmpeg是一套开源的计算机程序,用于处理数字音频、视频,以及将其转化为流。它以其强大的音视频处理能力、广泛的格式支持和跨平台特性,成为了多媒体处理领域的重要工具。

ffmpeg 基本功能

音视频编解码:FFmpeg支持各种音频和视频编解码器,包括常见的H.264、H.265、AAC、MP3等,使其能够处理各种媒体格式。
格式转换:可以将不同格式的音频和视频文件相互转换,例如将MP4转换为AVI、将WAV转换为MP3等。
流媒体处理:支持从网络摄像头、文件、或其他来源捕获音视频流,也能将处理后的流推送到服务器或其他设备。
图像处理:支持图像处理,如提取视频帧,合成图片和视频等。
剪辑和编辑:可以对音视频进行剪辑和编辑,包括裁剪、剪切、拼接等操作。
字幕处理:支持字幕的添加、移除和编辑,可以将字幕嵌入到视频中或者从视频中提取字幕。
音频处理:提供了丰富的音频处理功能,包括音频的剪辑、混音、音量调节等。
实时视频处理:能够处理实时的音视频流,适用于直播、视频会议等场景。

下载安装 FFmpeg

在这里插入图片描述

下载地址:https://github.com/BtbN/FFmpeg-Builds/releases

ffmpeg 工具 bin 目录

在这里插入图片描述

配置 ffmpeg/bin 系统环境变量

在这里插入图片描述

silk 编译器下载安装

Windows 用户可以直接使用提供的 silk_v3_decoder.exe 和 silk_v3_encoder.exe 工具进行转换。对于 macOS 和 Linux 用户,需要下载项目代码并运行 converter.sh 脚本进行转换。转换过程需要依赖 gcc 和 ffmpeg 库。

下载地址:https://github.com/kn007/silk-v3-decoder

在这里插入图片描述
silk_v3_encoder.exe 和 silk_v3_decoder.exe

silk_v3_encoder.exe

功能:用于将音频编码为Silk v3格式。可能用于需要将音频数据转换为Silk v3编码以进行存储、传输或与其他使用此编码格式的系统进行交互的场景。作为Silk-V3-Decoder项目的一部分,silk_v3_encoder.exe(如果存在并可用)可能支持多种操作系统,但具体兼容性信息在参考文章中未明确提及。

silk_v3_decoder.exe

功能:解码 Silk v3 音频文件,如微信amr、aud文件和QQ slk文件。将这些文件转换为其他音频格式,如mp3。支持批量转换。

高性能:针对Silk v3编码进行了优化,提供快速的解码速度。
跨平台支持:适用于多种操作系统,包括Windows、macOS和Linux。但图形界面可能仅限于Windows版本。
简单易用:提供了清晰简洁的接口和API,降低了学习和使用的门槛。
开源与持续维护:该项目遵循MIT许可证,并在GitCode或其他代码托管平台上进行托管,接受社区贡献和反馈。

微信 silk 音频处理

mp3_to_silk.py 实现将 mp3 文件转换成 silk 文件

import math
import subprocess
import time
from pydub import AudioSegmentdef get_mp3_duration(mp3_file):# 使用 pydub 读取 mp3 并获取时长audio = AudioSegment.from_mp3(mp3_file)duration_seconds = len(audio) / 1000.0return duration_secondsdef convert_mp3_to_pcm(mp3_file, pcm_file):# 使用 ffmpeg 将 mp3 转换为 pcmcommand = f"ffmpeg -y -i {mp3_file} -f s16le -ar 24000 -ac 1 -acodec pcm_s16le {pcm_file}"try:subprocess.run(command, shell=True, check=True)print(f"Converted {mp3_file} to {pcm_file}")except subprocess.CalledProcessError as e:print(f"Failed to convert {mp3_file} to {pcm_file}: {e}")def convert_pcm_to_silk(pcm_file, silk_file):# 使用 silk_v3_encoder.exe 将 PCM 转换为 SILKcommand = f"silk_v3_encoder.exe {pcm_file} {silk_file} -tencent"result = subprocess.run(command, shell=True)if result.returncode == 0:print(f"Converted {pcm_file} to {silk_file}")else:print(f"Failed to convert {pcm_file} to {silk_file}: {result.stderr}")def transfrom_silk(file_name):# 获取 mp3 文件时长duration = get_mp3_duration(f"mp3/{file_name}.mp3")print(f"Duration of {file_name}.mp3: {duration} seconds")# 记录开始时间start_time = time.time()# 转换流程convert_mp3_to_pcm(f"mp3/{file_name}.mp3", f"./pcm/{file_name}.pcm")convert_pcm_to_silk(f"./pcm/{file_name}.pcm", f"./silk/{file_name}.silk")# 记录结束时间end_time = time.time()# 计算并打印转换所花的总时间total_time = end_time - start_timeprint(f"Total time taken for conversion: {total_time} seconds")return {"fileName": file_name, "voiceDuration": math.ceil(duration) * 1000}

silk_to_pcm.py 实现将 silk 文件转换成 mp3 文件

import subprocessdef convert_silk_to_pcm(silk_file, pcm_file):# 使用 silk_v3_decoder.exe 将 silk 转换为 pcmcommand = f"silk_v3_decoder.exe {silk_file} {pcm_file}"try:subprocess.run(command, shell=True, check=True)print(f"Converted {silk_file} to {pcm_file}")except subprocess.CalledProcessError as e:print(f"Failed to convert {silk_file} to {pcm_file}: {e}")def transfrom_pcm(file_name):# 转换流程convert_silk_to_pcm(f"silk/{file_name}.silk", f"pcm/{file_name}.pcm")

保存语音消息

保存语音消息 download_msg.py

import json
import osimport dotenv
dotenv.load_dotenv(".env")
import requestsheaders = {'X-GEWE-TOKEN': os.getenv("X_GEWE_TOKEN"),'User-Agent': 'Apifox/1.0.0 (https://apifox.com)','Content-Type': 'application/json'
}def download_audio_msg(msgId: int, xml: str):data = {"appId": os.getenv("GEWE_APP_ID"),"msgId": msgId,"xml": xml}print(json.dumps(data))response = requests.post("http://api.geweapi.com/gewe/v2/api/message/downloadVoice", json=data, headers=headers)if response.ok:data = response.json()if data['ret'] == 200:print("Gewe download audio msg successfully.")print(data['data']['fileUrl'])return data['data']['fileUrl']else:print("Gewe download audio msg in error.")return Falseelse:return Falsedef download_image_msg(xml: str):data = {"appId": "wx_HtqjtTglwIKjQHSsSUYDi","type": 2,"xml": xml}print(json.dumps(data))response = requests.post("http://api.geweapi.com/gewe/v2/api/message/downloadImage", json=data, headers=headers)if response.ok:data = response.json()if data['ret'] == 200:print("Gewe download audio msg successfully.")print(data['data']['fileUrl'])return data['data']['fileUrl']else:print("Gewe download audio msg in error.")return Falseelse:return Falsedef download_audio_file(fileUrl: str, file_name: str):# 定义保存文件的本地路径和文件名local_filename = f'./silk/{file_name}.silk'# 使用requests库的get方法获取文件内容response = requests.get(fileUrl, stream=True)# 检查请求是否成功if response.status_code == 200:# 打开文件以二进制写入模式with open(local_filename, 'wb') as f:# 逐块写入文件,通常使用1024字节的块大小for chunk in response.iter_content(1024):f.write(chunk)print(f"文件已成功下载到 {local_filename}")else:print(f"请求失败,状态码: {response.status_code}")

百度云语音合成、识别

百度云语音合成、识别参考博客:https://wrist.blog.csdn.net/article/details/139551206

百度智能云语音识别:采用国际领先的流式端到端语音语言一体化建模算法,将语音快速准确识别为文字,支持手机应用语音交互、语音内容分析、机器人对话等场景。百度短语音识别可以将 60 秒以下的音频识别为文字。适用于语音对话、语音控制、语音输入等场景。

在这里插入图片描述

百度云语音合成、识别 audio_api

import os
import timeimport requests
from aip import AipSpeech
import dotenvdotenv.load_dotenv(".env")APP_ID = os.getenv("APP_ID")
API_KEY = os.getenv("API_KEY")
SECRET_KEY = os.getenv("SECRET_KEY")client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)def create_audio(text: str, file_name: str):url = "https://tsn.baidu.com/text2audio"# pcm# payload = f'tex={text}&tok=' + get_access_token() + '&cuid=naAUL3Evzwj8A79l1kFHvRz1oUWZfOmo&ctp=1&lan=zh&spd=5&pit=5&vol=5&per=0&aue=4'# mp3payload = f'tex={text}&tok=' + get_access_token() + '&cuid=naAUL3Evzwj8A79l1kFHvRz1oUWZfOmo&ctp=1&lan=zh&spd=5&pit=5&vol=5&per=5003&aue=3'response = requests.get(url=f"{url}?{payload}", data=payload, stream=True)# 检查请求是否成功if response.status_code == 200:# 打开文件以二进制写入模式with open(f"mp3/{file_name}.mp3", 'wb') as file:# 分块读取并写入文件for chunk in response.iter_content(1024):if chunk:file.write(chunk)else:print(f"请求失败,状态码:{response.status_code}")def get_access_token():"""使用 AK,SK 生成鉴权签名(Access Token):return: access_token,或是None(如果错误)"""url = "https://aip.baidubce.com/oauth/2.0/token"params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}return str(requests.post(url, params=params).json().get("access_token"))# 读取文件
def get_file_content(file_name):"""read pcm file:param file_name::return:"""with open(f"./pcm/{file_name}.pcm", 'rb') as fp:return fp.read()def recognize_audio(file_name):"""recognize pcm by baidu speech-api:param file_name::return:"""# 识别本地文件time.sleep(1)result = client.asr(get_file_content(file_name), 'pcm', 16000, {'dev_pid': 1537,})return result['result'][0]

natapp 内网穿透

内网穿透(NAT穿透)是一种网络技术,主要用于实现内部网络(通常指局域网或私有网络)与外部网络(如互联网)之间的通信。内网穿透指的是通过一定技术手段,将内部网络中的计算机或服务暴露给公网,实现内网与公网之间的互通。它的核心目标是使原本只能在内网内部访问的资源能够被外部网络的用户所访问。

内网穿透原理

内网穿透技术通过将公网地址映射到内网中的某个计算机或服务的地址,实现了内外网之间的通信。在实现过程中,可能涉及NAT(网络地址转换)技术,该技术可以将私有(保留)地址转化为合法的IP地址。

UDP内网穿透技术是其中一种实现方式,它利用路由器上的NAT系统,使一个普通的内网节点在需要时将自己的服务器端口自动呈现在公网上,并且能够让系统内其他节点正确获取这个地址。

内网穿透实现方法

反向代理是内网穿透的一种常见实现方法。通过反向代理服务器,外部网络用户可以访问内部网络资源,而无需直接访问内部网络。端口映射(也称为端口转发)是另一种实现方式,它将外部网络的请求转发到内部网络的特定端口上。

内网穿透工具 natapp 官方地址:https://natapp.cn/

在这里插入图片描述

选择合适版本下载

在这里插入图片描述
购买隧道配置信息

在这里插入图片描述

本地创建 config.ini 配置文件

[default]
authtoken=			# 对应一条隧道的authtoken
clienttoken=                    # 对应客户端的clienttoken,将会忽略authtoken,若无请留空,
log=none                        # log 日志文件,可指定本地文件, none=不做记录,stdout=直接屏幕输出 ,默认为none
loglevel=ERROR                  # 日志等级 DEBUG, INFO, WARNING, ERROR 默认为 DEBUG
http_proxy=                     # 代理设置 如 http://10.123.10.10:3128 非代理上网用户请务必留空

本地 natapp.exe 和 config.ini 放在同目录
在这里插入图片描述
启动内网穿透

在这里插入图片描述

发送语音消息

消息模块发送语音消息必须要是 https 协议的文件,不能是本地 file 协议的文件,所以我们需要通过内网穿透,让我们的图片能够在公网访问,这样 gewe 才能进行发送。

发送语音消息 send_msg.py

import osimport requests
import dotenv
dotenv.load_dotenv(".env")headers = {'X-GEWE-TOKEN': os.getenv("X_GEWE_TOKEN"),'User-Agent': 'Apifox/1.0.0 (https://apifox.com)','Content-Type': 'application/json'
}def send_audio_msg(toWxid: str, voice_file: str, voiceDuration: int):data = {"appId": "wx_XqQOb78UPUFngK2ni2R9u","toWxid": toWxid,"voiceUrl": f"http://edgehacker.natapp1.cc/silk/{voice_file}.silk","voiceDuration": voiceDuration}response = requests.post("http://api.geweapi.com/gewe/v2/api/message/postVoice", json=data, headers=headers)if response.ok:data = response.json()if data['ret'] == 200:print("Gewe sends audio msg successfully.")return Trueelse:print("Gewe sends audio msg in error.")return Falseelse:return False

Gewe 配置回调监听

我们需要登录API后台系统, 点击“访问控制-填写回调地址” ,将您的消息接收地址设置成功,后续此Toekn下登录的所有微信机器人,收到消息都会自动转发到您设置的回调接口地址。

Gewe 配置回调监听:http://manager.geweapi.com/#/account/access

在这里插入图片描述
开发者需要提供的回调接口要求?

微信消息是POST application/json请求您设置的回调接口地址。(您可以直接打印请求body体,可详细看到所有消息参数)消息回调接口必须在3秒内响应,否则平台将放弃本次请求结果,回调接口可直接返回空字符串机器人通过接口发送的消息不会有回调,因为回调是接收消息,发送不属于接收,但是手机微信发送的消息也会有,因为这属于消息多端同步,IM的原理配置成功后,会接收一条包含文字“验证回调地址是否可用”的JSON回调注意:回调接口必须发布到公网,也就是第三方可以访问的(临时测试可用内网穿透一类的,但是网速不稳定可能丢消息),若是显示回调验证失败,您可以用Apifox访问您的回调接口验证是否可访问。

Flask 服务接收微信消息

工具类 util.py

from datetime import datetimedef generate_timestamp():# 获取当前时间now = datetime.now()# 格式化时间字符串为 'yyyyMMddHHmmssSS'timestamp = now.strftime('%Y%m%d%H%M%S%f')[:-4]return timestampdef at_extract_content(text):# 找到最后一个空格的索引last_space_index = text.rfind(" ")if last_space_index != -1:# 返回空格后面的内容return text[last_space_index + 1:]return ""def audio_extract_content(text):result = text.split('\n', 1)[1]return result

监听消息服务器 bot.py

import os
import time
from xml import etreefrom flask import Flask, send_from_directory, requestimport audio_api
import audio_to_text
import baidu_audio_to_text
import chat_api
import download_msg
import send_msg
import mp3_to_silk
import silk_to_pcm
import utilapp = Flask(__name__)@app.route('/silk/<filename>')
def serve_mp3(filename):# 指定 audios 目录的路径directory = 'silk'# 检查文件是否存在if not filename.endswith('.silk') or not os.path.isfile(os.path.join(directory, filename)):return 'File not found', 404# 使用 send_from_directory 发送文件return send_from_directory(directory, filename, as_attachment=False)@app.route('/messages', methods=['POST'])
def gewe_message():msg = request.get_json()PushContent = msg['Data']['PushContent']if PushContent.endswith("在群聊中发了一段语音"):FromUserName = msg['Data']['FromUserName']['string']file_name = util.generate_timestamp()MsgId = msg['Data']['MsgId']Content = util.audio_extract_content(msg['Data']['Content']['string'])fileUrl = download_msg.download_audio_msg(MsgId, Content)download_msg.download_audio_file(fileUrl, file_name)silk_to_pcm.transfrom_pcm(file_name)result = baidu_audio_to_text.recognize_audio(file_name)print(result)result = chat_api.chat_answer(result)print(result)audio_api.create_audio("nova", result, file_name)silk_data = mp3_to_silk.transfrom_silk(file_name)send_msg.send_audio_msg(FromUserName, file_name, silk_data['voiceDuration'])if PushContent.endswith("[语音]"):FromUserName = msg['Data']['FromUserName']['string']file_name = util.generate_timestamp()MsgId = msg['Data']['MsgId']Content = msg['Data']['Content']['string']fileUrl = download_msg.download_audio_msg(MsgId, Content)download_msg.download_audio_file(fileUrl, file_name)silk_to_pcm.transfrom_pcm(file_name)result = baidu_audio_to_text.recognize_audio(file_name)result = chat_api.chat_answer(result)audio_api.create_audio("nova", result, file_name)silk_data = mp3_to_silk.transfrom_silk(file_name)send_msg.send_audio_msg(FromUserName, file_name, silk_data['voiceDuration'])return "success"if __name__ == '__main__':app.run(debug=True, port=80)

程序运行演示

控制台执行运行

python bot.py

执行效果预览

发送语音泡自动智能回复消息!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity基础(五)地形详解

目录 一 创建地形 二 调整地形大小 三 创建相邻地形 四 创建山峰 五 创建树木 七 添加风 八 添加水 简介: Unity 中的基础地形是构建虚拟场景的重要元素之一。 它提供了一种直观且灵活的方式来创建各种地形地貌&#xff0c;如山脉、平原、山谷等。 通过 Unity 的地形…

力扣384. 打乱数组

Problem: 384. 打乱数组 文章目录 题目描述思路复杂度Code 题目描述 思路 打乱数组的主要算法&#xff1a; 从1 - n每次生成[i ~ n - i]的一个随机数字&#xff0c;再将原数组下标位置为i的元素和该随机数字位置的元素交换 复杂度 打乱数组的主要算法 时间复杂度: O ( n ) O(…

【Attack】拓扑缺陷图注入攻击

TDGIA: 图神经网络的有效注入攻击 图注入攻击下 GNN 的脆弱性TDGIA框架拓扑缺陷边选择平滑的对抗优化整体攻击流程 KDD’21 &#x1f604; 图注入攻击&#xff1a;攻击者无法修改输入图的现有link结构和节点属性&#xff0c;而是通过向其中注入对抗性节点来执行攻击。 图注入…

Linux操作系统学习路线

本文来自Qwen2大模型&#xff1a; Linux操作系统的全面学习是一个渐进的过程&#xff0c;涵盖从基础知识到高级特性的多个阶段。以下是一份详细的Linux操作系统学习路线图&#xff0c;包括各个阶段的学习目标、建议的学习资源和实践步骤。 1. Linux 基础知识与安装 学习目标&a…

vite构建的ts项目配置src别名@

一、安装types/node npm install types/node 二、vite.config.ts 文件中配置以下内容 resolve: {alias: {: path.resolve(__dirname, ./src),},}, 三、 tsconfig.json 文件中compilerOptions下配置以下内容 /* 配置 */"baseUrl": ".","paths":…

深度学习长文|使用 JAX 进行 AI 模型训练

引言 在人工智能模型的开发旅程中&#xff0c;选择正确的机器学习开发框架是一项至关重要的决策。历史上&#xff0c;众多库都曾竞相争夺“人工智能开发者首选框架”这一令人垂涎的称号。&#xff08;你是否还记得 Caffe 和 Theano&#xff1f;&#xff09;在过去的几年里&…

Python | Leetcode Python题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution:def maxPoints(self, points: List[List[int]]) -> int:n len(points)if n < 2:return nres 2for i in range(n):x1, y1 points[i][0], points[i][1]has {}for j in range(i 1, n):x2, y2 points[j][0], points…

随心笔记,第六更

目录 一、 三步构建 XML转成java bean 1.XML转XSD 2.XSD转JavaBean 3.jaxb 工具类 4.测试 &#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「Leen」。刚工作几年&#xff0c;想和大家一同进步&am…

ESP RainMaker®为企业提供AIoT云解决方案,启明云端乐鑫代理商

在AIoT的浪潮中&#xff0c;企业面临着前所未有的机遇与挑战。如何快速响应市场变化&#xff0c;开发出具有竞争力的智能产品&#xff1f;如何确保数据安全&#xff0c;同时实现高效的设备管理&#xff1f;这些问题&#xff0c;ESP RainMaker给出了答案。 ESP RainMaker是一个…

STM32程序启动过程

&#xff08;1&#xff09;首先对栈和堆的大小进行定义&#xff0c;并在代码区的起始处建立中断向量表&#xff0c;其第一个表项是栈顶地址&#xff08;32位&#xff09;&#xff0c;第二个表项是复位中断服务入口地址&#xff1b; &#xff08;2&#xff09;然后执行复位中断&…

了解TF-IDF:一种文本分析的强大工具

了解TF-IDF&#xff1a;一种文本分析的强大工具 在现代信息时代&#xff0c;海量的文本数据充斥着我们的生活。如何有效地从这些文本数据中提取有价值的信息成为了一个关键问题。TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;作为一种经典的文本分…

如何将NextJs中的File docx保存到Prisma ORM

背景/引言 在现代 Web 开发中&#xff0c;Next.js 是一个备受欢迎的 React 框架&#xff0c;它具有许多优点&#xff0c;如&#xff1a; 服务器端渲染 (SSR)&#xff1a;Next.js 支持服务器端渲染&#xff0c;可以提高页面加载速度&#xff0c;改善 SEO&#xff0c;并提供更好…

即插即用!CVD:第一个生成具有相机控制的多视图一致视频方案!(斯坦福港中文)

论文链接&#xff1a;https://arxiv.org/abs/2405.17414 项目链接&#xff1a;https://collaborativevideodiffusion.github.io/ 最近对视频生成的研究取得了巨大进展&#xff0c;使得可以从文本提示或图像生成高质量的视频。在视频生成过程中添加控制是未来的重要目标&#x…

笔记99:OSQP 求解器示例代码

注1&#xff1a;以下代码是 OSQP 的官方文档提供的示例&#xff0c;我加上了详细的注释&#xff1b; 注2&#xff1a;OSQP 库仅支持C语言&#xff0c;不支持C&#xff0c;所以下面的示例代码使用的是C语言&#xff1b;但是 OSQP 求解库提供了针对C的接口 OSQP-EIGEN&#xff1…

leetcode240 搜索二维矩阵II

题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18…

ASP淘特二手房房地产系统源码

源码介绍 ASP淘特二手房房地产系统源码主要提供了房屋信息出售、出租、求购、求租、合租等信息的发布平台。 本系统已提供成熟的赢利模式&#xff0c;通过向中介会员提供发布信息平台收取会员费为网站的主要收入来源&#xff0c;中介会员申请开通后&#xff0c;可以添加经济人…

Ubuntu 的 apt 相关问题

错误:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease Couldnt create temporary file /tmp/apt.conf.KSeTlI for passing config to apt-key 原因 无法创建配置文件 /tmp/apt.conf.KSeTlI 并传递给 apt-key apt-key 等实际上并不是直接使…

phpcms仿蚁乐购淘宝客网站模板

phpcms仿蚁乐购网站模板&#xff0c;淘宝客行业模板免费下载&#xff0c;该模板网站很容易吸引访客点击&#xff0c;提升ip流量和pv是非常有利的。本套模板采用现在非常流行的全屏自适应布局设计&#xff0c;且栏目列表以简洁&#xff0c;非常时尚大气。页面根据分辨率大小而自…

MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)

目录 前言1. 授予权限2. 撤销权限3. 查询权限4. Demo 前言 公司内部的数据库权限一般针对不同人员有不同的权限分配&#xff0c;而不都统一给一个root权限 1. 授予权限 授予用户权限的基本命令是GRANT 可以授予的权限种类很多&#xff0c;涵盖从数据库和表级别到列和存储过…

基于改进字典学习的旋转机械故障诊断方法(MATLAB)

在过去的二十年里&#xff0c;稀疏表示在各个领域引起了广泛的关注。它的核心思想是将信号描述为尽量少的字典原子&#xff0c;在计算机视觉、生物学、特征提取和机械故障诊断方面显示出强大而可靠的能力。SR通常分为两个步骤&#xff1a;构建字典和学习稀疏系数。对于稀疏系数…