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

Gradio全解20——Streaming:流式传输的多媒体应用(2)——构建对话式聊天机器人

Gradio全解20——Streaming:流式传输的多媒体应用(2)——构建对话式聊天机器人

  • 本篇摘要
  • 20. Streaming:流式传输的多媒体应用
    • 20.2 构建对话式聊天机器人
      • 20.2.1 应用概述
      • 20.2.2 记录用户音频
      • 20.2.3 存储音频并生成响应
      • 20.2.4 构建Gradio应用
    • 参考文献:

本章目录如下:

  1. 《Gradio全解20——Streaming:流式传输的多媒体应用(1)——流式传输音频:魔力8号球》;
  2. 《Gradio全解20——Streaming:流式传输的多媒体应用(2)——构建对话式聊天机器人》;
  3. 《Gradio全解20——Streaming:流式传输的多媒体应用(3)——实时语音识别技术》;
  4. 《Gradio全解20——Streaming:流式传输的多媒体应用(4)——基于Groq的带自动语音检测功能的多模态Gradio应用》;
  5. 《Gradio全解20——Streaming:流式传输的多媒体应用(5)——基于WebRTC的摄像头实时目标检测》;
  6. 《Gradio全解20——Streaming:流式传输的多媒体应用(6)——构建视频流目标检测系统》;

本篇摘要

本章讲述流式传输的应用,包括音频、图像和视频格式的流式传输。

20. Streaming:流式传输的多媒体应用

本章讲述流式传输的应用,包括音频、图像和视频格式的流式传输。音频应用包括流式传输音频、构建音频对话式聊天机器人、实时语音识别技术和自动语音检测功能;图像应用包括基于WebRTC的摄像头实时目标检测;视频应用包括构建视频流目标检测系统。

20.2 构建对话式聊天机器人

新一代AI用户界面正朝着原生音频体验发展,用户将能够与聊天机器人对话并接收语音回复。基于这一范式已开发出多个模型,包括GPT-4o和mini omni。本节将以mini omni为例,带读者逐步构建自己的对话式聊天应用。

20.2.1 应用概述

Mini-Omni是一款开源多模态大语言模型,具备边思考边对话的能力;该模型还具有端到端的实时语音输入与流式音频输出对话功能,可实现完整的语音交互体验,其github地址为:https://github.com/gpt-omni/mini-omni。下方可查看使用Mini-Omni的最终应用的演示效果:
在这里插入图片描述

我们的应用将实现以下用户体验:

  1. 用户点击按钮开始录制语音消息;
  2. 应用检测到用户停止说话后自动结束录制;
  3. 用户音频传入mini omni模型,模型会流式返回响应;
  4. mini omni完成应答后重新激活用户麦克风;
  5. 所有对话历史(用户与omni的语音记录)显示在聊天组件中。

其Hugging Face地址为:gradio/omni-mini。下面让我们深入实现细节。

20.2.2 记录用户音频

我们会将用户麦克风的音频流式传输至服务器,并在每个新音频片段到达时判断用户是否已停止说话。以下是我们的process_audio函数:

import numpy as np
from utils import determine_pausedef process_audio(audio: tuple, state: AppState):if state.stream is None:state.stream = audio[1]state.sampling_rate = audio[0]else:state.stream = np.concatenate((state.stream, audio[1]))pause_detected = determine_pause(state.stream, state.sampling_rate, state)state.pause_detected = pause_detectedif state.pause_detected and state.started_talking:return gr.Audio(recording=False), statereturn None, state

该函数接收两个输入参数:当前音频片段(由采样率sampling_rate和音频流numpy数组组成的元组)和当前应用状态。我们将使用以下AppState数据类来管理应用状态:

from dataclasses import dataclass, field@dataclass
class AppState:stream: np.ndarray | None = Nonesampling_rate: int = 0pause_detected: bool = Falsestarted_talking: bool =  Falsestopped: bool = Falseconversation: list = field(default_factory=list)

该函数会将新音频片段与现有音频流拼接,并检测用户是否停止说话。若检测到停顿,则返回停止录制的指令;否则返回None表示无需变更。

determine_pause函数的具体实现属于omni-mini项目特有,源码如下:

def determine_pause(audio: np.ndarray, sampling_rate: int, state: AppState) -> bool:"""Take in the stream, determine if a pause happened"""temp_audio = audiodur_vad, _, time_vad = run_vad(temp_audio, sampling_rate)duration = len(audio) / sampling_rateif dur_vad > 0.5 and not state.started_talking:print("started talking")state.started_talking = Truereturn Falseprint(f"duration_after_vad: {dur_vad:.3f} s, time_vad: {time_vad:.3f} s")return (duration - dur_vad) > 1

20.2.3 存储音频并生成响应

处理完用户音频后,我们需要生成并流式传输聊天机器人的响应。以下是我们的response函数实现:

import io
import tempfile
from pydub import AudioSegmentdef response(state: AppState):if not state.pause_detected and not state.started_talking:return None, AppState()audio_buffer = io.BytesIO()segment = AudioSegment(state.stream.tobytes(),frame_rate=state.sampling_rate,sample_width=state.stream.dtype.itemsize,channels=(1 if len(state.stream.shape) == 1 else state.stream.shape[1]),)segment.export(audio_buffer, format="wav")with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:f.write(audio_buffer.getvalue())state.conversation.append({"role": "user","content": {"path": f.name,"mime_type": "audio/wav"}})output_buffer = b""for mp3_bytes in speaking(audio_buffer.getvalue()):output_buffer += mp3_bytesyield mp3_bytes, statewith tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as f:f.write(output_buffer)state.conversation.append({"role": "assistant","content": {"path": f.name,"mime_type": "audio/mp3"}})yield None, AppState(conversation=state.conversation)

该函数主要完成以下功能:

  1. 将用户音频转换为WAV格式文件;
  2. 将用户消息添加至对话历史记录;
  3. 使用speaking函数生成并流式传输聊天机器人响应;
  4. 将聊天机器人响应保存为MP3文件;
  5. 将聊天机器人响应添加至对话历史记录。

注:speaking函数的具体实现属于omni-mini项目特有,源码如下:

def speaking(audio_bytes: str):base64_encoded = str(base64.b64encode(audio_bytes), encoding="utf-8")files = {"audio": base64_encoded}with requests.post(API_URL, json=files, stream=True) as response:try:for chunk in response.iter_content(chunk_size=OUT_CHUNK):if chunk:# Create an audio segment from the numpy arrayaudio_segment = AudioSegment(chunk,frame_rate=OUT_RATE,sample_width=OUT_SAMPLE_WIDTH,channels=OUT_CHANNELS,)# Export the audio segment to MP3 bytes - use a high bitrate to maximise qualitymp3_io = io.BytesIO()audio_segment.export(mp3_io, format="mp3", bitrate="320k")# Get the MP3 bytesmp3_bytes = mp3_io.getvalue()mp3_io.close()yield mp3_bytesexcept Exception as e:raise gr.Error(f"Error during audio streaming: {e}")

其中API_URL的定义如下:

from huggingface_hub import snapshot_download
from threading import Thread
from server import serverepo_id = "gpt-omni/mini-omni"
snapshot_download(repo_id, local_dir="./checkpoint", revision="main")IP = "0.0.0.0"
PORT = 60808thread = Thread(target=serve, daemon=True)
thread.start()API_URL = "http://0.0.0.0:60808/chat"

可以看到,此处将mini-omni下载到本地并在本地运行,更详细源码请参考omni-mini/app.py

20.2.4 构建Gradio应用

我们使用Gradio的Blocks API构建完整应用,另外,还可以在界面中设置time_limit和stream_every参数。time_limit限制每个用户流的处理时间,默认值为30秒,因此用户无法流式传输超过30秒的音频。stream_every参数控制数据发送到处理函数的频率,默认值为0.5秒。代码如下:

import gradio as grdef start_recording_user(state: AppState):if not state.stopped:return gr.Audio(recording=True)with gr.Blocks() as demo:with gr.Row():with gr.Column():input_audio = gr.Audio(label="Input Audio", sources="microphone", type="numpy")with gr.Column():chatbot = gr.Chatbot(label="Conversation", type="messages")output_audio = gr.Audio(label="Output Audio", streaming=True, autoplay=True)state = gr.State(value=AppState())stream = input_audio.stream(process_audio,[input_audio, state],[input_audio, state],stream_every=0.5,time_limit=30,)respond = input_audio.stop_recording(response,[state],[output_audio, state])respond.then(lambda s: s.conversation, [state], [chatbot])restart = output_audio.stop(start_recording_user,[state],[input_audio])cancel = gr.Button("Stop Conversation", variant="stop")cancel.click(lambda: (AppState(stopped=True), gr.Audio(recording=False)), None,[state, input_audio], cancels=[respond, restart])if __name__ == "__main__":demo.launch()

当前实现创建了一个包含以下组件的用户界面:

  • 音频输入组件 - 用于录制用户语音消息;
  • 聊天组件 - 实时显示对话历史记录;
  • 音频输出组件 - 播放聊天机器人语音响应;
  • 重置按钮 - 终止当前对话并清空状态。

应用以0.5秒为间隔流式处理用户音频片段,经处理后生成响应内容,并动态更新对话历史展示。

总结:本节演示了如何利用Gradio框架与mini omni模型构建对话式聊天机器人应用。该基础架构可灵活扩展,用于开发各类语音交互式聊天演示。另外,开发者可尝试集成不同模型、优化音频处理流程或创新界面设计,打造个性化的对话式AI体验!

参考文献:

  1. Streaming AI Generated Audio
  2. Run Inference on servers
  3. Spaces ZeroGPU: Dynamic GPU Allocation for Spaces

相关文章:

Gradio全解20——Streaming:流式传输的多媒体应用(2)——构建对话式聊天机器人

Gradio全解20——Streaming:流式传输的多媒体应用(2)——构建对话式聊天机器人 本篇摘要20. Streaming:流式传输的多媒体应用20.2 构建对话式聊天机器人20.2.1 应用概述20.2.2 记录用户音频20.2.3 存储音频并生成响应20.2.4 构建G…...

字节暑期实习-网络运维工程师面经

岗位描述 这个是ByteIntern实习,是暑期实习岗位 岗位 一面 先自我介绍 抓项目技术(会进行确认是什么技术) TCP的三次握手和四次挥手 序列号和确认应答号的位置和大小 序列号是随机的吗? 序列号为什么是随机的? …...

多用户远程 Debugger 服务隔离方案技术实践

多用户远程 Debugger 服务隔离方案技术实践 摘要: 针对多用户同时连接远程 Debugger 服务可能导致的断点冲突、调试流程干扰等问题,本文基于主流调试工具(如 Python debugpy、Java JDWP、Node.js Inspector 等),梳理和…...

华为发布全球首个L3商用智驾ADS4.0

2024年10月2024世界智能网联汽车大会上,余承东讲到:“华为ADS 4.0将于2025年推出高速L3级自动驾驶商用及城区L3级自动驾驶试点,希望加快L3级自动驾驶标准的进程,推动L3级自动驾驶技术的普及。” 世界智能网联汽车大会演讲PPT 所以…...

Silo 科学数据工具库安装与使用指南

Silo 科学数据工具库安装与使用指南 Silo 是一个用于科学数据可视化和分析的工具库,由 Lawrence Livermore National Laboratory (LLNL) 开发。以下是 Silo 的安装和使用方法: 安装 Silo Linux 系统安装 从源码安装: wget https://wci.lln…...

vs2019编译occ7.9.0时,出现fatal error C1060: compiler is out of heap space

问题描述 visual studio 2019编译opencascade 7.9.0时,出现编译错误 fatal error C1060: compiler is out of heap space 解决方案 修改vs2019并行编译的线程个数,默认是12个,我改成了4个,问题解决 Tools > Project and Sol…...

Poco C++全面开发指南:网络应用开发

UDP接收器 项目结构 poco_demo/ ├── CMakeLists.txt ├── src/ │ ├── main.cpp │ └── Receiver.cpp └── include/└── Receiver.h创建 Receiver.h #pragma once#include <Poco/Net/DatagramSocket.h> #include <Poco/Net/SocketAddress.h>…...

Spring AOP概念及其实现

一、什么是AOP 全称Aspect Oriented Programming&#xff0c;即面向切面编程&#xff0c;AOP是Spring框架的第二大核心&#xff0c;第一大为IOC。什么是面向切面编程&#xff1f;切面就是指某一类特定的问题&#xff0c;所以AOP也可以称为面向特定方法编程。例如对异常的统一处…...

业务部绩效考核关键指标与数据分析

在业务部的绩效考核中&#xff0c;重点通过销售额、客户关系、财务管理等多个维度来评估团队的工作成果。绩效考核指标&#xff08;KPI&#xff09;不仅帮助公司衡量销售团队的业绩&#xff0c;还能反映出团队在客户管理、财务控制以及市场拓展方面的综合表现。每一个考核指标都…...

线上婚恋相亲小程序源码介绍

​基于ThinkPHP、FastAdmin和UniApp开发的线上婚恋相亲小程序源码&#xff0c;这款小程序源码采用了ThinkPHP作为后端框架&#xff0c;其强大的功能与良好的扩展性为程序的稳定运行提供了保障。 ​FastAdmin作为后台管理框架&#xff0c;使得管理员能够便捷地对用户信息、相亲…...

【SystemC初认识】SystemC是什么?有哪些主要组件?如何简单使用?

【SystemC初认识】SystemC是什么&#xff1f;有哪些主要组件&#xff1f;如何简单使用&#xff1f; 1 SystemC简介2 主要组件3 关于时序与调度4 如何安装4.1 安装C编译器4.2 安装SystemC 库 5 SystemC代码示例6 关于SystemC 仿真与调度7 SystemC 中的常用类和函数8 常见的设计模…...

软考:硬件中的CPU架构、存储系统(Cache、虚拟内存)、I/O设备与接口

文章目录 1. 引言1.1 硬件知识的重要性1.2 软件设计师考试中硬件的考察目标 2. CPU架构2.1 CPU的基本概念2.2 CPU的内部结构2.3 CPU的工作原理2.4 指令集架构&#xff08;ISA&#xff09;2.5 多核处理器 3. 存储系统3.1 存储器的基本概念3.2 主存储器&#xff08;RAM&#xff0…...

力扣hot100——98.验证二叉搜索树

题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 首先列举一个错误代码 class Solution { public:bool isValidBST(TreeNode* root) {if(rootnullptr) return true;if(root->right){if(root->right->val<root->val) return f…...

UE 像素和线框盒子 材质

像素材质&#xff1a; 线框盒子材质&#xff1a;...

工业质检领域相关近期顶会论文汇总CVPR2025

目录 异常检测Anomaly Detection多类别数据集开集有监督异常检测Open-set Supervised Anomaly Detection&#xff08;OSAD&#xff09;基于多模态大模型能力 骨干网络Mamba系列&#xff08;mamba为transformer后的新骨干网络形式&#xff09;其他 目标检测开集识别DETR实例检测…...

leetcode76

目录 803ms超时。。。。越改越超时。。。 一些纠缠 代码分析&#xff1a; 代码问题&#xff1a; 改进建议&#xff1a; 示例代码&#xff1a; The error message you’re seeing indicates that there is a reference binding to a null pointer in your code. This typ…...

Android Studio下载安装教程

## 什么是Android Studio Android Studio是Google官方推出的Android应用开发集成环境(IDE)&#xff0c;基于IntelliJ IDEA开发&#xff0c;专门用于Android应用开发。它包含了代码编辑器、可视化布局编辑器、应用性能分析工具、模拟器等功能&#xff0c;为开发者提供了一站式的…...

shell---expect

1.expect的安装 [rootqfedu ~] yum -y install expect 2.expect的语法: 用法: 1)定义expect脚本执行的shell #!/usr/bin/expect -----类似于#!/bin/bash 2)spawn spawn是执行expect之后后执行的内部命令开启一个会话 #功能:用来执行shell的交互命令 3)…...

基于PHP的在线编程课程学习系统

有需要请加文章底部Q哦 可远程调试 基于PHP在线编程课程学习系统 一 介绍 在线编程课程学习系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery.js。系统角色分为学生&#xff0c;教师和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqljquery.jsphps…...

深度学习概述

近年来&#xff0c;我们在媒体上到处可见人工智能&#xff08;AI&#xff09;这个词&#xff0c;而深度学 习是人工智能的一种实现方法。下面我们就来简单地看一下深度学习具 有怎样划时代的意义。 下面是三张花的图片&#xff0c;它们都具有同一个名字&#xff0c;那究竟是什…...

[原创](现代Delphi 12指南):[macOS 64bit App开发]: [1]如何使用原生NSAlert消息框 (runModal模式)

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

【NumPy完全指南】从基础操作到高性能计算实战

&#x1f4d1; 目录 一、NumPy核心价值1.1 科学计算现状分析1.2 ndarray设计哲学 二、核心数据结构解析2.1 ndarray内存布局2.2 数据类型体系 三、矢量化编程实践3.1 通用函数(ufunc)示例3.2 广播机制图解 四、高性能计算进阶4.1 内存预分配策略4.2 Cython混合编程 五、典型应用…...

深入解析词嵌入(Word2Vec、GloVe)技术原理:从词语到向量的转变

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4o-mini模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…...

Android学习总结之点击登录按钮流程

1. 事件分发阶段 1.1 触摸事件产生 当用户点击屏幕上的登录按钮时&#xff0c;触摸屏硬件会检测到触摸操作&#xff0c;并将触摸事件的相关信息&#xff08;如触摸的坐标、触摸的时间等&#xff09;传递给 Android 系统的 InputManagerService。 1.2 Activity 接收事件 Inp…...

多数元素题解(LC:169)

169. 多数元素 核心思想&#xff08;Boyer-Moore 投票算法&#xff09;&#xff1a; 解题思路&#xff1a;可以使用 Boyer-Moore 投票算法、该算法的核心思想是&#xff1a; 维护一个候选元素和计数器、初始时计数器为 0。 遍历数组&#xff1a; 当计数器为 0 时、设置当前元…...

C# 在VS2022中开发常用设置

一、基础环境配置 1. 安装必要组件 在 VS2022 安装时确保勾选以下工作负载&#xff1a; ​​使用 .NET 的桌面开发​​&#xff08;包含 WPF/WinForms&#xff09;​​ASP.NET 和 Web 开发​​​​.NET 跨平台开发​​​​Azure 开发​​​​数据存储和处理​​ 2. 主题与外…...

三个概念:DataBinding,Dependency Property 与DataTemplate

WPF 核心概念详解&#xff1a;DataBinding、Dependency Property 和 DataTemplate 1. DataBinding (数据绑定) 基本概念 DataBinding 是 WPF 的核心机制&#xff0c;用于在 UI 元素和数据源之间建立自动同步关系。 关键特性 双向绑定&#xff1a;数据变化自动反映到 UI&…...

基于C#开发的适合Windows开源文件管理器

使用DDD从零构建一个完整的系统 推荐一个功能强大且直观的开源文件管理器&#xff0c;适用于Windows平台。 01 项目简介 该项目是一个基于C#开发、开源的文件管理器&#xff0c;适用于Windows&#xff0c;界面UI美观、方便轻松浏览文件。此外&#xff0c;支持创建和提取压缩…...

nacos和redis本地启动

1. 下载Nacos 首先&#xff0c;你需要从Nacos的官方GitHub仓库下载最新版本的Nacos服务器。你可以访问Nacos GitHub页面来下载。 2. 解压下载的文件 下载完成后&#xff0c;解压你下载的Nacos包到一个目录中。例如&#xff0c;你可以将其解压到~/nacos/。 3. 启动Nacos服务…...

时态--00--总述

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 时态句子结构时态标志词 时态 句子结构 时态标志词...

PH热榜 | 2025-04-30

1. Daytona 标语&#xff1a;安全且灵活的基础设施&#xff0c;用于运行你的人工智能生成的代码。 介绍&#xff1a;Daytona Cloud 为 AI 智能体重塑了基础设施&#xff0c;具备不到 90 毫秒的启动时间、原生性能以及有状态执行的能力&#xff0c;这些是传统云计算所无法实现…...

.NET Core 数据库ORM框架用法简述

.NET Core ORM框架用法简述 一、主流.NET Core ORM框架概述 在.NET Core生态系统中&#xff0c;主流的ORM(Object-Relational Mapping)框架包括&#xff1a; ​​Entity Framework Core (EF Core)​​ - 微软官方推出的ORM框架​​Dapper​​ - 轻量级微ORM​​Npgsql.Entit…...

在Windows系统上如何用Manifest管理嵌入式项目

相信很多Android开发出身的工程师对于manifest、repo和gerrit会有一定的好感&#xff0c;即使转行做了其他的行业&#xff0c;也希望可以延续Android的代码管理风格。这里记录了一个在汽车电子行业使用GerritrepoManifest来管理嵌入式项目的方法&#xff0c;希望对读者有帮助。…...

Qt -DFS可视化

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 目录 前言关于如何sleep实现思路Pixmapspixmaps.hpixmaps.cpp MapSquaremapsquare.hmapsquare.cpp dfsthreaddfsthread.hdfsthread.cpprun dfs其他 WidgetUnit其他 Qt -DFS…...

H.264添加 SEI 信息技术文档

概述 本文档描述如何在 H.264 视频流中动态插入自定义 SEI信息。SEI 是 H.264/AVC 标准中定义的一种元数据格式&#xff0c;可用于携带时间戳、版权信息、场景标记等附加数据。本方案基于 FFmpeg 的 AVPacket 结构和标准 H.264 NAL 单元格式实现&#xff0c;支持与视频帧的精确…...

ICMP协议

ICMP协议 一、ICMP基本概念 1、ICMP协议 Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制消息&#xff0c;控制消息指网络通不通、主机是否可达、路由是否可用等等ICMP是属于网络层的协议&#xff0c;封装在传输层与网络层之间 2、ICMP报文格式 类型 (t…...

react中封装一个预览.doc和.docx文件的组件

主要用到了mammoth这个插件,mammoth.js‌是一个JavaScript库&#xff0c;主要用于将Microsoft Word文档&#xff08;.docx格式&#xff09;转换为HTML。它可以通过Node.js环境使用&#xff0c;也可以直接在浏览器中使用。 关键代码: import mammoth from mammoth; import { u…...

驾驭音质,尽享四通道力量——AXPA17851

AXPA17851: 4x48W 车用AB类四通道桥式输出音频功率放大器 AXPA17851是采用BCD(双极型&#xff0c;CMOS&#xff0c;DMOS)工艺技术设计的四通道桥式输出AB类车用音频功率放大器&#xff0c;采用完全互补的P型/ N型输出结构&#xff0c; 具有轨到轨的输出电压摆幅&#xff0c;高输…...

人格伤疤测试:发现内心深处的情感创伤

人格伤疤测试&#xff1a;发现内心深处的情感创伤 工具介绍 我们开发了一个专业的人格伤疤测试工具&#xff0c;帮助您发现和了解内心深处的情感创伤。这个在线测评从十个关键维度全面评估您的心理状态&#xff1a; 核心维度 情感创伤: 评估童年经历对当前情绪的影响自我认…...

CANopen协议简单介绍和使用

文章目录 一、CAN总线介绍二、CAN总线的帧类型三、CAN总线的特性四、Linux中的CAN帧驱动结构体五、CAN总线升级版本-CANFD六、更高层封装的协议-应用层封装的CANopen协议总结 一、CAN总线介绍 CAN总线&#xff08;Controller Area Network&#xff09; 是一种串行通信协议&…...

数据隐私在Web3环境下的重要性及实现方法

在这个信息爆炸的时代&#xff0c;我们正站在 Web3 的门槛上&#xff0c;迎接着一个全新的网络架构和用户交互方式。Web3 不仅仅是技术的迭代&#xff0c;它还代表了一种全新的网络架构和用户交互方式。在 Web3 环境下&#xff0c;数据隐私成为了一个至关重要的话题。本文将探讨…...

【每日八股】复习 Redis Day4:线程模型

文章目录 复习 Redis Day4&#xff1a;线程模型介绍一下 Redis 的线程模型核心线程模型&#xff08;Redis 6.0 之前&#xff09;Redis 6.0 的多线程改进Redis 真的是单线程吗&#xff1f;Redis 的线程模型剖析 上一篇 Redis 的应用我今天才完成&#xff0c;因此明天一并复习 Re…...

手动创建一份konga对应helm的chart项目

rootiZj6c72dzbei17o2cuksmeZ:~/yaml/konga# helm create konga-chart Creating konga-chart更改对应的文件 deployment.yaml rootiZj6c72dzbei17o2cuksmeZ:~/yaml/konga/konga-chart# cat templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: k…...

GD32F407单片机开发入门(十九)DMA详解及ADC-DMA方式采集含源码

文章目录 一.概要二.GD32F407VET6单片机DMA外设特点三.GD32单片机DMA内部结构图四.DMA各通道请求五.GD32F407VET6单片机ADC-DMA采集例程六.工程源代码下载七.小结 一.概要 基本概念&#xff1a; DMA是Direct Memory Access的首字母缩写,是一种完全由硬件执行数据交换的工作方式…...

AI HR新范式:易路iBuilder如何通过“技术隐身,价值凸显”,成为HR身份转型的好帮手

HR的身份危机与转型机遇 面对本轮AI引发的组织重构浪潮&#xff0c;HR在组织中的角色发生了哪些变化&#xff1f; 传统&#xff0c;HR负责构建公司“人员流程”的体系与专业服务&#xff0c;涵盖招聘、发展、薪酬、支持等职能。但在企业持续追求“生产力”的当下&#xff0c;…...

栈与队列 Part 7

队列的链式存储结构及实现 队列的链式存储结构&#xff0c;其实就是线性表的单链表&#xff0c;只不过它只能尾进头出而已&#xff0c;我们把它简称为链队列 为了操作上的方便&#xff0c;我们将队头指针指向链队列的头结点&#xff0c;而队尾指针指向终端结点&#xff0c;如图…...

pinia实现数据持久化插件pinia-plugin-persist-uni

在学习uniapp过程中&#xff0c;看到了pinia-plugin-persist-uni插件&#xff0c;以前面试过程中也有面试过说vuex数据刷新之前的数据就丢失了&#xff0c;之前回答的是把数据存储到数据库或者本地存储。pinia-plugin-persist-uni本质上数据也是本地存储。 1、安装 npm instal…...

32单片机——独立看门狗

1、IWDG的简介 IWDG&#xff1a;Independent watchdog&#xff0c;即独立看门狗 独立看门狗本质上是一个定时器&#xff0c;该定时器是一个12位的递减计数器&#xff0c;当计数器的值减到0的时候&#xff0c;就会产生一个复位信号 如果在计数没减到0之前&#xff0c;重置计数器…...

人工智能数学基础(五):概率论

概率论是人工智能中处理不确定性的核心工具&#xff0c;它为机器学习、数据科学和统计分析提供了理论基础。本文将深入浅出地介绍概率论的重要概念&#xff0c;并结合 Python 实例&#xff0c;帮助读者更好地理解和应用这些知识。资源绑定附上完整资源供读者参考学习&#xff0…...

Hbuilder 开发鸿蒙应用,打包成 hap 格式(并没有上架应用商店,只安装调试用)

效果 这个是打包后的 hap 文件&#xff0c;&#xff08;并没有上架应用商店&#xff0c;只安装调试用&#xff09; 拖到模拟器里&#xff0c;可以正常安装 这是鸿蒙的版本 前置 注册华为开发者账号 下载 DevEco-studio 软件 hbuilder 阿尔法版本 大致思路 然后注册…...