vue3 中使用 Recorder 实现录音并上传,并用Go语言调取讯飞识别录音(Go语言)
录音并识别
- 效果图
- 一、开启游览器录音权限
- 二、前端代码
- 三、Go代码,上传到讯飞识别录音返回到前端
效果图
recorder-core插件可以在网页中进行录音。录音文件(blob)并可以自定义上传,可以下载录音文件到本地,本文录音过程中会显示可视化波形,插件兼容PC端、Android、和iOS,目前只测试pc端
一、开启游览器录音权限
http://localhost:5173/ 网址为例:
第一步:在浏览器地址栏输入:
edge游览器输入:edge://flags/#unsafely-treat-insecure-origin-as-secure
谷歌游览器输入: chrome://flags/#unsafely-treat-insecure-origin-as-secure
第二步:在 Insecure origins treated as secure 输入栏中输入需要获取麦克风权限的白名单网址。
第三步:将右侧 已禁用 状态改成 已启用。
第四步:点击浏览器右下角 重启 按钮重启浏览器。
二、前端代码
下载插件
npm install recorder-core
使用的版本号:
“recorder-core”: “^1.3.25011100”,
前端代码使用了antdv UI库,只在button 和switch 上使用了,可以自行删除前缀(a-)
<template><div style="padding: 10px"><div style="display: flex; align-items: center"><!-- 按钮 --><a-button @click="recOpen">打开录音,请求权限</a-button><a-button @click="recStart">开始录音</a-button><a-button @click="recStop">结束录音</a-button><a-button @click="recPlay">本地试听</a-button><div style="display: flex; align-items: center; margin: 0 10px"><span>下载文件到本地</span><a-switch v-model:checked="downloadShow" checked-children="开" un-checked-children="关" /></div><div style="display: flex; align-items: center; margin: 0 10px"><span>录音完成上传识别</span><a-switch v-model:checked="uploadShow" checked-children="开" un-checked-children="关" /></div></div><div style="margin-top: 10px"><div> 波形绘制区域 </div><div style="padding-top: 5px"><div style="border: 1px solid #ccc; display: inline-block; vertical-align: bottom"><div style="height: 100px; width: 300px" ref="recwave"></div></div></div></div><div style="margin: 10px 0"><div class="file"><i class="ico-plus"></i>上传图片<inputtype="file"id="avatar"name="avatar"accept="wav/*"multiplerequired@change="changeFile"/></div></div><div>识别结果:<span style="color: aqua">{{ recordingResult }}</span></div></div>
</template><script lang="ts" setup>import { onMounted, ref } from 'vue';//必须引入的核心import Recorder from 'recorder-core';//引入mp3格式支持文件;如果需要多个格式支持,把这些格式的编码引擎js文件放到后面统统引入进来即可import 'recorder-core/src/engine/mp3';import 'recorder-core/src/engine/mp3-engine';//录制wav格式的用这一句就行import 'recorder-core/src/engine/wav';//可选的插件支持项,这个是波形可视化插件import 'recorder-core/src/extensions/waveview';import { upWav } from '/@/api/service';let rec: any;let recBlob: any;let wave: any;const recwave = ref(null);let recordingResult = ref('');let downloadShow = ref(false);let uploadShow = ref(true);onMounted(() => {recOpen();});// 打开录音async function recOpen() {return new Promise<void>((resolve, reject) => {rec = Recorder({type: 'wav',sampleRate: 16000,bitRate: 16,onProcess: (buffers: any,powerLevel: any,bufferDuration: any,bufferSampleRate: any,newBufferIdx: any,asyncEnd: any,) => {if (wave) {wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate);}},});rec.open(() => {console.log('录音已打开');if (recwave.value) {wave = Recorder.WaveView({ elem: recwave.value });}resolve(); // 录音打开成功,返回 Promise 的 resolve},(msg: any, isUserNotAllow: any) => {console.log((isUserNotAllow ? 'UserNotAllow,' : '') + '无法录音:' + msg);reject(new Error((isUserNotAllow ? 'UserNotAllow,' : '') + '无法录音:' + msg)); // 录音打开失败,返回 Promise 的 reject},);});}// 开始录音async function recStart() {try {await recOpen(); // 等待录音设备打开rec?.start(); // 开始录音console.log('录音已开始');} catch (error) {console.error('录音启动失败:', error);}}// 结束录音并保存到本地function recStop() {if (!rec) {console.error('未打开录音');return;}rec.stop((blob: any, duration: any) => {//blob就是我们要的录音文件对象,可以上传,或者本地播放recBlob = blob;//简单利用URL生成本地文件地址,此地址只能本地使用,比如赋值给audio.src进行播放,赋值给a.href然后a.click()进行下载(a需提供download="xxx.mp3"属性)const localUrl = (window.URL || window.webkitURL).createObjectURL(blob);console.log('录音成功', blob, localUrl, '时长:' + duration + 'ms');if (downloadShow.value) {download(blob);}if (uploadShow.value) {upload(blob); //把blob文件上传到服务器}//关闭录音,释放录音资源,当然可以不释放,后面可以连续调用startrec.close();rec = null;},(err: any) => {console.error('结束录音出错:' + err);rec.close();rec = null;},);}// 本地试听(保持原样)function recPlay() {const localUrl = URL.createObjectURL(recBlob);const audio = document.createElement('audio');audio.controls = true;document.body.appendChild(audio);audio.src = localUrl;audio.play();setTimeout(() => {URL.revokeObjectURL(audio.src);}, 5000);}/**下载录音文件到本地*/function download(blob) {// 创建下载链接const url = URL.createObjectURL(blob);const a = document.createElement('a');a.style.display = 'none';a.href = url;a.download = `recording_${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.wav`; // 使用时间戳生成唯一文件名document.body.appendChild(a);a.click();// 清理资源setTimeout(() => {URL.revokeObjectURL(url);document.body.removeChild(a);}, 100);}/**上传录音*/function upload(blob: any) {//使用FormData用multipart/form-data表单上传文件//或者将blob文件用FileReader转成base64纯文本编码,使用普通application/x-www-form-urlencoded表单上传// const form = new FormData();// form.append('upfile', blob, 'recorder.mp3'); // 和普通form表单并无二致,后端接收到upfile参数的文件,文件名为recorder.mp3// form.append('key', 'value'); // 其他参数// var xhr = new XMLHttpRequest();// xhr.open('POST', '/upload/xxxx');// xhr.onreadystatechange = () => {// if (xhr.readyState == 4) {// if (xhr.status == 200) {// console.log('上传成功');// } else {// console.error('上传失败' + xhr.status);// }// }// };// xhr.send(form);// 自己的上传函数uploadService(blob);}/**手动选择文件上传*/async function changeFile(e: any) {// 确保事件对象有效if (!e || !e.target || !e.target.files) {console.error('Invalid event or no files selected');return;}// 获取文件列表const files = e.target.files;console.log('e::::', e);console.log('files::::', files);// 检查文件列表是否为空if (files.length === 0) {console.error('No files selected');return;}// 获取第一个文件const file = files[0];console.log('file::::', file);// 调用 OCR 函数try {let res = await upWav({ file: file });console.log('🚀 ~ changeFile ~ res:', res);} catch (error) {console.error('Error during file processing:', error);}}/**录音完毕,自动上传识别*/async function uploadService(blob) {try {let res: any = await upWav({ file: blob });if (res.data.code == 1) {recordingResult.value = res.data.data;} else {recordingResult.value = res.data.msg;}} catch (error) {console.error('Error during file processing:', error);}}
</script>
三、Go代码,上传到讯飞识别录音返回到前端
使用讯飞的录音文件转写产品
获取前端上传的文件
package ocrimport ("context""fmt""io""io/ioutil""net/http""ocrtext/internal/logic/xfyun""ocrtext/internal/svc""ocrtext/internal/types""os""path/filepath""github.com/zeromicro/go-zero/core/logx"
)type UpWavBySpeechRecognitionLogic struct {logx.Loggerctx context.ContextsvcCtx *svc.ServiceContextr *http.Request
}func NewUpWavBySpeechRecognitionLogic(ctx context.Context, svcCtx *svc.ServiceContext, r *http.Request) *UpWavBySpeechRecognitionLogic {return &UpWavBySpeechRecognitionLogic{Logger: logx.WithContext(ctx),ctx: ctx,svcCtx: svcCtx,r: r,}
}func (l *UpWavBySpeechRecognitionLogic) UpWavBySpeechRecognition() (resp *types.OcrListResp, err error) {// 获取上传的文件file, handler, err := l.r.FormFile("file")if err != nil {fmt.Println("检索文件错误")return}defer file.Close()// 打印文件信息:handler.Filename//fmt.Printf("Uploaded File: %+v\n", handler.Filename)//fmt.Printf("File Size: %+v\n", handler.Size)//fmt.Printf("MIME Header: %+v\n", handler.Header)// 创建一个临时文件来保存上传的文件内容tempFile, err := ioutil.TempFile(os.TempDir(), "upload-*"+filepath.Ext(handler.Filename))if err != nil {fmt.Println("创建临时文件出错")return}defer tempFile.Close()// 将上传的文件内容复制到临时文件中_, err = io.Copy(tempFile, file)if err != nil {fmt.Println("将文件复制到临时文件错误")return}// 新增语音识别调用api := xfyun.NewRequestApi(tempFile.Name()) // 使用临时文件路径result, err := api.GetResult()if err != nil {return &types.OcrListResp{BaseDataInfo: types.BaseDataInfo{Code: 500,Msg: "语音识别失败: " + err.Error(),},}, nil}// 解析识别结果(根据实际API响应结构调整)return &types.OcrListResp{BaseDataInfo: types.BaseDataInfo{Code: 1,},Data: result.Result,}, nil
}
上传到讯飞,识别录音返回到前端
讯飞后台地址:https://console.xfyun.cn/services/lfasr
package xfyunimport ("crypto/hmac""crypto/md5""crypto/sha1""encoding/base64""encoding/hex""encoding/json""fmt""io""net/http""net/url""os""strings""time"
)const (lfasrHost = "https://raasr.xfyun.cn/v2/api"apiUpload = "/upload"apiGetResult = "/getResult"appid = "" // 自行填写secretKey = "" // 自行填写
)type RequestApi struct {AppID stringSecretKey stringUploadFilePath stringts stringsigna string
}type UploadResponse struct {Code string `json:"code"`DescInfo string `json:"descInfo"`Content struct {OrderID string `json:"orderId"`TaskEstimateTime int `json:"taskEstimateTime"`} `json:"content"`
}type OrderInfo struct {OrderId string `json:"orderId"`failType int `json:"failType"`Status int `json:"status"`OriginalDuration int `json:"originalDuration"`RealDuration int `json:"realDuration"`
}type GetResultResponse struct {Code string `json:"code"`DescInfo string `json:"descInfo"`Content struct {OrderInfo OrderInfo `json:"orderInfo"`// 根据实际API响应添加字段OrderResult string `json:"orderResult"`ResultText string `json:"resultText"`TaskEstimateTime int `json:"taskEstimateTime"`} `json:"content"`
}
type XFYunResp struct {Result string `json:"result"`
}// 基础结构体定义
type Cw struct {W string `json:"w"`
}type Ws struct {Cw []Cw `json:"cw"`
}type Rt struct {Ws []Ws `json:"ws"`
}type St struct {Rt []Rt `json:"rt"`
}type JSON1Best struct {St St `json:"st"`
}// Lattice项(需要二次解析)
type LatticeItem struct {JSON1Best string `json:"json_1best"`
}// Lattice2项(直接包含结构)
type Lattice2Item struct {JSON1Best JSON1Best `json:"json_1best"`
}
type OrderResult struct {Lattice []LatticeItem `json:"lattice"`Lattice2 []Lattice2Item `json:"lattice2"`
}func NewRequestApi(uploadFilePath string) *RequestApi {ts := fmt.Sprintf("%d", time.Now().Unix())return &RequestApi{AppID: appid,SecretKey: secretKey,UploadFilePath: uploadFilePath,ts: ts,signa: "",}
}// getSigna 获取接口鉴权
func (r *RequestApi) getSigna() string {data := r.AppID + r.tshasher := md5.New()hasher.Write([]byte(data))md5Str := hex.EncodeToString(hasher.Sum(nil))mac := hmac.New(sha1.New, []byte(r.SecretKey))mac.Write([]byte(md5Str))signa := base64.StdEncoding.EncodeToString(mac.Sum(nil))return signa
}// Upload 上传文件函数
func (r *RequestApi) Upload() (*UploadResponse, error) {r.signa = r.getSigna()fileInfo, err := os.Stat(r.UploadFilePath)if err != nil {return nil, err}params := url.Values{}params.Add("appId", r.AppID)params.Add("signa", r.signa)params.Add("ts", r.ts)params.Add("fileSize", fmt.Sprintf("%d", fileInfo.Size()))params.Add("fileName", fileInfo.Name())params.Add("duration", "200")file, err := os.Open(r.UploadFilePath)if err != nil {return nil, err}defer file.Close()reqURL := lfasrHost + apiUpload + "?" + params.Encode()resp, err := http.Post(reqURL, "application/octet-stream", file)if err != nil {return nil, err}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return nil, err}var uploadResp UploadResponseif err := json.Unmarshal(body, &uploadResp); err != nil {return nil, err}return &uploadResp, nil
}// GetResult 获取结果函数
func (r *RequestApi) GetResult() (*XFYunResp, error) {uploadResp, err := r.Upload()if err != nil {return nil, err}params := url.Values{}params.Add("appId", r.AppID)params.Add("signa", r.signa)params.Add("ts", r.ts)params.Add("orderId", uploadResp.Content.OrderID)params.Add("resultType", "transfer,predict")client := &http.Client{}var resultResp GetResultResponse/**get,post都可*/// 创建请求体缓冲区//var requestBody bytes.Buffer//writer := multipart.NewWriter(&requestBody)添加表单字段//_ = writer.WriteField("appId", r.AppID)//_ = writer.WriteField("signa", r.signa)//_ = writer.WriteField("ts", r.ts)//_ = writer.WriteField("orderId", uploadResp.Content.OrderID)//_ = writer.WriteField("resultType", "transfer,predict")//关闭writer以生成结尾边界//writer.Close()for {fmt.Println("重新请求")reqURL := lfasrHost + apiGetResult + "?" + params.Encode()resp, err := client.Get(reqURL)// 创建HTTP请求//reqURL := lfasrHost + apiGetResult//req, err := http.NewRequest("POST", reqURL, &requestBody)//if err != nil {// // 处理错误//}设置Content-Type头(必须包含boundary参数)//req.Header.Set("Content-Type", writer.FormDataContentType())//发送请求//client := &http.Client{}//resp, err := client.Do(req)//if err != nil {// return nil, err//}//defer resp.Body.Close()if err != nil {return nil, err}body, err := io.ReadAll(resp.Body)err = resp.Body.Close()if err != nil {return nil, err}if err := json.Unmarshal(body, &resultResp); err != nil {return nil, err}fmt.Printf("resultResp: %+v\n", resultResp)if resultResp.Code == "000000" && (resultResp.Content.OrderInfo.Status == 4 || resultResp.Content.OrderInfo.Status == -1) {break}if resultResp.Content.OrderInfo.Status == 4 { // 假设4表示完成break}time.Sleep(1 * time.Second)}/**提取文字内容*/ParseOrderResultResp, err := ParseOrderResult(resultResp.Content.OrderResult)if err != nil {return nil, err}return &XFYunResp{Result: ParseOrderResultResp,}, nil
}// ParseOrderResult 解析入口函数
func ParseOrderResult(strData string) (string, error) {var jsonData = []byte(strData)var result OrderResultif err := json.Unmarshal(jsonData, &result); err != nil {return "", err}var words []string// 统一处理两种数据结构processJSON1Best := func(content *JSON1Best) {for _, rt := range content.St.Rt {for _, ws := range rt.Ws {for _, cw := range ws.Cw {if cw.W != "" {words = append(words, cw.W)}}}}}// 解析Latticefor _, item := range result.Lattice {var content JSON1Bestif err := json.Unmarshal([]byte(item.JSON1Best), &content); err == nil {processJSON1Best(&content)}}// 解析Lattice2//for _, item := range result.Lattice2 {// processJSON1Best(&item.JSON1Best)//}return strings.Join(words, ""), nil
}
五、感谢
感谢这位博主的分享
努力挣钱的小鑫
相关文章:
vue3 中使用 Recorder 实现录音并上传,并用Go语言调取讯飞识别录音(Go语言)
录音并识别 效果图一、开启游览器录音权限二、前端代码三、Go代码,上传到讯飞识别录音返回到前端 效果图 recorder-core插件可以在网页中进行录音。录音文件(blob)并可以自定义上传,可以下载录音文件到本地,本文录音过程中会显示可视化波形,插件兼容PC端…...
自探索大语言模型微调(一)
一、数据 1.1、失败案例 Hugging Face: 根据B站上搜索到的资料,datasets这个库可以直接下载丰富的数据集合和与训练模型,调用也非常的简单,唯一的缺点就是,需要外网(翻墙),用国内的…...
算法练习(链表)
链表 链表的分类 单向链表,双向链表带头链表,不带头链表循环的,非循环的 链表的结构 图中所示的为链表的一个节点,value是这个节点的所存储的数据值,next为下一节点的地址。 代码实现链表 1.创建节点类 节点由…...
在 Ubuntu 服务器上使用宝塔面板搭建博客
📌 介绍 在本教程中,我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板,并使用 Nginx PHP MySQL 搭建一个博客(如 WordPress)。 主要步骤包括: 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…...
K8S学习之基础二十八:k8s中的configMap
k8s中的configMap configMap是k8s的资源对象,简称cm,用于保存非机密性的配置,数据可以用key/value键值对形式保存,也可以通过文件形式保存 在部署服务的时候,每个服务都有自己的配置文件,如果一台服…...
EDID读取学习
简介 Video BIOS可以被认为是一个具有独立硬件抽象层的操作系统。它不会阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。虽然不推荐,但一些DOS应用程序确实可以改变基本的硬件设置,而根本不需要通过视频BIOS。大多数现代应用程序和操作系统都避免直接使用硬件…...
基于 SSE 和 WebSocket 的在线文本实时传输工具
简介 在线文本实时传输工具支持 SSE(Server-Sent Events) 和 WebSocket,可在不同设备间快速共享和同步文本,适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步:文本输入后,另一端用户可立即看到…...
大语言模型安全风险分析及相关解决方案
大语言模型的安全风险可以从多个维度进行分类。 从输入输出的角度来看,存在提示注入、不安全输出处理、恶意内容生成和幻觉错误等风险; 从数据层面来看,训练数据中毒、敏感信息泄露和模型反演攻击是主要威胁; 模型自身则面临拒绝服务和盗窃的风险; 供应链和插件的不安全引…...
4、linux c 进程
【三】进程 1. 进程与程序的区别 程序:存放在磁盘上的指令和数据的有序集合(文件),是静态的。 进程:执行一个程序所分配的资源的总称,是动态的。 2. 进程的组成部分 BSS段(bss)&…...
OpenFeign
OpenFeign 工作原理详解 1. 声明式接口 开发者通过定义一个接口,并使用特定的注解(如GetMapping, PostMapping等)来描述HTTP请求。OpenFeign会根据这些注解自动生成相应的HTTP请求。 注解支持: FeignClient:用于定…...
Centos离线安装perl
文章目录 Centos离线安装perl1. perl是什么?2. Perl下载地址3. perl的安装4. 安装结果验证 Centos离线安装perl 1. perl是什么? Perl 是一种 高级脚本语言,诞生于 1987 年,以强大的 文本处理能力 和灵活性著称,常用于…...
RabbitMQ可靠性进制
文章目录 1.生产者可靠性生产者重连生产者确认小结 2. MQ的可靠性数据持久化LazyQueue小结 3. 消费者的可靠性消费者确认机制消费者失败处理方案业务幂等性唯一消息ID业务判断 兜底方案业务判断 兜底方案 1.生产者可靠性 生产者重连 在某些场景下由于网络波动,可能…...
PHP优化技术
最近在学习php语言,打算用来提升开发小项目的效率。下面是php项目中常见的优化手段。 1、引起php性能问题的原因 (1)php语法使用不当 (2)使用php做了它不擅长的事 (3)用php连接的服务不给力 &…...
【Go类库分享】Go expr 通用表达式引擎
【Go类库分享】Go expr 通用表达式引擎 官方教程:https://expr-lang.org/docs/language-definition 官方Github:https://github.com/expr-lang/expr 文章所含代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-d…...
线性代数(1)用 excel 计算鸡兔同笼
线性代数excel计算鸡兔同笼 案例:鸡兔同笼问题的三种解法(递进式教学)一、问题描述二、方程式解法(基础版)步骤解析 三、线性代数解法(进阶版)1. 方程组转化为矩阵形式2. 矩阵求解(逆…...
Docker基础知识介绍
Docker基础篇 必须要在Linux环境下才能运行,windows下运行也是安装虚拟机后才能下载安装运行 下载安装 linux 依次执行下边步骤 更新 yum yum update 卸载旧的Docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \do…...
机器人交社保属于“无稽之谈”?
今晨浏览社交网站,惊奇地看到“给机器人上社保”的网页搜索结果竟然多达“约 3,280,000个”。所以被称为“无稽之谈”和“本质上是利用社保之名收税”就实不为过,而且还会让人读罢笑得喷饭:“连搞笑大王赵本山见了,也定会拱手作揖…...
接口测试和功能测试的区别
接口测试和功能测试的区别 一 **接口测试概述**1.1 定义1.2 优缺点 二 **功能测试概述**2.1 定义2.2 优缺点 三 **主要区别**四 两者在测试点的区别4.1 **接口测试的测试点**4.2 **功能测试的测试点**4.3 **接口测试 vs. 功能测试的测试点对比** 五 区别类比**例子背景**&#…...
人工智能中的线性代数基础详解
线性代数是人工智能领域的重要数学基础之一,是人工智能技术的底层数学支柱,它为数据表示、模型构建和算法优化提供了核心工具。其核心概念与算法应用贯穿数据表示、模型训练及优化全过程。更多内容可看我文章:人工智能数学基础详解与拓展-CSDN博客 一、基本介绍 …...
nginx不在默认的yum仓库的解决方法
1、添加 Nginx 官方仓库 epel-release 是 Extra Packages for Enterprise Linux 的仓库,包含了 nginx 等常用软件。 sudo yum install -y epel-release sudo yum install -y nginx 2、手动添加 Nginx 仓库 如果 epel-release 不可用,可以手动添加 Ng…...
IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力
在现代工业生产和物流领域,物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时,常常存在适应性差、抓取不稳定、操作复杂等问题,导致生产流程中频繁出现停机调整,增加了人工干预成…...
【uni-app运行错误】SassError: expected selector @import “@/uni.scss“;
ERROR in ./src/pages/biddingViews/address_add.vue?vue&typestyle&index0&id41672bf3&scopedtrue&langscss& (./node_modules/vue/cli-service/node_modules/css-loader/dist/cjs.js??clonedRuleSet-22[0].rules[0].use[1]!./node_modules/dcloud…...
堆排序:力扣215.数组中的第K个大元素
一、问题描述 在一个整数数组 nums 中,需要找出第 k 个最大的元素。这里要注意,我们要找的是数组排序后的第 k 个最大元素,而不是第 k 个不同的元素。例如,对于数组 [3,2,1,5,6,4],当 k 2 时,第 2 个最大…...
【网络协议】应用层协议HTTPS
文章目录 为什么引入HTTPS?基本概念加密的基本过程对称加密非对称加密中间人攻击证书 为什么引入HTTPS? 由于HTTP协议在网络传输中是明文传输的,那么当传输一些机密的文件或着对钱的操作时,就会有泄密的风险,从而引入…...
网络安全防护总体架构 网络安全防护工作机制
1 实践内容 1.1 安全防范 为了保障"信息安全金三角"的CIA属性、即机密性、完整性、可用性,信息安全领域提出了一系列安全模型。其中动态可适应网络安全模型基于闭环控制理论,典型的有PDR和P^2DR模型。 1.1.1 PDR模型 信息系统的防御机制能…...
图像处理篇---图像预处理
文章目录 前言一、通用目的1.1 数据标准化目的实现 1.2 噪声抑制目的实现高斯滤波中值滤波双边滤波 1.3 尺寸统一化目的实现 1.4 数据增强目的实现 1.5 特征增强目的实现:边缘检测直方图均衡化锐化 二、分领域预处理2.1 传统机器学习(如SVM、随机森林&am…...
探针泄露(WEB)
##解题思路 题目提示是探针泄露,未及时删除的探针可能造成严重的数据泄露 探针的文件常见命名为tz.php,访问它 对于php相关参数,我们是可以点击的,点击phpinfo访问 跳转后搜索flag,得到flag...
Webpack总结
Webpack是一个前端模块打包工具。它可以将多个模块按照依赖关系进行静态分析,并生成一个或多个打包后的文件。 Webpack的核心概念包括entry(入口)、output(输出)、loader(加载器)和plugin&…...
什么是物理信息神经网络PINN
定义原理 物理信息神经网络(PINN)是一种创新的机器学习方法,将深度学习与物理知识相结合,旨在解决偏微分方程(PDE)相关问题。PINN的核心思想是在神经网络的训练过程中引入物理定律,从而提高模型的泛化能力和预测精度。 PINN的工作原理基于以下关键步骤: 构建神经网络…...
Java面向对象(中)
面向对象(中) 1.继承性 继承性的好处: 减少了代码的冗余,提高了代码的复用性。 便于功能的拓展。 为多态性的使用提供了前期。 格式: class A extends B {} A:子类,派生类,subclass。 B:父类&#x…...
ospf单区域
OSPF单区域是指将整个自治系统(AS)内的所有路由器划分到同一个逻辑区域(Area 0,即骨干区域)中运行的OSPF协议模式。以下是其核心要点: 一、定义与核心特点 区域统一性 所有路由器均属于同一区域&…...
kali之nmap
kali之nmap Nmap(Network Mapper)是 Kali Linux 中最著名的网络扫描工具之一,广泛用于网络发现、端口扫描、服务识别、操作系统检测等任务。它是一个功能强大且灵活的开源工具,适用于渗透测试、网络管理和安全审计。 1. Nmap 的主…...
【Rust基础】排序和分组
排序 简单排序 整数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //✔assert_eq!(list, vec![1, 2, 3, 4, 5]); }小数排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//❌ 不能直接使用sort,因为f32和f64未实现O…...
HarmonyOS NEXT开发实战——HUAWEI DevEco Studio 开发指南
概述 HUAWEI DevEco Studio(以下简称 DevEco Studio)是基于 IntelliJ IDEA Community 开源版本打造的一站式开发平台,专为 HarmonyOS 系统上的应用和元服务(以下简称 应用/元服务)提供高效的开发环境。 作为一款专业…...
R 语言科研绘图 --- 密度图-汇总
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
【拒绝算法PUA】LeetCode 2270. 分割数组的方案数
系列文章目录 【拒绝算法PUA】0x00-位运算 【拒绝算法PUA】0x01- 区间比较技巧 【拒绝算法PUA】0x02- 区间合并技巧 【拒绝算法PUA】0x03 - LeetCode 排序类型刷题 【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中 C刷题技巧总结: [温习C/C]0x04 刷…...
k8s 配置两个deployment主机级别互斥部署
在 Kubernetes 中,要实现两个 Deployment 的 Pod 在主机级别互斥部署,可以使用 podAntiAffinity 配置。通过设置 podAntiAffinity,可以确保两个 Deployment 的 Pod 不会被调度到同一节点上。 实现步骤 定义 Deployment: 为每个…...
Axure大屏可视化原型模板及素材:数据可视化的高效解决方案
数据可视化已成为企业决策、运营分析、市场洞察的重要工具。数据可视化大屏,作为数据展示和交互的直观平台,能够实时呈现关键数据,帮助企业快速做出决策。Axure作为原型设计领域的领先工具,以其丰富的组件库、强大的交互设计能力和…...
AGI大模型(2):GPT:Generative Pre-trained Transformer
1 Generative Pre-trained Transformer 1.1 Generative生成式 GPT中的“生成式”指的是该模型能够根据输入自动生成文本内容,而不仅仅是从已有的文本库中检索答案。 具体来说: 生成(Generative):GPT是一个生成式AI模型,能够根据给定的提示(Prompt)动态生成连贯、…...
Profinet转Profinet以创新网关模块为核心搭建西门子和欧姆龙PLC稳定通讯架构案例
你是否有听过PROFINET主站与PROFINET主站之间需要做数据通讯有需求? 例如西门子1500与霍尼韦尔DCS系统两个主站之间的通讯。应用于PROFINET为主站设备还有欧姆龙、基恩士、罗克韦尔、施耐德、GE、ABB等品牌的PLC或DCS、FCS等平台。在生产或智能领域有通讯需求。两头…...
函数调用汇编
目录 一、核心概念 二、函数调用过程(以 x86 cdecl 为例) 三、x86 vs x64 区别 四、示例分析(C代码 → 汇编) 五、常见问题 一、核心概念 调用约定 (Calling Convention) 规定参数传递顺序(如 cdecl 是右到左&…...
LabVIEW 线性拟合
该 LabVIEW 程序实现了 线性拟合(Linear Fit),用于计算给定一组数据点的斜率(Slope)和截距(Intercept),并将结果可视化于 XY Graph 中。本案例适用于数据拟合、实验数据分析、传感器…...
在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤
以下是为客户在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤: 硬件准备: 70b 模型对硬件要求较高,确保办公电脑有足够强大的 GPU(例如 NVIDIA A100 等高端 GPU,因为模型规模较大,普通…...
国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)
1 脚本 1.1 应用场景 脚本是一种功能扩展代码,用于提供一些编辑器通用功能提供不了的功能,帮助用户在特定工作场景下提高工作效率,几乎所有主流的编辑器、IDE都支持脚本。 EverEdit的脚本支持js(语法与javascript类似)、VBScript两种编程…...
网络安全需要学多久才能入门?
网络安全是一个复杂且不断发展的领域,想要入行该领域,我们需要付出足够多的时间和精力好好学习相关知识,才可以获得一份不错的工作,那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…...
H5端vue3 SSR 项目报错小计
H5端vue3 SSR 项目报错小计 环境 "vue-router": "^4.1.6" "vue": "^3.2.45", "vant": "^3.4.9",报错复现 ①.页面刷新点击 RouterLink 跳转链接, 页面无法跳转 问题排查 ①.去除 van-popup 使用的 teleport“…...
【Node.js入门笔记4---fs 目录操作】
Node.js入门笔记4 Node.js---fs 目录操作一、目录操作1.fs.mkdir():创建目录。异步,非阻塞。创建单个目录创建多个目录创建目前之前需要确认是否存在: 2. fs.mkdirSync():用于创建一个新的目录。异步,非阻塞。3.fs.rmd…...
xcode 旧版本、历史版本下载
下载链接:https://developer.apple.com/download/all/ 版本发布日志:https://developer.apple.com/documentation/xcode-release-notes 需要登录开发者账号,搜索下载即可: 再贴一下网友做的版本统计macOS 版本对应的 Xcode 版本&…...
(十一) 人工智能 - Python 教程 - Python元组
更多系列教程,每天更新 更多教程关注:xxxueba.com 星星学霸 1 元组(Tuple) 元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。 实例 创建元组: thistuple ("apple", "b…...
【计算机视觉】工业表计读数(1)--基于关键点检测的读数识别方案
随着工业自动化和智能制造的发展,对设备状态实时监控和数据采集提出了更高要求。本文提出了一种基于YOLO的工业表计读数识别方法,通过首先利用YOLO进行表计目标检测,提取出单独的表计图像,然后分别对表针和刻度进行关键点检测&…...