前言 深度学习技术在当今技术市场上面尚有余力和开发空间的,主流落地领域主要有:视觉,听觉,AIGC这三大板块。
目前视觉板块的框架和主流技术在我上一篇基于Yolov7-LPRNet的动态车牌目标识别算法模型已有较为详细的解说。与AIGC相关联的,其实语音模块在近来市场上面活跃空间很大。
从智能手机的语音助手到智能家居中的语音控制系统,再到银行和电信行业的语音身份验证,语音技术的应用日益广泛。那么对应现在ACG技术是可以利用原音频去进行训练学习,从而得到相对应的声音特征,从而进行模仿,甚至可以利用人工智能生成的语音可以以假乱真,给社会带来了严重的安全隐患。
当前,语音深度鉴伪识别技术已经取得了一定的进展。研究人员利用机器学习和深度学习方法,通过分析语音信号的特征,开发出了一系列鉴伪算法。
然而,随着生成大模型和其他语音合成技术的不断进步,伪造语音的逼真度也在不断提高,使得语音鉴伪任务变得愈加复杂和具有挑战性。本项目系列文章将从最基础的语音数据存储和详细分析开始,由于本系列专栏是有详细解说过深度学习和机器学习内容的,音频数据处理和现主流技术语音分类模型和编码模型将会是本项目系列文章的主体内容,具体本项目系列要讲述的内容可参考下图:
语音模型的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容。
我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。希望有需求的小伙伴不要错过笔者精心打造的专栏。
上篇文章详细解答了所有音频常见存储载体和其特征,以及音频的数据保存形态有哪些?具体数据可视化展示为何种形式?这类问题,对音频数据认知打下了坚实的基础。那么第二章我们就应该对音频数据预处理有大致的了解,从噪音的种类再到各个去噪算法依次了解,那么我们的语音深度鉴伪识别才算入门。
一、音频存储载体 由于音频存储是根据音频数据编码来的,上篇文章已经几乎把所有的音频编码算法都讲解了,固不再重复将每个音频存储载体具体信息详细,只作概览:
综合比较 格式压缩类型音质文件大小主要应用优点缺点WAV无压缩高大音频编辑高质量文件大FLAC无损压缩高中音频存储高质量,文件较小文件仍较大ALAC无损压缩高中苹果设备高质量,兼容苹果跨平台支持少MP3有损压缩中小音乐存储、传输文件小,支持广泛音质低AAC有损压缩中高小流媒体、移动设备高效压缩,音质好普及度略低OGG Vorbis有损压缩中高小游戏音频、流媒体高质量,开源支持较少DSD无压缩极高极大高保真音频超高保真度文件极大,支持有限AIFF无压缩高大苹果设备高质量文件大Opus有损压缩高小流媒体、实时通信低延迟,高质量存储应用少 二、音频数据预处理 既然我们现在已经通过python去尝试了构建一个wav音频文件,自然我们也可以通过编码方式对原有音频进行数据处理,使其音频质量,如后续有建模的必要这会是关键步骤,一切模型都离不开数据质量。和图片去噪的方式也是大相径庭,那么现在我们来实践操作。首先,确保安装了pydub库和ffmpeg:
pip install pydub sudo apt-get install ffmpeg 如果需要更细粒度的控制,需要使用numpy和scipy生成纯音乐。
pip install numpy scipy soundfile 生成音乐片段:
import numpy as np import soundfile as sf def generate_sine_wave(frequency, duration, sample_rate=44100): """生成指定频率和持续时间的正弦波""" t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False) return 0.5 * np.sin(2 * np.pi * frequency * t) # 定义音符(频率)和节拍(秒) notes = { 'C4': 261.63, 'D4': 293.
环境描述:
操作系统:银河麒麟10(kylin-v10-sp3)
达梦数据库版本:dm8
1、命令行安装dm8 1、安装前的准备工作 详情请参考官方文档:达梦8安装前的环境准备详情
1、创建达梦数据库对应的用户和组
注意:安装前必须创建 dmdba 用户,禁止使用 root 用户安装数据库。
groupadd dinstall # 创建dinstall组 useradd -g dinstall dmdba # 创建dmdba用户 echo "DaMeng12345" |passwd --stdin dmdba # 为dmdba用户设置密码 2、创建达梦数据库安装目录
# dminstall是达梦数据库软件安装的位置,dmdata是达梦数据库实例存放位置,dmarch是达梦数据库归档日志存放位置,dabak是达梦数据库备份文件存放位置 mkdir -p /dm8/{dminstall,dmdata,dmarch,dabak} chown -R dmdba:dinstall /dm8 chmod -R 755 /dm8 3、调整系统资源限制
查看dmdba用户的系统资源情况:
su - dmdba ulimit -a 官方建议:
到root用户下配置资源限制,在/etc/security/limits.conf文件中追加下面的内容:
# soft软连接,hard硬连接,nofile打开文件,nproc打开的进程 dmdba soft nofile 65536 dmdba hard nofile 65536 dmdba soft nproc 65536 dmdba hard nproc 65536 配置完成之后,重启服务器生效:
一.创建数据库 用VS 创建数据库的步骤: 1.打开vs,创建一个新项目,分别在搜素框中选择C#、Windows、桌面,然后选择Windows窗体应用(.NET Framework)
2.打开“视图-服务器资源管理器”,右键单击“数据连接”,如图。在弹出的菜单中选择【创建新SQL Server 数据库】选项,弹出“创建新的SQL Server数据库”对话框。
3.对应项目,系统添加数据库连接。(要是电脑没有sql server,可以选中“视图-sql server资源管理器”创建数据库)
连接成功即如下(第一次可能只有一个)
4.新建数据库XSCJDB(学生成绩数据库),点开第二个小三角-右键点击数据库-添加新数据库
自己取名(最好采用英文命名)
5.选中该数据库并创建新表student,点击新建数据库前的小三角-右键表-添加新表
6.表中插入属性,双击即可打开
7.右键选中表查看表中数据
二.使用控件实现连接数据库并对其操作 (1)在工具箱中拖出dataGridView控件和botton控件(可以改名使其功能明确) (2)双击botton1,进入代码编写(检查数据库的连接) private void button1_Click(object sender, EventArgs e) { string strcom = @"Data Source = (localdb)\ProjectModels;Initial Catalog = XSCJDB; Integrated Security = True;"; SqlConnection sqlcon; using (sqlcon = new SqlConnection(strcom)) { sqlcon.Open(); MessageBox.Show("数据库连接状态" + sqlcon.State.ToString(), "第一个对话框"); } MessageBox.Show("数据库连接状态" + sqlcon.State.ToString(), "第二个对话框"); } 注意:
此处应根据自己的电脑修改,具体步骤如下:
单击刚建的数据库-在右下角解决方案资源管理器中找到连接字符串-复制第一个True前面的内容
(3)双击双击botton2,进入代码编写(插入数据) private void button2_Click(object sender, EventArgs e) { string strcom = @"
文字转语音神器+Python编程搞定语音报时小程序 今天一个好哥们发了一个文字转语音的AI神器的短视频。这个神器的网站是[ChatTTS - Text-to-Speech for Conversational Scenarios][https://chattts.com/],如下图所示:
这个开源项目可以从github.com上下载,也可以在这个网页下载。如下图所示:
在主页上大概体验了一下,文字转语音还可以,但是有些生字(镇赉县)还是不能正常识别,比方说这个”赉“字。还有就是阿拉伯数字也不能正常识别。但是可以通过程序转成汉字,然后就可以了。言归正传,这个开源项目给我的最好的体会就是免费,于是按照上图所示的步骤,下载了源码并安装了依赖库,强调一下,这个源码运行环境在Anaconda下可以,PyCharm我的电脑不能运行,报错。
我首先想到的是利用这个API编一个语音报时的小程序,之前我编了一个万年历,这回可以实现语音播报了。我首先实现一个简单的报时小程序。
下载之后的源码文件夹拷贝到你指定的目录下面,然后进入Anaconda的Jupyter-Notebook下,打开
上面说到了,阿拉伯数字是不能准确识别的。但是用datetime模块生成的时间或者日期都是阿拉伯数字,必须转成汉字才可以利用这个开源模块实现语音播报。
环境
操作系统:macOS Sonoma
开发环境:Anaconda+Python 3.11
源码如下:
import torch import ChatTTS from IPython.display import Audio import datetime chat = ChatTTS.Chat() chat.load_models() # 定义一个类 class PeriodDay: def __init__(self): self.now = datetime.datetime.now() def get_time_of_day(self): if self.now.hour < 12: return "上午" elif 12 <= self.now.hour < 18: return "下午" else: return "晚上" # 定义一个时间转成汉字的函数 def format_time_final(self): hour, minute = self.now.strftime('%H:%M').split(':') if int(minute) == 0: minute = '整' elif int(minute) < 10: minute = '零' + number_to_chinese(int(minute)) + '分' elif int(minute) < 20: minute = number_to_chinese(int(minute))[1:] + '分' else: minute = number_to_chinese(int(minute)) + '分' if 10 <= int(hour) < 20: hour = number_to_chinese(int(hour))[1:] + '时' return f'{hour} {minute}' else: return f'{number_to_chinese(int(hour))[:]}时 {minute}' def get_month_day(self): month = number_to_chinese(self.
目录
前言
一、物体检测
二、抓取点生成
三、运动规划
四、控制
五、总结
前言 机器人抓取检测(Robot Grasping Detection)是指通过计算机视觉和机器学习技术,自动识别并确定机器人如何抓取物体的一种技术。这个过程涉及多个步骤和关键技术,包括物体检测、抓取点生成、运动规划和控制。
一、物体检测 物体检测包括多个关键步骤:
图像获取:
设备选择:选择适合的传感器,如RGB相机、深度相机或激光雷达。RGB相机提供彩色图像,深度相机提供距离信息,激光雷达则提供高精度的点云数据。多视角获取:在复杂场景中,单一视角可能不足以完整看到目标物体,因此可以从多个视角获取图像,确保全面覆盖。 预处理:
图像增强:使用滤波器增强图像质量,例如高斯滤波器去噪、边缘检测增强图像细节。直方图均衡:调整图像对比度,使得图像中物体更加清晰。颜色空间转换:将图像从RGB空间转换到灰度或其他颜色空间,以便后续处理。 特征提取:
传统方法:使用SIFT、SURF等算法提取关键点和描述子。这些方法通过检测图像中的角点和边缘,生成对物体具有辨识度的特征。深度学习方法:使用预训练的卷积神经网络(CNN)模型,如ResNet、VGG,直接从图像中提取深度特征。这些特征包含了物体的高级语义信息。 物体分类和定位:
检测模型:使用YOLO、Faster R-CNN等深度学习模型进行物体检测。这些模型能够同时输出物体类别和在图像中的位置。训练数据:通过大量标注数据进行模型训练,确保模型能够识别多种物体类别,并在不同环境下具有鲁棒性。 多视图融合:
图像拼接:将来自不同视角的图像进行拼接,生成一个全景图像。点云融合:将不同视角的点云数据融合,生成完整的3D模型,提高检测精度。 二、抓取点生成 抓取点生成的方法多样,以下是对每种方法的详细介绍:
几何方法:
形状分析:通过分析物体的几何形状,找到平坦且适合抓取的区域。比如,通过计算物体表面的法向量,确定平坦区域。3D建模:使用CAD模型或3D扫描技术,创建物体的精确3D模型,便于分析和抓取点生成。 特征方法:
纹理分析:通过分析物体表面的纹理,找到适合抓取的特征点。这可以通过计算图像的梯度或纹理方向实现。边缘检测:使用边缘检测算法(如Canny算法)找到物体的边缘,选择稳定的边缘点作为抓取点。 深度学习方法:
抓取点预测:训练一个深度学习模型,使其能够从图像或点云中直接预测抓取点。模型输入可以是单帧图像或多帧序列,输出为抓取点的坐标和抓取方向。数据增强:通过数据增强技术生成多样化的训练数据,提升模型的泛化能力。例如,随机旋转、缩放、噪声添加等。 概率方法:
抓取点概率分布:基于历史数据,构建抓取点的概率分布模型。通过对大量抓取成功和失败案例进行统计,生成概率分布图。贝叶斯优化:使用贝叶斯优化方法,选择具有最高成功概率的抓取点。 三、运动规划 运动规划涉及多个复杂的计算过程,每一步都有其详细步骤:
路径规划:
A*算法:A*算法是一种启发式搜索算法,通过估算当前路径到目标的代价,找到最短路径。适用于静态环境下的路径规划。RRT(快速随机树):RRT是一种随机采样的路径规划算法,通过不断生成随机节点并连接,逐步逼近目标。适用于动态和复杂环境下的路径规划。Dijkstra算法:Dijkstra算法是一种经典的图搜索算法,通过遍历所有节点,找到从起点到终点的最短路径。 逆运动学:
解析方法:对于简单的机器人结构,可以通过解析方法直接计算各个关节角度。数值方法:对于复杂结构的机器人,使用数值方法(如Jacobian矩阵、迭代求解)计算关节角度。优化方法:通过优化算法(如梯度下降、遗传算法)在满足运动约束的同时,找到最优关节角度。 避障规划:
动态窗口法:根据机器人的速度和加速度约束,实时计算安全的运动路径,避免碰撞。障碍物膨胀:将环境中的障碍物进行膨胀处理,生成安全区,确保路径规划不与障碍物重叠。实时避障:结合传感器数据,实时更新环境信息,动态调整路径,确保避障成功。 时间优化:
速度规划:在规划路径时,同时考虑机器人的速度和加速度约束,确保运动平滑且高效。运动时间优化:通过优化算法,找到在最短时间内完成运动的路径,提高抓取效率。 四、控制 控制部分是抓取过程的最后一步,涉及手臂和手爪的协调控制:
运动控制:
关节空间控制:直接控制每个关节的运动,通过发送关节角度命令,实现预定的运动路径。任务空间控制:在任务空间(即末端执行器的工作空间)进行控制,通过逆运动学转换,生成关节角度命令。 力反馈控制:
力传感器:在手爪上安装力传感器,实时监测抓取过程中的力反馈信息。力控制策略:根据力传感器的数据,调整抓取力度,避免抓取过松或过紧。常用的控制策略包括阻抗控制、力矩控制等。 视觉伺服:
视觉反馈:使用相机实时监测手爪和物体的位置,通过视觉反馈调整抓取动作。视觉伺服控制:在视觉伺服系统中,结合图像处理和控制算法,实现手爪的精确定位和抓取。常用方法包括位置伺服(PBVS)和图像伺服(IBVS)。 多传感器融合:
传感器数据融合:结合视觉、力觉、触觉等多种传感器数据,构建一个综合的感知系统。通过传感器融合算法(如卡尔曼滤波、粒子滤波等),提高感知的准确性和稳定性。多模态控制:在抓取过程中,根据不同传感器的数据动态调整抓取策略,确保抓取的成功率和稳定性。 五、总结 机器人抓取检测在工业自动化、物流、医疗和家庭服务等领域有广泛应用。例如,在仓库中,机器人可以自动识别和抓取货物,提高物流效率;在家庭服务中,机器人可以帮助用户抓取和搬运物品,提供便利的生活服务。
这个技术的挑战包括如何在复杂环境中准确识别和抓取物体,如何处理物体形状和材质的多样性,以及如何在实时系统中实现高效稳定的抓取控制。随着深度学习和人工智能技术的发展,机器人抓取检测的准确性和效率也在不断提高。
文章目录 1、前言1、FileReader3、window.URL.createObjectURL4、参考链接 1、前言 一般来说,都是 后端返回给前端图片的url,前端直接把这个值插入到 img 的src 里面即可还有一种情况是前端需要预览一下图片,比如:上传头像按钮,前端需要临时 预览一下图片 这个时候就有两种方案了
方式一 转base64预览方式二 生成blob图片预览路径url 1、FileReader 可以利用 FileReader 把文件转成 base64格式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <input id="file1" type="file" value="FileReader.readAsDataURL 方式" multiple> <script> let file1El = document.querySelector('#file1') file1El.addEventListener('change', function (e) { // 可能会上传多个文件 let files = e.target.files console.log('files', files); if (files.length != 0) { loadFiles(files) .then((fileContents) => { console.log(fileContents); // 在所有文件加载完成后,打印包含所有文件内容的数组 fileContents.forEach(f => { let imgEl = document.
文章目录
前言
1 问题的构建
1.1 明确性与具体性
1.2 结构化与层次性
1.3 相关性与针对性
2 提问的技巧
2.1 简洁明了
2.2 避免歧义
2.3 使用自然语言
3 与AI的互动策略
3.1 耐心与理解
3.2 逐步引导
3.3 反馈与调整
4 总结与展望
5 推荐图书
6 粉丝福利
前言 在人工智能(AI)技术日新月异的今天,我们与AI的交互方式日益多样化。而在这其中,向AI提问作为一种基本的交互形式,其背后的艺术性和策略性却往往被我们所忽视。本文旨在探讨向AI提问的艺术,从问题的构建、提问的技巧到与AI的互动策略,揭示如何更有效地与AI进行沟通。
1 问题的构建 1.1 明确性与具体性 向AI提问时,问题的明确性和具体性是至关重要的。AI无法理解模糊或含糊不清的指令,因此我们需要确保问题的表述清晰、具体。例如,如果我们想查询某个城市的天气情况,应该直接提问:“北京今天的天气如何?”而不是简单地问:“天气怎么样?”
1.2 结构化与层次性 对于复杂的问题,我们需要将其拆分成多个部分,以结构化和层次性的方式提问。这有助于AI更好地理解问题,并给出准确的答案。例如,在查询某个项目的进展情况时,我们可以先问:“项目的整体进度如何?”然后再根据回答进一步提问关于某个具体环节的进展情况。
1.3 相关性与针对性 在构建问题时,我们需要考虑问题的相关性和针对性。即确保问题与我们想要获取的信息直接相关,并且能够针对性地引导AI给出我们需要的答案。例如,在查询某个产品的价格时,我们应该直接提问:“这个产品的售价是多少?”而不是问一些与价格无关的问题。
2 提问的技巧 2.1 简洁明了 在向AI提问时,我们应该尽量保持问题的简洁明了。冗长和复杂的问题不仅会增加AI的理解难度,还可能导致答案的不准确或偏离主题。因此,我们应该用简短、直接的语言表达问题,以便AI能够快速、准确地给出答案。
2.2 避免歧义 在构建问题时,我们需要特别注意避免歧义。歧义可能导致AI对问题的理解产生偏差,从而给出错误的答案。为了消除歧义,我们可以使用具体的词汇和描述,以及避免使用多义词或含糊不清的表达方式。
2.3 使用自然语言 尽管AI在处理结构化数据方面表现出色,但它们在理解自然语言方面仍有局限。因此,在向AI提问时,我们应该尽量使用自然语言来表达问题。这有助于AI更好地理解我们的意图,并给出更准确的答案。
3 与AI的互动策略 3.1 耐心与理解 与AI互动时,我们需要保持耐心和理解。AI可能无法立即给出我们想要的答案,或者给出的答案可能并不完全准确。在这种情况下,我们应该给予AI足够的时间来处理问题,并尝试从它的回答中获取信息。同时,我们也需要理解AI的局限性,并学会适应和调整我们的提问方式。
3.2 逐步引导 当AI无法直接回答我们的问题时,我们可以尝试逐步引导它。通过提出一系列相关的问题或给出更多的背景信息,我们可以帮助AI更好地理解问题,并引导它给出更准确的答案。这种逐步引导的方式需要我们有耐心和策略性,以便在互动过程中逐渐缩小问题的范围并找到满意的答案。
3.3 反馈与调整 与AI互动的过程中,我们需要不断地给予反馈并调整我们的提问方式。通过观察AI的回答和反应,我们可以了解它对我们问题的理解程度,并根据需要进行调整。这种反馈和调整的过程不仅有助于我们提高与AI的沟通效率,还有助于我们更好地理解AI的工作原理和局限性。
4 总结与展望 向AI提问的艺术不仅涉及问题的构建和提问的技巧,还包括与AI的互动策略。通过明确性与具体性、结构化与层次性、相关性与针对性的原则来构建问题,以及运用简洁明了、避免歧义、使用自然语言的技巧来提问,我们可以更有效地与AI进行沟通。同时,保持耐心与理解、逐步引导、反馈与调整等互动策略也有助于我们提高与AI的沟通效率和质量。
目录 协程1. 协程优点2. 协程作用域3. 协程上下文4. 协程启动方式(1) launch(2) async 5. 线程调度(切换)6. 协程挂起(阻塞)7. 实现并发8. 协程取消 这篇内容原本是放在这篇文章里面的: Kotlin 核心语法详解(快速入门)
但是觉得那篇内容较多,协程又相对重要,所以单拎出来。
协程 协程是一种编程思想,并不局限于特定的语言。除 Kotlin 以外,其他的一些语言,如 Go、Python 等都可以在语言层面上实现协程。
Kotlin Coroutine 本质上是 Kotlin 官方提供的一套线程封装 API,其设计初衷是为了解决并发问题,让协作式多任务实现起来更方便。子任务协作运行,优雅的处理异步问题解决方案。
协程是一种比线程更加轻量级的存在,不是线程,但是可以把它类比成线程。
协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程运行并依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。
协程具有以下非常重要的特点(这些都是高效运用协程的关键):
1.协程不阻塞当前线程。
2.两个独立协程互不干扰。
3.父子协程互不干扰。(协程里面可以再创建协程,叫子协程)
4.在一个协程中,必须等挂起函数执行完才能继续执行。
1. 协程优点 (1) 协程可以帮我们自动切线程
(2) 摆脱了链式回调的问题
2. 协程作用域 CoroutineScope即协程运行的作用域,主要作用是提供CoroutineContext,即协程运行的上下文。使用协程之前一定要用到它。
常用的 viewModelScope、LifecycleScope、MainScope、GlobalScope都是继承CoroutineScope。
GlobalScope 是全局协程空间,启动方式简单,但是内部运行或者子协程运行报错容易造成内存泄漏。
更推荐使用MainScope,使用的时候初始化,不用的时候销毁,cancel方法也会停止协程空间内的所有线程。
单独的launch只能在主协程控件内运行,所以可以理解为协程的子协程
3. 协程上下文 协程是通过Dispatchers调度器来控制线程切换的,调度Kotlin协程在哪个线程上执行。例如:Android 中 UI 操作必须要切回主线程操作。
Dispatchers 调度器:
Dispatchers.Default :当没有定义调度器时的默认值。用于中央处理器密集型的工作,计算操作,算法,类似的排序和转化数据工作
Dispatchers.IO :最常用,用于磁盘操作像是网络请求、数据库读写、文件下载。没有CPU密集操作
Dispatchers.Main :UI线程(主线程)
4. 协程启动方式 runBlocking:T //不常用,只在主线程使用,阻塞主线程,delay延迟阻塞 launch:Job //创建无返回值的协程 async:Deferred //创建有返回值的协程,用await()获取返回结果 withContext //不创建新的协程,指定协程上运行代码块 (1) launch 创建方式:
1、什么是Apache POI Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI 都是用于操作 Excel 文件。
Apache POI 的应用场景:
银行网银系统导出交易明细
各种业务系统导出Excel报表
批量导入业务数据
2、简单使用Apache POI Apache POI既可以将数据写入Excel文件
使用之前需要在项目的pom.xml文件中添加Apache POI的依赖。
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.16</version> </dependency> 2.1、将数据写入Excel文件 实现效果
代码实现
/** * 写入excel * @throws Exception */ @Test public void testWrite() throws Exception { //创建excel文件并写入磁盘 //创建一个内存的excel文件对象 XSSFWorkbook workbook = new XSSFWorkbook(); //创建一个工作表 XSSFSheet XSSFSheet sheet = workbook.createSheet("demo"); //创建数据 XSSRow,行号从0开始 XSSFRow row = sheet.
AI时代每个人都可以成为开发者,今天给大家分享一下怎么写一个微信小程序,后台接入AI大模型,实现AI对话。
1. 注册微信小程序
链接在此
mp.weixin.qq.com/cgi-bin/wxhttp://mp.weixin.qq.com/cgi-bin/wx
需要一个从来没有注册过的邮箱绑定
登录进去后,直达开发工具,下载微信开发者工具,并安装稳定版即可
然后来到开发设置页,记下你的AppID
2.导入小程序源码
开发者工具只是一个IDE,你可以自己从零开始写你的程序,或者简单点站在别人的肩膀上二次开发,我这里从Github上下载了一个源代码,你可以直接在Github上搜 小程序模版,然后找个合适的直接下载。如果想要我二次开发好的源码可以私信我。
导入程序后,需要把下面的AppID换成刚才小程序页面上你自己的:
然后记得配置一下代理,选择不使用任何代理
3. 配置后台服务器
这里你可以自己搭服务器,也可以用云服务器,但是都需要买一个域名才可以。为了省事,我用了阿里云的函数计算,可以直接用一个现成分配给你的域名,而且配置效率极高,基本上半个小时就可以完成。具体可以参考下面教程,而且现在还有免费试用。
基于通义千问SDK部署函数实现AI对话_函数计算(FC)-阿里云帮助中心通义千问是阿里云自主研发的大语言模型,能够在用户自然语言输入的基础上,通过自然语言理解和语义分析,在不同领域、任务内为用户提供服务和帮助。本文介绍如何通过函数计算实现基于通义千问的AI对话。https://help.aliyun.com/zh/functioncompute/use-cases/use-function-compute-to-realize-ai-dialogue?source=5176.11533457&userCode=lcpt2xut
进入阿里云函数计算页面,选择创建Web函数,记住选预装Python,其他选项按需配置
我用Python只写了个30行的代码,包含了Flask和Openai的库,不过我这里用的是Deepseek,但是接口跟Openai是一套
message = request.json.get('msg') client = OpenAI(api_key="你的APIkey", base_url="https://api.deepseek.com") response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是一个AI助手"}, {"role": "user", "content": message}, ], stream=False ) completion = response.choices[0].message.content res = { "resmsg":completion, "code":200 } return res 代码写好后,选择部署代码
部署好后,来到配置,记住你的公网访问地址
4.运行测试
好了,我们再回到小程序页面,把上面的公网访问域名填入到下面服务器域名里
准备就绪,回到开发者工具,在index.js里apiurl的地方也填入上面的服务器地址,运行一下吧
有什么需要交流的可以加我的星球哦
https://t.zsxq.com/CzLTihttps://t.zsxq.com/CzLTi
目录
1 模板字符串
1.1 模板字符串基本用法
1.2 模板字符串解决了一些痛点
2 解构赋值
2.1 对象的解构赋值
2.2 函数参数的解构赋值
2.3 补写:属性的简写
3 rest参数
3.1 arguments
3.2 rest参数
3.3 补充:判断数据类型
4 箭头函数
4.1 用法
4.2 箭头函数和普通匿名函数有哪些不同?
5 指向window
6 global和window的区别
1 模板字符串 模板字符串就是一种字符串的新的表现形式
1.1 模板字符串基本用法 var s1 = `abc` 1.2 模板字符串解决了一些痛点 1、字符串拼接
var s3 =" a " + s1 + " b " + s2; //普通字符串拼接 var s4 = ` a ${s1} b ${s2}`; //模板字符串,减少了错误几率 2、字符串换行
前言:
这是本人基于面向对象的思想,利用java写的,用于练习的图书管理系统,代码和框架存在借鉴,本人并无获取利益的考虑,旨在分享和记录知识
框架与思路 作为一个图书管理系统,我们可以将它分成这个几个对象
1.书 书可以分为书籍信息和书架,前者负责储存书的信息,后者如字面意思,负责向使用者展示有多少书籍
2.用户 用户分为管理员和普通用户,前者要进入,还需要设置密码
3.操作 管理员和用户需要有不同的操作权限吗,用于查阅,增加,显示,借书和还书等操作
具体框架如截图
框架图 这里有个习惯不要学,类名开头字母要大写哦
"书籍"包的代码 首先是book package Book; public class book { private String name; private String author; private int price ; private String type; private boolean isBorrowed;//是否已经被借出 @Override public String toString() { return "book{" + "name='" + name + '\'' + ", author='" + author + '\'' + ", price=" + price + ", type='" + type + '\'' + ((isBorrowed==true?
一、问题复现 不知你是否遇到过 join 结果明显不匹配的情况,例如on t1.join_key = t2.join_key中两个join_key明显不相等,但 join 的结果却将其匹配在一起。今日博主在通过用户 id 关联获取用户信息时发现一个用户 id 可以在用户维表中匹配出若干条(用户维表不存在数据重复),如下:
-- 业务表 create table tmp_hz_perm.tmp_20240520_1 ( id string ) stored as parquet; -- 用户维度表 create table tmp_hz_perm.tmp_20240520_2 ( id bigint, name string ) stored as parquet; 插入若干条数据
insert into tmp_hz_perm.tmp_20240520_1 values ('4268348961309240666'); insert into tmp_hz_perm.tmp_20240520_2 values (4268348961309240666, 'user1'), (4268348961309241004, 'user2'), (3268348961319241004, 'user3'); 模拟事故 sql
-- sql-1 select * from tmp_hz_perm.tmp_20240520_1 t1 left join tmp_hz_perm.tmp_20240520_2 t2 on t1.
上一篇:搭建基于Django的博客系统数据库迁移从Sqlite3到MySQL(四)
下一篇:基于Django的博客系统之增加类别导航栏(六)
功能概述 添加搜索框用于搜索博客。 需求详细描述 1. 添加搜索框用于搜索博客
描述: 在博客首页添加搜索框,用户可以通过关键词搜索博客文章。功能要求: 搜索框位置:导航栏或页面顶部。支持根据标题和内容进行搜索。搜索结果显示匹配的博客列表。 用户故事: 作为用户,我希望能够通过搜索框快速找到感兴趣的博客文章。 技术结构 实现一个博客搜索功能,可以同时使用 Elasticsearch 和 MySQL 各自的优势。以下是如何区分和结合使用这两种技术的方法:
使用 MySQL 的部分 数据存储: 存储博客文章的基本信息,如标题、作者、发布时间、分类等。存储用户信息、评论、标签等结构化数据。 基础查询和管理: 进行常规的 CRUD 操作,如创建、读取、更新、删除博客文章。进行简单的过滤和排序,如按发布时间、作者、分类等查询文章。 使用 Elasticsearch 的部分 全文搜索: 存储和索引博客文章的全文内容,以支持全文搜索功能。对用户搜索的关键词进行快速匹配,返回相关的文章列表。 复杂查询: 支持复杂的查询需求,如模糊搜索、布尔搜索、按相关性排序等。支持自动补全、拼写纠错等高级搜索功能。 集成 MySQL 和 Elasticsearch 数据同步: 需要将 MySQL 中的博客文章数据同步到 Elasticsearch 中,以确保搜索功能能够使用最新的数据。可以使用定时任务或实时数据同步机制来保持两者数据的一致性。例如,使用工具如 Logstash、Beats 或自定义的同步程序。 搜索接口设计: 提供一个统一的搜索接口,前端用户提交搜索请求时,后台从 Elasticsearch 中查询搜索结果。查询到的搜索结果中包含文章的基本信息,从 Elasticsearch 返回文章的 ID,然后从 MySQL 中获取详细信息(如作者、评论等)。 实现步骤 要在 Django 博客应用中添加搜索框,以便用户可以搜索博客内容,可以按照以下步骤进行:
1. 安装 Django 搜索库 首先,确保你已经安装了 Django 搜索库。一个常用的选择是 django-haystack 库,它提供了与多个搜索引擎(如 Elasticsearch、Solr 和 Whoosh 等)集成的功能。
校园志愿者管理系统
目录
基于SprinBoot+vue的校园志愿者管理系统
一、前言
二、系统设计
三、系统功能设计 1 系统功能模块
2管理员功能
3志愿者功能
四、数据库设计
五、核心代码 六、论文参考
七、最新计算机毕设选题推荐
八、源码获取:
博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️
主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。
🍅文末获取源码联系🍅
基于SprinBoot+vue的校园志愿者管理系统 一、前言 本校园志愿者管理系统以springboot作为框架,b/s模式以及MySql作为后台运行的数据库,同时使用Tomcat用为系统的服务器。本系统主要包括首页、个人中心、志愿者管理、活动类型管理、活动信息管理、活动报名管理、活动通知管理、活动心得管理、交流反馈、系统管理等功能,通过这些功能的实现基本能够满足日常校园志愿者管理的操作。
本文着重阐述了校园志愿者管理系统的分析、设计与实现,首先介绍开发系统和环境配置、数据库的设计,接着说明功能模块的详细实现,最后进行了总结。
关键词:校园志愿者; springboot;MySql数据库;Tomcat;
二、系统设计 系统功能结构图
三、系统功能设计 1 系统功能模块 校园志愿者管理系统,用户进入到系统首页,可以查看首页、活动信息、活动心得、公告信息、交流反馈、个人中心、后台管理等内容进行操作,如图4-1所示。
图4-1系统首页界面图
志愿者注册;在志愿者注册页面中输入用户名、密码、确认密码、姓名、年龄、邮箱、手机等内容完成注册操作;如图4-2所示。
图4-2志愿者注册界面图
2管理员功能 管理员登录,通过填写注册时输入的用户名、密码、选择角色等信息进行登录操作,如图4-6所示。
图4-6管理员登录界面图
3志愿者功能 志愿者登录进入校园志愿者管理系统可以查看首页、个人中心、活动报名管理、活动通知管理、活动心得管理、我的收藏管理、交流反馈等功能进行详细操作,如图4-16所示。
图4-16志愿者功能界面图
四、数据库设计 活动信息实体属性图如下所示:
图3-2活动信息实体属性图
数据库表的设计,如下表:
表4-1:配置文件
字段名称
类型
长度
字段说明
主键
默认值
id
bigint
主键
主键
name
varchar
100
配置参数名称
value
varchar
100
配置参数值
五、核心代码 package com.service.impl; import com.utils.StringUtil; import com.service.DictionaryService; import com.
校园交友网站
目录
基于SprinBoot+vue的校园交友网站
一、前言
二、系统设计
三、系统功能设计 1系统功能模块
2后台功能模块
5.2.1管理员功能模块
5.2.2用户功能模块
四、数据库设计
五、核心代码 六、论文参考
七、最新计算机毕设选题推荐
八、源码获取:
博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️
主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。
🍅文末获取源码联系🍅
基于SprinBoot+vue的校园交友网站 一、前言 本文首先介绍了校园交友管理的技术发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图,流程图以及E/R图。然后,设计框架并根据设计的框架编写代码以实现系统的各个功能模块。最后,对初步完成的系统进行测试,对功能、单元和性能进行测试。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点。
关键词:校园交友;java; Mysql数据库
二、系统设计 系统功能结构图
三、系统功能设计 1系统功能模块 校园交友网站,在网站首页可以查看首页、线下活动、交友信息、交流论坛、公告信息、个人中心、后台管理等内容进行详细操作,如图5-1所示。
图5-1网站首页界面图
2后台功能模块 后台登录,用户通过输入用户名、密码,选择角色并点击登录进行系统登录操作,如图5-6所示。
图5-6后台登录界面图
5.2.1管理员功能模块 管理员登录系统后,可以对首页、个人中心、用户管理、线下活动管理、交友信息管理、活动报名管理、交流论坛、系统管理等功能进行相应操作,如图5-7所示。
图5-7管理员功能界面图
5.2.2用户功能模块 用户登录进入系统,可以对首页、个人中心、交友信息管理、活动报名管理等功能进行相应操作,如图5-14所示。
图5-14用户功能界面图
四、数据库设计 1. 公告信息实体图如图4-2所示:
图4-2公告信息实体图
数据库表的设计,如下表:
表4-1:token表
字段名称
类型
长度
字段说明
主键
默认值
id
bigint
主键
主键
userid
bigint
用户id
username
varchar
100
用户名
tablename
varchar
100
表名
role
varchar
100
角色
文章目录 概要Ollama部署WebUI部署AnythingLLM部署Docker-Compose部署管理所有容器小结参考文章 概要 Ollama 是一个强大的大模型提供者,它通过开源的方式,为开发者和企业提供了先进的大型语言模型(LLM)。这些模型拥有处理和生成复杂语言任务的能力,为各种应用场景提供了强大的基础。
Open WebUI 则进一步增强了用户体验,它提供了一个高度可视化和用户友好的对话界面。这个界面不仅美观,而且功能丰富,使用户能够轻松地与背后的大模型进行交互,无论是通过文本聊天还是其他交互方式。
AnythingLLM 则是在这个基础上的一个创新工具,它允许用户利用 Ollama 提供的大模型能力,并结合本地数据,构建和定制符合个人或企业特定需求的 AI 大模型。AnythingLLM 的灵活性和定制性意味着用户可以根据自己的特定业务场景和需求,创建和优化 AI 解决方案,从而在保证数据安全和隐私的同时,实现更加个性化和高效的服务。
通过 AnythingLLM,用户可以轻松地将本地文档、资料和数据集成到 AI 模型中,实现智能检索、内容生成、问答系统等多样化功能。这不仅提高了工作效率,还增强了决策支持的能力。AnythingLLM 的多用户支持和精细的权限管理,使得团队协作变得更加简单和安全。
总的来说,Ollama、Open WebUI 和 AnythingLLM 的结合,为用户提供了一个从模型提供到界面交互,再到个性化定制的完整解决方案,使得构建和部署 AI 大模型变得更加容易、高效和安全。
Ollama部署 获取Ollama镜像:
使用Docker从镜像仓库拉取Ollama镜像:docker pull ollama/ollama 创建Ollama宿主机挂载目录:
在宿主机上创建一个目录用于Ollama数据的持久化存储:mkdir -p /data/docker/ollama/data 修改目录权限chmod -R 777 /data/docker/ollama 启动Ollama容器
使用以下命令启动Ollama容器,并将数据目录挂载到容器中:docker run \ -d \ --restart always \ --name ollama \ --privileged=true \ -p 11434:11434 \ -v /data/docker/ollama/data:/root/.ollama \ ollama/ollama 其中: -d 表示后台运行容器。--restart always 设置容器的重启策略。--name ollama 为容器指定一个名称。--privileged=true 使容器以特权模式运行,这将给予容器几乎相同于宿主机的权限。 -p 11434:11434 \ 将容器的11434端口映射到宿主机的11434端口。 -v /data/docker/ollama/data:/root/.
windows mysql8.0.34 问题描述: 首次安装报错:端口不可为0
去my.ini文件找了末尾确实为mysqlx-port=0.0'
且用管理员权限修改多次,都会在最后安装那一步生成一个新的配置文件,用回端口0
解决步骤: 1.确认计算机名字不包含中文和中文符号
(这里踩过坑,含中文编译出来会有非主流文字)
2.打开windows设置,“时间和语言”---->“语言和区域”---->在“相关设置”一栏找到“管理语言设置”,然后在弹出的窗格点“更改系统区域设置”,把下面那个“使用UTF-8提供全球语言支持”打上勾,重启电脑。卸载MySQL,重新安装。
卸载注意:
卸载完MySQL Installer - Community MySQL Server 8.0 MySQLinstallerConsole 还有注册表中HKEY CURRENT USER和2个HKEY LOCAL MACHINE
结果:还是同样的报错
3.控制面板->用户账户->本地用户和组->组
双击Administrators
点击添加
点击高级
把 NETWORK SERVICE添加到Administrators组
结果:win11做不到
3.重新去官网找了一份msi文件安装
网址:https://www.mysql.com/cn/
选择上方【下载】
选择 下方【MySQL Community (GPL) Downloads »】
选择【MySQL Installer for Windows】
下载底下那个,不要上面含有web的,标注32位也已包含了64位的操作。文件名按最新版本变化,我的是mysql-installer-community-8.0.37.0.msi
选择custom自定义安装,会在设置权限认证那步的check root账户密码卡住不动,杀完进程继续卸载。
重新安装选择full完全体安装,一路不改配置,过了。
结果:serverport=0的原因还是未知,但能装上就行= =
1. embedding 层 index out of range in self 原因: 一般是因为模型的vocab_size与提供的vocab.txt文件的词大小不一致。 检查方法: 可通过以下方法,查看tensor的最大最小值 # print('token_ids', token_ids.max(), token_ids.min()) # (已转变为张量后) # print('attention_masks', attention_masks.max(), attention_masks.min()) # (已转变为张量后) # print('token_type_ids', token_type_ids.max(), token_type_ids.min()) # (已转变为张量后) # print('labels', labels.max(), labels.min()) # (已转变为张量后) 2 Dataloader File "D:\python\lib\site-packages\torch\utils\data\_utils\collate.py", line 55, in default_collate return torch.stack(batch, 0, out=out) RuntimeError: stack expects each tensor to be equal size, but got [2] at entry 0 and [1] at entry 1 原因是text 在tokenizer.
个人主页~
二叉树-堆(上)
栈和队列
二叉树 四、堆的代码实现Heap.hHeap.ctest.c 五、堆的应用堆排序思想进行排序 六、二叉树链式结构的实现BTree.hBTree.ctest.c 四、堆的代码实现 Heap.h #pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int HPDataType; typedef struct Heap { HPDataType* a; int size; int capacity; }Heap; // 堆的初始化 void HeapInit(Heap* hp); // 堆的销毁 void HeapDestory(Heap* hp); // 堆的插入 void HeapPush(Heap* hp, HPDataType x); // 堆的删除 void HeapPop(Heap* hp); // 取堆顶的数据 HPDataType HeapTop(Heap* hp); // 堆的数据个数 int HeapSize(Heap* hp); // 堆的判空 int HeapEmpty(Heap* hp); void AdjustUp(HPDataType* a, int child); //向下调整算法 void AdjustDown(HPDataType* a, int n, int parent); Heap.