当前位置: 首页 > news >正文

vue3 实现音频转文字组件

使用recorder-core第三方插件实现音频转纯文本的功能。

工具类文件
recoder.ts

import Recorder from 'recorder-core'
import 'recorder-core/src/engine/wav'
import 'recorder-core/src/extensions/lib.fft.js'
import 'recorder-core/src/extensions/frequency.histogram.view'
interface RecorderConfig {onProcess?: Promise<any> | Function[keyname: string]: any
}
interface FrequencyHistogramViewConfig {[keyname: string]: any
}
let recorderInstance: any = null
export const RecorderContructor = Recorder
export const createRecorder = (config?: RecorderConfig) => {if (recorderInstance) {return recorderInstance}recorderInstance = Recorder({type: 'wav', // 录音格式,可以换成wav等其他格式sampleRate: 16000, // 录音的采样率,越大细节越丰富越细腻bitRate: 16, // 录音的比特率,越大音质越好...(config || {})// onProcess: (buffers, powerLevel, bufferDuration, bufferSampleRate, newBufferIdx, asyncEnd) => {//   // 录音实时回调,大约1秒调用12次本回调//   // 可实时绘制波形,实时上传(发送)数据//   if (this.wave) {//     this.wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate)//   }// }})return recorderInstance
}
export const destoryRecorder = () => {if (recorderInstance) {recorderInstance.close()recorderInstance = nullRecorder.Destroy()}
}
export const createRecorderWithWaveView = (el: HTMLElement, config?: FrequencyHistogramViewConfig) => {return Recorder.FrequencyHistogramView({elem: el,lineCount: 30,position: 0,minHeight: 1,fallDuration: 400,stripeEnable: false,mirrorEnable: true,linear: [0, '#fff', 1, '#fff'],...(config || {})})
}

组件文案
AudioInput.vue

<template><div v-if="visibleModal" class="custom-Modal-container"><Teleport to="body"><div class="modal_box" ref="modalRef"><div class="modal_mask" @click.stop="closeModal"></div><div class="modal_content"><div class="audio_box"><div class="audio_header"><span class="audio_title_text"><span v-if="audioStatus == 'input'">收音中</span><span v-else-if="audioStatus == 'transform' || audioStatus == 'end'">识别中</span><span v-else-if="audioStatus == 'unknown'">停止收音</span>...</span><svg-icon class="close_icon" iconFileName="关闭" /></div><div class="audio_content"><div class="input_content_box"><div class="input_content"><span v-if="audioStatus == 'input'">请说,我在聆听…</span><span v-else-if="audioStatus == 'transform' || audioStatus == 'end'">{{ audioContentText }}</span><span class="unknow_tip_text" v-else-if="audioStatus == 'unknown'">未能识别,请点击图标重试</span></div><div v-if="audioStatus == 'input'" class="input_tip_text">您可以说出您需要搜索的内容关键词</div><div v-if="audioStatus == 'unknown'" class="input_tip_text">说出您需要搜索的内容关键词</div></div><div class="audio_icon_box" :class="audioStatus"><i v-if="audioStatus == 'unknown'" class="img_box input_audio" @click="reStartRecorderHandle"></i><i v-if="audioStatus == 'end'" class="img_box input_audio" @click="confirmSearchHandle"></i><i v-if="audioStatus == 'input'" class="img_box input_audio" @click="finishRecorderHandle"></i><i v-if="audioStatus == 'transform'" class="img_box input_audio" @click="closeModal"></i></div><div ref="recorderWaveRef" class=""></div></div></div></div></div></Teleport></div>
</template>
<script setup lang="ts">
import { onMounted, onUnmounted, ref, watch } from 'vue'
import { v4 as uuidv4 } from 'uuid'
// 语音输入工具
import { createRecorder, createRecorderWithWaveView, destoryRecorder } from './recorder'// api
import { getVoiceToText } from '@/services/common'// type interface
type AudioInputStatus = 'ready' | 'input' | 'transform' | 'end' | 'unknown'const visibleModal = defineModel<boolean>()
const emit = defineEmits(['close', 'complete'])const audioStatus = ref<AudioInputStatus>('ready')
const modalRef = ref<any>(null)
const audioContentBlobData = ref<string>('')
const audioContentText = ref<string>('')
// recorder
const recorderIntance = ref<any>(null)
const recorderWaveInstance = ref<any>(null)
const recorderWaveRef = ref<any>(null)
const isLoadingRecorder = ref<boolean>(false)/** *************** method ************** **/
const initRecorder = () => {recorderIntance.value = createRecorder({onProcess: (buffers: any[], powerLevel: any, bufferDuration, bufferSampleRate: any, newBufferIdx, asyncEnd) => {// 录音实时回调,大约1秒调用12次本回调// 可实时绘制波形,实时上传(发送)数据if (recorderWaveInstance.value) {recorderWaveInstance.value.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate)}}})
}
// 开始录音
const startRecorder = async () => {audioStatus.value = 'input'audioContentBlobData.value = ''audioContentText.value = ''isLoadingRecorder.value = trueawait new Promise((resolve, reject) => {recorderIntance.value.open(async () => {console.log('录音已打开')resolve(true)},(msg: string, isUserNotAllow: boolean) => {console.error('打开录音出错:' + msg, 'isUserNotAllow: ', isUserNotAllow)reject(false)})})try {if (recorderWaveRef.value) {// 创建音频可视化图形绘制对象recorderWaveInstance.value = createRecorderWithWaveView(recorderWaveRef.value)}} catch (err) {console.error('音频可视化图形绘制出错', err)}try {console.log('尝试录音打开')isLoadingRecorder.value = falseawait recorderIntance.value.start()console.log('录音已打开')} catch {console.error('打开录音出错')audioStatus.value = 'unknown'} finally {isLoadingRecorder.value = false}
}
// 结束录音
const stopRecorderHandle = async () => {audioStatus.value = 'transform'try {console.log('尝试终止录音')const { blob, duration } = await new Promise((resolve, reject) => {recorderIntance.value.stop((blob: any, duration: any) => {resolve({ blob, duration })},err => {console.error('终止录音出错:' + err)recorderIntance.value.close()reject({ error: true, msg: err })})})// 简单利用URL生成本地文件地址,此地址只能本地使用,比如赋值给audio.src进行播放,赋值给a.href然后a.click()进行下载(a需提供download="xxx.mp3"属性)// this.localUrl = URL.createObjectURL(blob)// console.log('录音成功blob', blob)// console.log('localUrl', this.localUrl)console.log('时长:' + duration + 'ms')await recorderIntance.value.close()audioContentBlobData.value = blob} catch {audioStatus.value = 'input'}
}// 重置输入
const reStartRecorderHandle = async () => {if (isLoadingRecorder.value) returnisLoadingRecorder.value = falseawait stopRecorderHandle().catch(err => err)await startRecorder()
}
// 完成录音
const finishRecorderHandle = async () => {if (isLoadingRecorder.value) returnisLoadingRecorder.value = truetry {await stopRecorderHandle()// 获取语音转文本并返回文案await fetchVoiceToText()audioStatus.value = 'end'} catch {audioStatus.value = 'unknown'} finally {isLoadingRecorder.value = false}
}
// 把录音转成文本
const fetchVoiceToText = async () => {const voice_data = audioContentBlobData.valueconst formData = new FormData()formData.append('voice_data', voice_data)formData.append('seq', 0)formData.append('end', 1)formData.append('voice_id', uuidv4())formData.append('voice_format', 12)const { code, data } = await getVoiceToText(formData)if (code === 200) {console.log(data)const { text } = dataaudioContentText.value = text}
}
const confirmSearchHandle = () => {const text = audioContentText.valueemit('complete', text)audioStatus.value = 'ready'visibleModal.value = falseaudioContentBlobData.value = ''audioContentText.value = ''
}
const closeModal = async () => {await stopRecorderHandle()audioStatus.value = 'ready'visibleModal.value = falseaudioContentBlobData.value = ''audioContentText.value = ''emit('close')
}
/** ***************** watch ************** **/
watch(visibleModal, async val => {if (val) {await startRecorder()}
})
/** *******************    life cycle ******************* **/
onMounted(() => {initRecorder()
})
onUnmounted(() => {recorderIntance.value = nulldestoryRecorder()
})
/**  ************** component expose *********** **/
defineExpose({closeModal,visibleModal
})
</script>
<style lang="scss" scoped>
.modal_box {position: fixed;width: 100%;left: 0;top: 0;right: 0;bottom: 0;z-index: 2000;
}
.modal_mask {position: absolute;left: 0;bottom: 0;width: 100%;height: 100%;background: rgba(0, 0, 0, 0.5);
}
.modal_content {position: absolute;bottom: 32px;z-index: 1;left: 0;right: 0;padding: 0 12px;box-sizing: border-box;* {box-sizing: border-box;}.audio_box {border-radius: 10px;position: relative;width: auto;background-image: linear-gradient(91deg, #7d79ff 9%, #43e1ff 93%);.audio_header {height: 44px;border-radius: 10px 10px 0 0;color: #ffffff;font-size: 14px;font-weight: bold;display: flex;align-items: center;justify-content: space-between;padding-left: 22px;padding-right: 18px;}.close_icon {width: 12px;height: 12px;}}.audio_content {height: 248px;padding: 24px;border-radius: 10px;background-color: #ffffff;}.input_content_box {height: 64px;text-align: center;overflow-y: auto;}.input_content {text-align: center;font-size: 16px;color: $color-text;font-weight: bold;line-height: 22px;}.unknow_tip_text {color: $color-danger;}.input_tip_text {margin-top: 10px;font-size: 12px;line-height: 17px;color: $color-text-light-3;text-align: center;}.audio_icon_box {display: flex;align-items: center;justify-content: center;.img_box {width: 138px;height: 138px;display: block;&.input_audio {background: url('@/assets/images/audio_input_icon.png') no-repeat center center;}}}
}
</style>

相关文章:

vue3 实现音频转文字组件

使用recorder-core第三方插件实现音频转纯文本的功能。 工具类文件 recoder.ts import Recorder from recorder-core import recorder-core/src/engine/wav import recorder-core/src/extensions/lib.fft.js import recorder-core/src/extensions/frequency.histogram.view i…...

MySQL各种锁详解

什么是锁&#xff1f; 1.1 锁的解释 计算机协调多个进程或线程并发访问某一资源的机制。 1.2 锁的重要性 在数据库中&#xff0c;除传统计算资源&#xff08;CPU、RAM、I/O等&#xff09;的争抢&#xff0c;数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性&…...

前端工程 Node 版本如何选择

1. Node 与 Npm 版本对应 这是一个必知必会的问题&#xff0c;尤其是对于维护那些老掉牙、一坨坨、非常大的有着长期历史的老破大工程。 1.1. package-lock.json 版本 首先你要会看项目的 package-lock.json 文件中的 lockfileVersion 版本号&#xff0c;这对于 NPM 安装来说…...

新增白名单赋予应用安装权限

目录 相关问题 具体实现 相关问题 安装app到/data/分区时&#xff0c;如何在安装阶段就赋予权限&#xff0c;无需请求权限 具体实现 frameworks/base/core/res/res/values/config.xml <!-- For whitelis apk --><string-array translatable"false" nam…...

学习Python的笔记14--迭代器和生成器

1.迭代器&#xff08;Iterator&#xff09; 概念&#xff1a; 迭代意味着重复多次&#xff0c;就像循环一样。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。 迭代器只能往前不会后退。 1.iter…...

【Golang】Golang基础语法之面向对象:结构体和方法

面向对象——结构 Go 仅支持封装&#xff0c;不支持继承和多态&#xff1b;继承和多态要做的事情交给接口来完成&#xff0c;即——面向接口编程。Go 只有 struct&#xff0c;没有 class。 定义一个最简单的树节点&#xff08;treeNode&#xff09;结构&#xff0c;方法如下&…...

重磅升级:OpenAI o1模型上手实测,从芯片架构分析到象棋残局判断的全能表现

引言 昨日&#xff0c;在圣诞节系列发布会的第一天&#xff0c;OpenAI终于给我们带来了令人振奋的更新&#xff0c;这些更新有望塑造AI互动的未来。备受期待的OpenAI o1正式版的推出&#xff0c;标志着ChatGPT体验的重大进化&#xff0c;宣告了AI驱动应用新时代的开始。o1现已可…...

Pandas处理和分析嵌套JSON数据:从字符串到结构化DataFrame

在数据分析领域&#xff0c;我们经常遇到需要从非结构化数据中提取有用信息的场景。特别是当数据以JSON字符串的形式出现时&#xff0c;如何有效地将其转换为结构化的表格形式&#xff0c;以便进行进一步的分析和处理&#xff0c;成为了一个常见的挑战。本文将通过一个具体的例…...

《ODIN: A Single Model for 2D and 3D Segmentation》CVPR2024

斯坦福和微软&#xff1a; 代码链接&#xff1a;ODIN: A Single Model For 2D and 3D Perception 论文链接&#xff1a;2401.02416 摘要 这篇论文介绍了ODIN&#xff08;Omni-Dimensional INstance segmentation&#xff09;&#xff0c;一个能够同时处理2D RGB图像和3D点云…...

第40节 在ArkTS中实现socket功能

1. 基本概念 在 ArkTS 中实现 Socket 功能主要涉及到网络通信中的套接字&#xff08;Socket&#xff09;编程。Socket 是一种用于在不同设备&#xff08;如客户端和服务器&#xff09;之间进行双向通信的接口&#xff0c;它允许应用程序发送和接收数据。在网络编程中&#xf…...

Ruby On Rails 笔记1——Rails 入门

突然想跟着官方文档把Ruby On Rails过一遍&#xff0c;把一些有用的记下来就可以一直看了&#xff0c;do它! https://guides.rubyonrails.org/v7.2/ 注&#xff1a;官网是英文文档&#xff0c;我自己翻译了一下&#xff0c;不确保完全准确&#xff0c;只供自己学习开发使用。 …...

npm, yarn, pnpm之间的区别

前言 在现代化的开发中&#xff0c;一个人可能同时开发多个项目&#xff0c;安装的项目越来越多&#xff0c;所随之安装的依赖包也越来越臃肿&#xff0c;而且有时候所安装的速度也很慢&#xff0c;甚至会安装失败。 因此我们就需要去了解一下&#xff0c;我们的包管理器&#…...

Uniapp的App环境下使用Map获取缩放比例

概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…...

[免费]基于Python的Django在线(生鲜)商城(电子商城)管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的Django在线(生鲜)商城(电子商城)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的Django在线(生鲜)商城(电子商城)管理系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随…...

Go 1.19.4 HTTP编程-Day 20

1. HTTP协议 1.1 基本介绍 HTTP协议又称超文本传输协议&#xff0c;属于应用层协议&#xff0c;在传输层使用TCP协议。HTTP协议属是无状态的&#xff0c;对事务处理没有记忆能力&#xff0c;如果需要保存状态需要引用其他技术&#xff0c;如Cookie。HTTP协议属是无连接的&…...

基于微软云第一个大模型程序Java和python实现

1 注册一个微软云账号 按照提示一步一步注册&#xff0c;注册过程中&#xff0c;注册微软云账号需要visa卡。可以在某宝花钱30元买下。 2 部署模型 搜索openAI 创建资源组 部署一个模型 这个后面代码会使用 3 Java 实现 pom 依赖 <dependency><groupId>com…...

【5G】5G目标和标准化 5G targets and standardization

5G标准是在第三代合作伙伴关系项目&#xff08;3GPP&#xff0c;3rd Generation Partnership Project&#xff09;中定义的&#xff0c;实际的标准制定工作由参与3GPP活动的区域标准机构成员共同推进。目前&#xff0c;超过600家公司通过各自的地区标准组织成为3GPP的成员。然而…...

KernelShark在ubuntu24.04.01的编译

KernelShark在ubuntu24.04.01的编译 写在前面具体过程装ubuntu24.04.01安装depends下载代码如何编译cmake 输出make 输出 如何安装 初步启动Add the User to the perf Group 简单的使用trace-cmd抓包 来看我的文章&#xff0c;必有所得。 平凡中&#xff0c;总有我帮您踩过的坑…...

【Flutter】WillPopScope组件-监听物理返回键事件自定义返回事件

WillPopScope(onWillPop: () async {if ( flutterWebViewPlugin ! null && await flutterWebViewPlugin.canGoBack() true) {flutterWebViewPlugin!.goBack();return false; // 阻止默认的返回行为} else {return true; // 允许默认的返回行为}},child: Scaffold(),);…...

深度学习每周学习总结J8(Inception V1 算法实战与解析 - 猴痘识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结Inception V1 简介1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&am…...

Django模板系统

1.常用语法 Django模板中只需要记两种特殊符号&#xff1a; {{ }}和 {% %} {{ }}表示变量&#xff0c;在模板渲染的时候替换成值&#xff0c;{% %}表示逻辑相关的操作。 2.变量 {{ 变量名 }} 变量名由字母数字和下划线组成。 点&#xff08;.&#xff09;在模板语言中有…...

【JavaWeb后端学习笔记】MySQL的数据操作语言(Data Manipulation Language,DML)

MySQL DML 0、准备表结构1、添加数据1.1 指定字段添加数据&#xff08;单条&#xff09;1.2 全部字段添加数据&#xff08;单条&#xff09;1.3 指定字段添加数据&#xff08;批量&#xff09;1.4 全部字段添加数据&#xff08;批量&#xff09; 2、修改数据3、删除数据 MySQL的…...

【SpringBoot】Day10-09 动态SQL-XML文件

动态SQL-XML文件的三点规范 1.XML映射文件的名称与Mapper接口名称保持一致&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下&#xff08;同包同名&#xff09;- 在项目开发当中&#xff0c;一般都是一个接口对应一份儿映射配置文件&#xff1b; 2.XML映射文件的namesp…...

Linux絮絮叨(三) Ubuntu桌面版添加中文拼音输入法

步骤很详细&#xff0c;直接上教程 一. 配置安装简体拼音输入法 #安装相应的平台支持包 sudo apt install ibus-gtk ibus-gtk3# 安装简体拼音输入法 sudo apt install ibus-pinyin安装完成如果下面的步骤找不到对应输入法可以重启一下&#xff0c;一般不需要 二. 添加简体拼音…...

rockit 学习、开发笔记(六)(VENC)

前言 上节我们讲到了VDEC解码模块&#xff0c;那当然少不了VENC编码模块了&#xff0c;一般有编解码的需求都是为了压缩视频的大小&#xff0c;方便减少传输所占用的带宽。 概述 VENC 模块&#xff0c;即视频编码模块。本模块支持多路实时编码&#xff0c;且每路编码独立&am…...

Python+Django框架山东济南景点数据可视化系统网站作品截图和开题报告参考

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…...

【C#】键值对的一种常见数据结构Dictionary<TKey, TValue>

在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个 键值对&#xff08;key-value&#xff09;集合&#xff0c;是一种非常常见的数据结构。它允许通过 键&#xff08;key&#xff09;来快速查找与之相关的 值&#xff08;value&#xff09;。你可以将其类比为一个映射…...

SQL Server:调用的目标发生了异常。(mscorlib)

我之前安装的SQL Server是2014版本&#xff0c;SSMS运行也很流畅&#xff0c;有一次有个同事让我链接云服务器SQL地址&#xff0c;直接报上图的错误&#xff0c;把我弄的一愣一愣的。 后面才发现&#xff0c;这是版本太低导致的&#xff0c;但是你如果使用Navicat是没有问题的…...

windows 上ffmpeg编译好的版本选择

1. Gyan.dev Gyan.dev 是一个广受信赖的 FFmpeg 预编译库提供者&#xff0c;提供多种版本的 FFmpeg&#xff0c;包括静态和动态链接版本。 下载链接: https://www.gyan.dev/ffmpeg/builds/ 特点&#xff1a; 提供最新稳定版和开发版。 支持静态和共享&#xff08;动态&…...

前端工程化面试题(一)

如何使用 Docker 部署前端项目&#xff1f; 使用 Docker 部署前端项目通常涉及以下几个步骤&#xff1a; 创建项目&#xff1a;首先&#xff0c;需要在本地创建并配置好前端项目。 准备 Docker 文件&#xff1a; .dockerignore&#xff1a;这个文件用于排除不需要上传到 Dock…...

Java设计模式笔记(二)

十四、模版方法模式 1、介绍 1&#xff09;模板方法模式(Template Method Pattern)&#xff0c;又叫模板模式(Template Patern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 2&…...

vscode(一)安装(ubuntu20.04)

1、更新软件包列表 sudo apt update2、安装依赖包 sudo apt install software-properties-common apt-transport-https wget3、导入Microsoft GPG密钥 wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -4、向系统添加VSCode存储库 sudo…...

C# 命名空间(Namespace)

文章目录 前言一、命名空间的定义与使用基础&#xff08;一&#xff09;定义语法与规则&#xff08;二&#xff09;调用命名空间内元素 二、using 关键字三、嵌套命名空间 前言 命名空间&#xff08;Namespace&#xff09;在于提供一种清晰、高效的方式&#xff0c;将一组名称与…...

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#…...

Flutter开发App,编译条件下UI没问题,打包后UI出现问题

刚入门Flutter3个月&#xff0c;终于进入项目打包阶段&#xff0c;发现之前编译环境下都正常的UI&#xff0c;忽然有小部分出现异常&#xff0c;不显示UI部分了。查了2个小时都没发现原因。因为编译环境下&#xff0c;Android、iOS端都正常显示。但是进入打包安装后&#xff0c…...

Python+OpenCV系列:Python和OpenCV的结合和发展

PythonOpenCV系列&#xff1a;Python和OpenCV的结合和发展 **引言****Python语言的发展****1.1 Python的诞生与发展****1.2 Python的核心特性与优势****1.3 Python的应用领域** **OpenCV的发展****2.1 OpenCV的起源与发展****2.2 OpenCV的功能特性****2.3 OpenCV的应用场景** *…...

报错 JSON.parse: expected property name or ‘}‘,JSON数据中对象的key值不为字符串

报错 JSON.parse: expected property name or ‘}’ 原因 多是因为数据转换时出错&#xff0c;可能是存在单引号或者对象key值不为string导致 这里记录下我遇见的问题&#xff08;后端给的JSON数据里&#xff0c;对象key值不为string&#xff09; 现在后端转换JSON数据大多…...

Flutter:商品多规格内容总结,响应式数据,高亮切换显示。

如图所示&#xff1a; 代码为练习时写的项目&#xff0c;写的一般&#xff0c;功能实现了&#xff0c;等以后再来优化。 自己模拟的数据结构 var data {id:1,name:精品小米等多种五谷杂粮精品小等多种五谷杂粮,logo:https://cdn.uviewui.com/uview/swiper/1.jpg,price:100.5…...

WPF+LibVLC开发播放器-LibVLC播放控制

接上一篇&#xff1a; LibVLC在C#中的使用 实现LibVLC播放器播放控制 界面 界面上添加一个Button按钮用于控制播放 <ButtonGrid.Row"1"Width"88"Height"24"Margin"10,0,0,0"HorizontalAlignment"Left"VerticalAlignme…...

Mac环境下brew安装LNMP

安装不同版本PHP 在Mac环境下同时运行多个版本的PHP&#xff0c;同Linux环境一样&#xff0c;都是将后台运行的php-fpm设置为不同的端口号&#xff0c;下面将已php7.2 和 php7.4为例 添加 tap 目的&#xff1a;homebrew仅保留最近的php版本&#xff0c;可能没有你需要的版本…...

nodejs后端项目使用pm2部署

nodejs后端项目使用pm2部署 安装pm2 npm install pm2 -g查看版本号 pm2 --version启动项目 pm2 start app.js# 设置别名 pm2 start app.js --name demo停止项目 pm2 stop [AppName] pm2 stop [ID]# 停止所有项目 pm2 stop all重启项目 pm2 restart [AppName] pm2 re…...

【C++】深入理解字符变量取地址的特殊性与内存管理机制详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;栈内存中的变量分配&#xff1a;谁先谁后&#xff1f;cout 的输出行为&#xff1a;按顺序执行&#xff0c;按地址递增读取代码执行顺序与内存布局的关系编译器优化的影响 &…...

【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏&#xff…...

蓝桥杯软件赛系列---lesson1

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们今天会再开一个系列&#xff0c;那就是蓝桥杯系列&#xff0c;我们会从最基础的开始讲起&#xff0c;大家想要备战明年蓝桥杯的&#xff0c;让我们一起加油。 工具安装 DevC…...

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...

HeidiSQL:MySQL图形化管理工具深度解析

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;HeidiSQL是一款开源的MySQL图形化管理工具&#xff0c;适用于多种数据库系统&#xff0c;如MySQL、MariaDB、SQL Server、PostgreSQL和SQLite。其提供的直观操作界面和丰富的功能简化了数据库操作&#xff0c;包…...

【Redis】深入解析Redis缓存机制:全面掌握缓存更新、穿透、雪崩与击穿的终极指南

文章目录 一、Redis缓存机制概述1.1 Redis缓存的基本原理1.2 常见的Redis缓存应用场景 二、缓存更新机制2.1 缓存更新的策略2.2 示例代码&#xff1a;主动更新缓存 三、缓存穿透3.1 缓存穿透的原因3.2 缓解缓存穿透的方法3.3 示例代码&#xff1a;使用布隆过滤器 四、缓存雪崩4…...

Flask使用Celery与多进程管理:优雅处理长时间任务与子进程终止技巧(multiprocessing)(subprocess)

在许多任务处理系统中&#xff0c;我们需要使用异步任务队列来处理繁重的计算或长时间运行的任务&#xff0c;如模型训练。Celery是一个广泛使用的分布式任务队列&#xff0c;而在某些任务中&#xff0c;尤其是涉及到调用独立脚本的场景中&#xff0c;我们需要混合使用multipro…...

【PyTorch】torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

报错说明 torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 报错如图所示 报错分析 该报错是 torch 和 CUDA 版本不兼容导致。 &#xff08;一般N卡自带的CUDA版本与最新的torch版本相差较大&#xff09; 解决方案 1.查看自己的CUDA版本 # 查看自己的…...

使用android studio写一个Android的远程通信软件(APP),有通讯的发送和接收消息界面

以下是使用 Android Studio 基于 Java 语言编写一个简单的 Android APP 实现远程通信&#xff08;这里以 TCP 通信为例&#xff09;的代码示例&#xff0c;包含基本的通信界面以及发送和接收消息功能。 1. 创建项目 打开 Android Studio&#xff0c;新建一个 Empty Activity …...