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

python+pygame+opencv+gpt实现虚拟数字人直播(一)

AI技术突飞猛进,不断的改变着人们的工作和生活。数字人直播作为新兴形式,必将成为未来趋势,具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作,提供更具个性化和多样化的互动体验,成为未来的一种趋势。

前言

马斯克称:“人工智能将在我们所看到的人类进化和文明的未来发挥非常深远的作用。未来我们会拥有大量的机器人,到时候,全球的生产效率将会提高到令人难以置信的水平。”,机器人可以完成行走、上下楼、下蹲、拿取物品等动作,也已具备了保护自身和周围人安全的能力,未来还可以做饭、修剪草坪、帮助照看老人,或在工厂里面替代人类从事枯燥和有危险的工作。

不久前的世界互联网大会数字文明尼山对话上,阿里巴巴集团董事会主席兼首席执行官、阿里云智能集团董事长兼首席执行官张勇也表示,AI的发展将会带来更多的就业机会。站在智能化新时代,所有行业都值得基于人工智能技术重做一遍。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

只不过效率提升的同时,迎面而来的也是人类与AI的近距离博弈。在AIGC时代影响下,人们已经可以用非常低的成本用上ChatGPT、StableDiffusion以及 Mid-journey等AI产品。很多岗位面临着替代的风险,文字工作者、画师、广告设计,甚至是带货主播等。

虽然网上有些公司已实现了虚拟数字人技术,但收费都不菲。这里使用python尝试玩一下虚拟数字人直播,作为有趣的探索和低成本的实现。如果探索可行,可以自己搞一个虚拟数字人直播玩玩儿,挂在自己的抖音上二十四小时在线,岂不美哉!

python实现的虚拟数字人直播

利用AI技术除了虚拟数字人直播外,AR 导购、虚拟试穿、虚拟主播、3D 样板间等新玩法的出现,实现了直播电商在观看体验、直播效率、商业价值上的全面提速。在不同的应用场景下,人工智能和真人主播可以互补互助,为消费者提供多元的观看体验,例如人工智能的语言处理可以更快速地理解和回应用户的问题和需求,而真人主播则可以在直播过程中与用户进行情感上的交流互动,拉近直播间与用户间的距离。 

数字人直播的惊天优势

利用数字人直播新媒体平台,可以让数字人直播24小时随时开播、自动带货。

数字人直播帮助本地生活商家实现爆破式增长。

数字人直播深度还原真人形象告别出镜难题。

数字人直播文案一键输入3S出片短视频产量指数级增长。

数字人直播可利用GPT互动功能,GPT直播生成内容自动互动,回复不重样。

利用文心一言、讯飞星火或chatGPT等人工智能语音交互技术,让数字人直播真正的走向实战,成为可能。

Python实现的技术方案

Python可以用于实现虚拟数字人,使其具备动画和说话的能力。

一个可行的技术方案探索:

1. 人物建模和动画:使用计算机图形学技术,可以使用Python库如Pygame、Pyglet、OpenGL等创建人物的3D模型,并为其添加动画效果。可以使用3D建模软件(如Blender)创建人物模型,并使用Python编写脚本来控制模型的动画。

2. 语音合成:使用Python库如pyttsx3、gTTS等,可以将文本转换为语音。这些库提供了API,可以将文本输入,并生成相应的语音输出。

3. 对话系统:使用Python的自然语言处理(NLP)和机器学习技术,可以构建一个对话系统,使虚拟数字人能够理解和生成自然语言的对话。可以使用NLP库如NLTK、SpaCy等来处理自然语言,并使用机器学习库如TensorFlow、PyTorch等来训练对话模型。

4. 用户界面:使用Python的GUI库如Tkinter、PyQt等,可以创建一个用户界面,使用户能够与虚拟数字人进行交互。可以在界面上显示虚拟人物的动画,并提供文本框或语音输入来与其进行对话。

方案介绍

1. 人物建模和动画: 使用计算机图形学技术创建人物的2D或3D模型,可以使用Blender等建模软件进行建模。将人物的不同面部表情和动作设计为不同的图像帧或动画序列。或自己录制,或从网上剪辑需要的人物视频和图片素材。

2. 精灵类的使用: - 创建一个继承自pygame.sprite.Sprite的虚拟数字人类。  在虚拟数字人类中,使用pygame.image.load()加载人物的图像帧或动画序列。  使用pygame.Surface.blit()方法在屏幕上绘制当前的图像帧。

3. 面部表情和动作切换: - 在虚拟数字人类中,定义方法来切换人物的面部表情和动作。 - 使用pygame.time.set_timer()来定时触发表情和动作的切换,创建一个定时器事件。

4. 发音和语音合成: - 使用Python的语音合成库,如pyttsx3、gTTS等,或百度、科大讯飞等的语音接口,将文本转换为语音。 - 定义方法来触发虚拟数字人的发音,根据需要播放相应的语音。

5. 用户交互: - 创建一个pygame窗口,用于显示虚拟数字人和与用户进行交互。  使用pygame.event.get()监听用户的事件,例如键盘输入或鼠标点击。 - 根据用户的输入,调用相应的方法来切换人物的面部表情、动作和发音。让用户的聊天内容文字发给GPT,形成内容并通过文字转语音回复给用户,同时配合不同的动作和表情。

环境依赖

1.下载安装python3,Python 官网:Welcome to Python.org

2.安装依赖的模块: pygame,pygame-pgu,opencv,rembg

pip install rembg -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install opencv-python

3.替换pip安装的资源镜像(否则下载模块很慢)

pip  config set  global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
4.图片和语音素材

5.讯飞离线语音合成工具

素材制作

可以使用3D建模软件(如Blender)创建人物模型,这里简单起见,部分素材从网上搜索下载到的,仅用于学习研究目的,如有侵权请联系我。

Rembg是一款图片背景去除工具. 这里我先简单介绍下它的特点。

  • 开源、免费

  • 基于 Python 开发

  • 后台引擎是用于显著对象检测的深度网络架构 U²-Net(后文有简单介绍)

  • 安装简单

背景图片

人物图片

 

代码实现

加载图片背景

#背景实现
class BackGround(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image = pygame.image.load('./image/background.png').convert()self.image = pygame.transform.scale(self.image, (WIDTH, HEIGHT))self.rect = self.image.get_rect()self.ready_to_move = 0self.index = 0def update(self, *args):pass

提取视频图片帧

从一段视频中提取视频图片帧。

在pygame中,Sprite精灵通常使用图像来实现动画效果。尽管pygame本身不直接支持加载和播放mp4格式的视频文件,但可以通过一些额外的库来实现加载和播放视频的功能。 一个常用的库是 moviepy ,它是一个用于视频编辑和处理的Python库。可以使用 moviepy 库将mp4视频文件转换为一系列图像帧,然后使用这些图像帧来创建Sprite精灵动画。

下面是一个示例:

import pygame
from moviepy.editor import VideoFileClip# 加载mp4视频并提取图像帧
video = VideoFileClip("animation.mp4")
frames = [pygame.image.fromstring(video.get_frame(t), video.size, "RGB") for t in range(0, int(video.duration*video.fps))]# 初始化pygame
pygame.init()
screen = pygame.display.set_mode(video.size)# 创建Sprite精灵对象
class AnimatedSprite(pygame.sprite.Sprite):def __init__(self, frames):super().__init__()self.frames = framesself.current_frame = 0self.image = self.frames[self.current_frame]self.rect = self.image.get_rect()def update(self):self.current_frame = (self.current_frame + 1) % len(self.frames)self.image = self.frames[self.current_frame]# 创建精灵对象并添加到精灵组
sprite = AnimatedSprite(frames)
sprite_group = pygame.sprite.Group(sprite)clock = pygame.time.Clock()# 游戏循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsesprite_group.update()screen.fill((0, 0, 0))sprite_group.draw(screen)pygame.display.flip()clock.tick(30)pygame.quit()

提取视频帧并保存为png格式的图片,同时去除背景:

# 加油动作手势def comeOn(self):# 加载mp4视频并提取图像帧video = VideoFileClip("./mp4/1.mp4")# Get the video dimensionsvideo_width, video_height = video.size# 创建一个pygame surface#surface = pygame.Surface((video_width, video_height))#frames = [pygame.image.fromstring(np.array(video.get_frame(t)).tobytes(), video.size, "RGB") for t in range(0, int(video.duration*video.fps))]# Create a pygame surface with alpha channelsurface = pygame.Surface((video_width, video_height), pygame.SRCALPHA)# Convert each frame of the video to an image with transparencyframes = []for t in range(int(video.duration * video.fps)):frame = video.get_frame(t)pygame.surfarray.blit_array(surface, frame.swapaxes(0, 1))# 将帧保存为PNG图像image = pygame.surfarray.array3d(surface).swapaxes(0, 1)image = np.uint8(image)pil_image = Image.fromarray(image)#去除图片的白色背景image = remove(pil_image)#保存png图片image.save(f"framet_{t}.png")# Convert PIL Image to pygame surfacepygame_image = pygame.image.fromstring(image.tobytes(), image.size, image.mode).convert_alpha()frames.append(pygame_image)self.frames = framesprint("frames count:"+str(len(self.frames)))self.current_frame = 0self.image = self.frames[self.current_frame]self.state = "comeOn"self.start = time.time()

也可以使用opencv提取mp4视频中的图片帧,代码示例:

import cv2# 打开视频文件
video = cv2.VideoCapture('2.mp4')# 设置帧计数器
frame_count = 0while True:# 读取视频的每一帧ret, frame = video.read()# 如果没有读到帧,说明视频已经结束if not ret:break# 保存帧图片cv2.imwrite(f'output/frame_{frame_count}.jpg', frame)# 帧计数器自增frame_count += 1# 释放视频对象
video.release()

实现过程

# -*- coding: utf-8 -*-
# @Author : yangyongzhen
# @Email : 534117529@qq.com
# @File : mqttclienttool.py
# @Project : study
import pygame
from moviepy.editor import VideoFileClip
import numpy as np
import time
from PIL import Image
from rembg import remove
import cv2# 常量 屏幕大小
WIDTH, HEIGHT = 500, 900
print(cv2.__version__)
# 初始化操作
pygame.init()
pygame.mixer.init()
# 创建窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))# 设置窗口标题
pygame.display.set_caption('虚拟数字人--关注作者:blog.csdn.net/qq8864')# 添加背景音乐
pygame.mixer.music.load('./sound/bgLoop.wav')
pygame.mixer.music.set_volume(0.5)  # 音量
#pygame.mixer.music.play(-1, 0)
# 添加系统时钟
FPS = 30
clock = pygame.time.Clock()
# 创建用户自定义事件,每隔1000毫秒触发一次事件
USER_EVENT = pygame.USEREVENT
pygame.time.set_timer(USER_EVENT, 1000)# 加载字体文件
font_path = "./font/SIMYOU.ttf"  # 替换为你的字体文件路径
font_size = 24
font = pygame.font.Font(font_path, font_size)# ========虚拟数字人主角==========
# class Hero(pygame.sprite.Sprite)
# class BackGround(pygame.sprite.Sprite)
# 虚拟人主角 (静默状态保持微笑和3秒眨一次眼睛)
class VirtualMan(pygame.sprite.Sprite):def __init__(self, speed):super().__init__()self.image = pygame.image.load('./image/man.png')self.image_index = 0self.readt_to_change = 0self.rect = self.image.get_rect()self.rect.width *= 0.5self.rect.height *= 0.5self.image = pygame.transform.scale(self.image, (self.rect.width, self.rect.height))self.rect.x, self.rect.y = 0, 100self.speed = speedself.frames = Noneself.current_frame = 0self.state = "idle"def update(self, *args):#这里用上下左右、空格几个按键来测试虚拟数字人的不同动作keys = pygame.key.get_pressed()if keys[pygame.K_UP]:#加油动作手势self.comeOn()if keys[pygame.K_DOWN]:#欢迎动作手势self.welcome()if keys[pygame.K_LEFT]:#说话动作和表情self.say()if keys[pygame.K_RIGHT]:#停下来self.stop()if keys[pygame.K_SPACE]:#欢迎动作手势self.goodbye()if self.state == "comeOn":   self.current_frame = (self.current_frame + 1) % len(self.frames)self.image = pygame.transform.scale(self.frames[self.current_frame], (self.rect.width, self.rect.height))#print("current_frame:"+str(self.current_frame))if self.current_frame == 0:self.frames.clear()self.state = "idle"print("idle")self.end = time.time()print("time:"+str(self.end - self.start))img = pygame.image.load('./image/man.png')self.image = pygame.transform.scale(img, (self.rect.width, self.rect.height))pass# 加油动作手势def comeOn(self):# 加载mp4视频并提取图像帧#video = VideoFileClip("./mp4/1.mp4")frames = []'''video = cv2.VideoCapture("./mp4/1.mp4")# 设置帧计数器frame_count = 0while True:# 读取视频的每一帧ret, frame = video.read()# 如果没有读到帧,说明视频已经结束if not ret:break# 保存帧图片#cv2.imwrite(f'output/frame_{frame_count}.png', frame)#OpenCV转换成PIL.Image格式pil_image = Image.fromarray(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB))image = remove(pil_image)image.save(f"framet_{frame_count}.png")# Convert PIL Image to pygame surfacepygame_image = pygame.image.fromstring(image.tobytes(), image.size, image.mode).convert_alpha()frames.append(pygame_image)# 帧计数器自增frame_count += 1# 释放视频对象video.release()'''for i in range(0,75):img = pygame.image.load(f"./doc/img2/framet_{i}.png")frames.append(img)self.frames = framesprint("frames count:"+str(len(self.frames)))self.current_frame = 0self.image = self.frames[self.current_frame]self.state = "comeOn"self.start = time.time()#再见动作手势def goodbye(self):pass#欢迎动作手势def welcome(self):pass#停止所有动作def stop(self):pass#开始说话def say(self):pass#sound = pygame.mixer.Sound('./sound/nihao.wav')#sound.play()#背景
class BackGround(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image = pygame.image.load('./image/background.png').convert()self.image = pygame.transform.scale(self.image, (WIDTH, HEIGHT))self.rect = self.image.get_rect()self.ready_to_move = 0self.index = 0def update(self, *args):pass# 初始化精灵组
bg_sprite = pygame.sprite.Group()
man_sprite = pygame.sprite.Group()# 定义人物
man = VirtualMan(4)
man_sprite.add(man)bg1 = BackGround()
bg_sprite.add(bg1)
# 保持游戏运行状态(游戏循环)
while True:# ===========游戏帧的刷新===========clock.tick(FPS)#print("Runtime:", pygame.time.get_ticks(), "ms")# 检测事件for event in pygame.event.get():# 检测关闭按钮被点击的事件if event.type == pygame.QUIT:# 退出pygame.quit()exit()if event.type == USER_EVENT:man.say()passelse:try:passexcept Exception as e:print(e)# screen.fill((0,0,0))for group in [bg_sprite, man_sprite]:group.update()group.draw(screen)#screen.fill((0,0,0))    #生成一个屏幕  pygame.display.flip()#pygame.display.update()#app.paint()             #将pgu容器的内容画出

其他资源 

【代码抠图】4行Python代码帮你消除图片背景 - 知乎

【Python】推荐三个好玩的图像处理库_python rembg_赵卓不凡的博客-CSDN博客

百度安全验证

无需Photoshop!Rembg:图像背景自动去除工具_研道鸠摩智的博客-CSDN博客

数字人涌入直播间,虚拟主播的未来到底如何?

光生资讯 |虚拟数字人直播火热,前景广阔但仍需改进_进行_用户_问题

【Python】推荐三个好玩的图像处理库_python rembg_赵卓不凡的博客-CSDN博客

Python自动化:一款基于AI的自动图片背景去除软件 - 墨天轮

rembg 模型库放置位置设置_桑榆肖物的博客-CSDN博客

Matting库rembg使用测评 - 知乎

Python OpenCV 详解_pythonopencv-CSDN博客

Python+OpenCV计算机视觉全面基础概述(上篇) - 知乎

Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略_顺其自然~的博客-CSDN博客

OpenCV视频操作 · OpenCV-Python初学自码 · 看云

相关文章:

python+pygame+opencv+gpt实现虚拟数字人直播(一)

AI技术突飞猛进,不断的改变着人们的工作和生活。数字人直播作为新兴形式,必将成为未来趋势,具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作,提供更具个性化和多样化的互动体验,成为未来的一种趋…...

c语言:模拟实现各种字符串函数(2)

strncpy函数: 功能:拷贝指定长度的字符串a到字符串b中 代码模拟实现: //strncpy char* my_strncpy(char* dest, char* str,size_t num) {char* ret dest;assert(dest && str);//断言,如果其中有一个为空指针&#xff…...

【Proteus仿真】【STM32单片机】感应水龙头设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶模块、HCSR04超声波等。 主要功能: 系统运行后,LCD1602显示超声波模块检测的距离,若检测距离小…...

P15 C++ 枚举

The ChenPi 前言 今天我们要讲的是 C 中的枚举。 enum 是 enumeration 的缩写,基本上可以说,它就是一个数值集合。如果你想要给枚举一个更实际的定义,它们是给一个值命名的一种方法。 所以我们不用一堆叫做 A、B、C 的整数。我们可以有一个…...

深入理解路由协议:从概念到实践

路由技术是Internet得以持续运转的关键所在,路由是极其有趣而又复杂的课题,永远的话题。 SO:这是一个解析路由协议的基础文章。 目录 前言路由的概念路由协议的分类数据包在网络中的路由过程理解路由表的结构路由器关键功能解析 前言 在互联…...

Qt 串口编程-从入门到实战

1. Qt 串口通信流程解析 1.1 串行通信和并行通信对比 并行通信适合距离较短的通信,且信号容易受干扰,成本高串口通讯-设备(蓝牙, wifi, gprs, gps) 1.2 Qt 串口通信具体流程 1. 创建 QSerial…...

如何获得微软MVP徽章

要成为微软MVP,需要在特定领域成为专家,并积极参与社区,为其他人提供帮助和支持。以下是一些步骤可以帮助你成为MVP: 在特定领域成为专家:要成为MVP,需要在某个领域具有专业知识和经验。这可以通过阅读相关…...

Java架构师软件架构开发

目录 1 基于架构的软件开发导论2 ABSD架构方法论3 ABSD方法论具体实现4 ABSD金融业案例5 基于特定领域的软件架构开发导论6 DSSA领域分析7 DSSA领域设计和实现8 DSSA国际电商平台架构案例9 架构思维方法论概述10 AT方法论和案例想学习架构师构建流程请跳转:Java架构师系统架构…...

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现 )预习报告

手写报告稍微认真点写,80+随便有 目录 一、计算/设计过程 1、通过虚拟示波器观察和测量信号 2、通过实际电路(电阻、开关、发光二极管)模拟逻辑门电路 二、画出并填写实验指导书上的预表...

Java八股文面试全套真题【含答案】- SpringMVC篇

以下是一些关于Spring MVC语言的经典面试题以及它们的答案: 什么是Spring MVC框架?它的特点是什么? Spring MVC是基于Java的一种Web应用框架,用于开发基于MVC(模型-视图-控制器)模式的Web应用程序。它的特…...

Spring第二课响应的完全,如何理解前后端互联

目录 一、响应 Control,RestController 1.Controller的源码,代表什么意思 2.返回数据 Responsebody 3.返回HTML片段 4.返回JSON 5.那么假如我们使用集合会怎么样呢 设置状态码,虽然不影响展示,但是确实显示起来也就是401的情况。 2.我…...

html实现各种瀑布流(附源码)

文章目录 1.设计来源1.1 动态响应瀑布流1.2 分页瀑布流1.3 响应瀑布流 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134613121 html实现各种瀑布流(附源码),…...

万字解析设计模式之责任链模式、状态模式

目录 一、责任链模式 1.1概述 1.2结构 1.3实现 1.4 优缺点 1.5应用场景 1.6源码解析 二、状态模式 2.1概述 2.2结构 2.3实现 2.4优缺点 2.5应用场景 三、责任链模式实验 任务描述 实现方式 编程要求 测试说明 四、状态模式实验 任务描述 实现方式 编程要…...

二十三种设计模式全面解析-深入探讨状态模式的高级应用技术:释放对象行为的无限可能

在软件开发中,状态管理是一个常见的挑战。当对象的行为随着内部状态的变化而变化时,有效地管理对象的状态和相应的行为变得至关重要。在这方面,状态模式提供了一种优雅而灵活的解决方案。它允许对象在运行时根据内部状态的改变而改变其行为&a…...

论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools

论文笔记--Toolformer: Language Models Can Teach Themselves to Use Tools 1. 文章简介2. 文章概括3 文章重点技术3.1 Toolformer3.2 APIs 4. 文章亮点5. 原文传送门 1. 文章简介 标题:Toolformer: Language Models Can Teach Themselves to Use Tools作者&#…...

stm32实现0.96oled图片显示,菜单功能

stm32实现0.96oled图片显示,菜单功能 功能展示简介代码介绍oled.coled.holedfont.h(字库文件)main函数 代码思路讲解 本期内容,我们将学习0.96寸oled的进阶使用,展示图片,实现菜单切换等功能,关…...

sqlite外键约束 保证数据一致性

1. 外键约束 在SQLite中,可以通过使用外键(Foreign Key)约束和CASCADE选项来实现通过外键删除相关信息。 CASCADE选项是指在主键表中删除记录时,相应的外键表中的相关记录也将被自动删除。 -- 创建主键表 CREATE TABLE Persons…...

Vue轻松入门,附带学习笔记和相关案例

目录 案例 一Vue基础 什么是Vue? 补充:mvvm框架 mvvm的组成 详解 Vue的使用方法 1.直接下载并引入 2.通过 CDN 使用 Vue 3.通过npm安装 4.使用Vue CLI创建项目 二插值表达式 什么是插值表达式? 插值表达式的缺点 解决方法 …...

【青蛙跳台阶问题 —— (三种算法)】

青蛙跳台阶问题 —— (三种算法) 一.题目介绍1.1.题目1.2.图示 二.解题思路三.题解及其相关算法3.1.递归分治法3.2.动态规划算法(Dynamic Programming)3.3.斐波那契数列法 四.注意细节 一.题目介绍 1.1.题目 一只青蛙一次可以跳上1级台阶&am…...

联想yoga AMD处理器 转接头无法电量外接显示器

第一次买AMD的处理器,当时就是为了yogaAMD这款的接口要比英特尔的接口多,没想到AMD处理器真的问题多。经常蓝屏不说,偶尔还点不亮外接显示器。遇到这种问题,不是什么驱动问题,可能你按照网上各种方法打开设备管理器→显…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...