生成完美口型同步的 AI 数字人视频

目录

摘要

关键词

1 前言

1.1 研究背景

1.2 研究意义

2 技术框架

2.1 深度学习框架

2.2 语音识别

2.3 面部动作捕捉和口型同步

2.4 综合项目

3 实现过程

3.1 环境搭建

3.2 代码开发

3.3 整合代码

3.4 部署

3.5 更多细节

4 测试过程

4.1 数据准备

4.2 面部检测测试

4.3 语音识别测试

4.4 文本到口型映射测试

4.5 面部动作迁移和口型同步测试

4.6 如何评估面部动作迁移的效果

5 实验结果

5.1 技术整合与实现

5.2 最后结果

结论

参考文献


摘要

在当今数字媒体和人工智能技术的推动下,生成完美口型同步的AI数字人视频成为备受关注的研究领域。本研究旨在开发一种技术,能够实现生成完美口型同步的AI数字人视频,使虚拟人物的口型与语音内容完美匹配。采用了深度学习方法,结合了语音识别、面部运动生成和视频合成技术,以实现这一目标。通过语音识别模型将输入的文本转换为音频波形,利用面部运动生成模型根据音频波形生成对应的面部动作序列,这些动作序列可以准确地反映出发音的口型和面部表情,最后生成口型同步的AI数字人视频。这项技术具有广泛的应用前景,可用于虚拟主持人、教育视频、学习平台等领域,提升视频内容的真实感和沟通效果。

关键词

深度学习;语音识别;面部动作捕捉;口型同步

1 前言

1.1 研究背景

随着人工智能技术的快速发展和普及,数字媒体内容的需求与日俱增。在多媒体应用中,生成完美口型同步的AI数字人视频成为了一个备受关注的前沿技术研究领域。该技术旨在利用语音识别、面部表情合成和计算机图形学等技术,实现从语音或文本输入生成逼真的人脸动画,并确保其与语音内容完美同步。口型同步AI数字人视频具有广泛的应用前景,可应用于虚拟助手、数字媒体内容制作、在线教育等领域,为用户提供更生动、更具交互性的体验。

1.2 研究意义

在理论上,探索口型同步技术的关键问题,推动语音识别、面部表情合成等领域的交叉发展和创新。在应用上,促进虚拟助手、在线教育、数字媒体内容制作等领域的智能化和人机交互体验的提升。为未来智能交互界面和数字内容创作提供新的可能性和前景,推动人工智能技术在多媒体领域的应用和发展。

2 技术框架

在实现生成完美口型同步的AI数字人视频过程中,涉及到多个关键的技术框架和工具,包括深度学习框架、语音识别系统、面部动作捕捉和口型同步模型等。以下将针对每个方面进行详细解释和介绍。

2.1 深度学习框架

TensorFlow:https://github.com/tensorflow/tensorflow

TensorFlow是一个由Google Brain团队开发的开源深度学习框架。它允许开发者创建多种机器学习模型,包括卷积神经网络、循环神经网络和深度神经网络等。TensorFlow支持多硬件加速,包括CPU、GPU和TPU,使其适合高性能计算和分布式训练。它拥有庞大而活跃的社区,提供了大量的文档、教程和资源,使得学习和使用TensorFlow变得更加容易。

PyTorch:https://github.com/pytorch/pytorch

PyTorch是一个动态图深度学习框架,以其易用性和灵活性而著称。它允许开发者使用Python进行高效的GPU加速深度学习模型开发。PyTorch具有简洁的API和快速的原型设计能力,使其在研究和实验方面非常受欢迎。

2.2 语音识别

DeepSpeech:https://github.com/mozilla/DeepSpeech

DeepSpeech是Mozilla开发的一个开源语音识别工具包,它基于TensorFlow或PyTorch。DeepSpeech可以识别多种语言和方言,并在实时语音识别和离线语音识别方面取得了显著成果。它提供了一个端到端的系统,包括特征提取、声学模型、语言模型和解码器等部分。

Kaldi:https://github.com/kaldi-asr/kaldi

Kaldi是一个广泛使用的语音识别工具包,由约翰霍普金斯大学开发。它提供了丰富的语音识别算法和工具,包括特征提取、声学模型训练、解码器构建等。Kaldi在学术和工业界都有广泛的应用,并在多个语音识别比赛中取得了优异的成绩。

2.3 面部动作捕捉和口型同步

First Order Motion Model:https://github.com/AliaksandrSiarohin/first-order-motion-model

First Order Motion Model是一个使用深度学习进行面部动作迁移的项目。它基于自监督学习方法,可以捕捉源视频中人物的面部动作,并将其迁移到目标视频中的人物上。该项目在口型同步方面取得了很好的效果,使得生成的视频看起来更加自然和真实。

VoxCeleb:VoxCeleb (数据集链接)

VoxCeleb是一个大型音频-视频数据集,包含来自YouTube的短视频片段。该数据集主要用于面部动作捕捉、语音识别等任务的研究。通过利用VoxCeleb数据集,研究人员可以训练出更加准确和鲁棒的模型,提高面部动作捕捉和口型同步的性能。

Dlib:https://github.com/davisking/dlib

Dlib是一个包含机器学习算法的C++库,其中包括面部关键点检测的功能。它提供了一系列高效的面部关键点检测算法,可以实时捕捉面部表情和动作。Dlib的面部关键点检测算法在精度和速度方面都取得了很好的平衡,因此在面部动作捕捉和口型同步等应用中得到了广泛应用。

2.4 综合项目

DeepFaceLive:https://github.com/iperov/DeepFaceLive

DeepFaceLive是一个实时面部动作迁移工具,它使用深度学习模型将一个人的面部动作应用到另一个人的视频上。该项目基于First Order Motion Model算法,并进行了优化和改进,使其能够在实时视频流中实现高质量的面部动作迁移。DeepFaceLive可以应用于虚拟直播、电影特效等领域。

FaceGAN:https://github.com/eladrich/pixel2style2pixel

FaceGAN是一个使用生成对抗网络(GANs)进行面部生成和动画化的项目。它基于一种新颖的编码器-解码器架构,可以生成高质量的面部图像并进行动画化。FaceGAN在面部动作捕捉和口型同步方面有着广泛的应用前景,可以生成逼真的面部表情和动作。

3 实现过程

3.1 环境搭建

选择操作系统:推荐使用Ubuntu或macOS,确保系统支持深度学习和图像处理。

安装Python:确保安装了Python 3.x版本,并配置好Python环境变量。

安装深度学习框架:选择TensorFlow或PyTorch作为深度学习框架,并根据所选框架安装相应版本。

安装其他依赖库:安装OpenCV、Dlib、NumPy、Pandas、PyDub、librosa等库,以及所需的语音识别工具(如DeepSpeech或Kaldi)。

下载和配置模型:下载First Order Motion Model(FOMM)或FaceGAN的预训练模型,并下载语音识别工具的模型或语言包。

3.2 代码开发

(1)面部关键点检测

确保安装了dlib和opencv-python库,因为它们分别用于面部检测和图像处理。

import dlib  
import cv2  def get_landmarks(img_path):  # 初始化面部检测器和关键点预测器  detector = dlib.get_frontal_face_detector()  predictor_path = "shape_predictor_68_face_landmarks.dat"  # 确保该文件位于当前工作目录或提供完整路径  predictor = dlib.shape_predictor(predictor_path)  # 读取图像  img = cv2.imread(img_path)  if img is None:  raise FileNotFoundError(f"Image not found at {img_path}")  # 转换为灰度图像以加快处理速度  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 检测面部  dets = detector(gray, 1)  landmarks = []  # 对每个检测到的面部,获取关键点  for k, d in enumerate(dets):  shape = predictor(gray, d)  # 获取68个关键点的坐标,并添加到列表中  landmark_list = [(shape.part(i).x, shape.part(i).y) for i in range(shape.num_parts)]  landmarks.append(landmark_list)  # 如果没有检测到面部,返回空列表  if not landmarks:  print("No faces detected in the image.")  return landmarks

(2)语音识别

对于DeepSpeech或Kaldi,按照其文档来安装和配置。

from deepspeech import Model  def asr_from_audio(audio_file_path, model_path, scorer_path=None):  # 加载DeepSpeech模型  ds = Model(model_path)  if scorer_path:  ds.enableExternalScorer(scorer_path)  # 如果提供了评分器模型,则启用它  # 此处实现音频文件加载和预处理的代码,例如转换为MFCC特征等  # audio_data = load_and_preprocess_audio(audio_file_path)  # 假设audio_data现在包含了处理后的音频数据  # 使用模型进行语音识别  text = ds.stt(audio_data)  # 清理资源(如果有必要)  # ds.destroy()  return text  # 实现load_and_preprocess_audio函数来加载和预处理音频文件

(3)面部动作迁移与口型同步

面部动作迁移是一个复杂的任务,涉及到深度学习和计算机视觉的多个方面。

import cv2  
import numpy as np  
from first_order_motion_model import FirstOrderMotionModel  # 假设已经有了处理音频并返回文本的函数  
def get_text_from_audio(audio_file_path):  # 实现音频到文本的转换  pass  def animate_face(source_image_path, driving_video_path, audio_file_path, model_path):  # 加载预训练模型  fomm = FirstOrderMotionModel(config_path=model_path)  # 读取源图像和驱动视频  source_image = cv2.imread(source_image_path)  driving_video = cv2.VideoCapture(driving_video_path)  # 获取源图像的关键点  source_landmarks = get_landmarks(source_image_path)[0] if source_image is not None else None  # 初始化输出视频  fourcc = cv2.VideoWriter_fourcc(*'mp4v')  out = cv2.VideoWriter('output.mp4', fourcc, driving_video.get(cv2.CAP_PROP_FPS), (int(driving_video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(driving_video.get(cv2.CAP_PROP_FRAME_HEIGHT))))  # 文本到口型关键点的转换(如果的话)  def text_to_mouth_movements(text):  # 这里实现一个复杂的系统来将文本转换为

3.3 整合代码

初始化项目

创建一个新的项目目录,并在其中组织代码和依赖项。

编写主函数或脚本

编写一个主函数或脚本,它按顺序执行以下步骤

a 读取源图像和驱动视频

使用cv2.imread()读取源图像,并使用cv2.VideoCapture()打开驱动视频。

source_image = cv2.imread(source_image_path)  
driving_video = cv2.VideoCapture(driving_video_path)

b 面部关键点检测

对驱动视频中的每一帧进行面部关键点检测。可以使用前面定义的get_landmarks函数。

landmarks_list = []  
while True:  ret, frame = driving_video.read()  if not ret:  break  landmarks = get_landmarks(frame)  if landmarks:  landmarks_list.append(landmarks[0])  # 假设每帧只有一个面部  # ...(可能的其他处理)  
driving_video.release()

c 语音识别

使用asr_from_audio函数(或类似的函数)将音频文件转换为文本。先实现音频加载和预处理的代码。

text = asr_from_audio(audio_file_path, model_path, scorer_path)

d 面部动作迁移

使用First Order Motion Model或其他面部动作迁移模型,结合检测到的面部关键点和语音识别得到的文本,生成动画。

# 初始化面部动作迁移模型  
effector = FirstOrderMotionModel(...)  
# 使用源图像、关键点信息和文本进行面部动作迁移  
# 这通常是一个迭代过程,处理驱动视频的每一帧  
generated_frames = []  
for landmarks in landmarks_list:  # 根据文本调整模型行为(这部分是伪代码)  # adjust_model_for_text(effector, text)  frame = effector.predict(source_image, landmarks)  generated_frames.append(frame)

e 保存或显示生成的动画

将生成的帧保存为视频文件或逐帧显示。

# 使用cv2.VideoWriter保存为视频文件  
# ...  # 或者使用matplotlib或OpenCV的imshow函数逐帧显示  
# ...

3.4 部署

本地运行

在本地计算机上运行脚本或主函数,确保所有依赖项都已正确安装。

Web应用

设置后端:使用Flask、Django等框架设置后端API,处理文件上传、调用面部关键点检测、语音识别和面部动作迁移功能。

构建前端:使用HTML、CSS和JavaScript构建前端界面,允许用户上传图像、视频和音频文件,并显示生成的动画。

前后端通信:使用AJAX、Fetch API或WebSocket等技术实现前后端之间的通信。

部署:将Web应用部署到Web服务器上,如Nginx、Gunicorn等。

云服务

将Web应用部署到云服务提供商(如阿里云,华为云等)上,以便从任何位置访问应用程序。这通常涉及到配置云服务提供商提供的虚拟机、容器服务或服务器无服务器函数。

3.5 更多细节

(1)面部检测和关键点定位

使用dlib库中的get_frontal_face_detector来检测图像或视频帧中的面部。

使用shape_predictor来定位面部的关键点,如眼睛、鼻子、嘴巴等。

这些关键点对于后续的面部动作迁移至关重要,因为它们提供了面部形状和表情的信息。

(2)语音识别(ASR)

使用如Google Speech-to-Text、Mozilla DeepSpeech或Kaldi等ASR工具将音频转换为文本。

这些工具通常预训练的模型来处理不同语言的音频输入。

ASR的准确性对于后续的口型同步至关重要,因为错误的文本会导致不自然的口型变化。

(3)文本到口型映射

这一步是将ASR生成的文本转换为口型关键点的变化。

通常训练一个专门的模型来实现这个映射,因为文本和口型之间的关系并不是直接对应的。

这个模型可能大量的标注数据来训练,其中每个文本单词或短语都与一组口型关键点相对应。

如果没有现成的模型,可能使用技术如序列到序列模型(Seq2Seq)或生成对抗网络(GAN)来训练自己的模型。

(4)面部动作迁移

使用如First Order Motion Model(FOMM)或类似的技术来迁移面部动作。

FOMM基于自监督学习,能够分离出源视频中的身份信息和目标视频中的动作信息。

通过将源图像的身份信息与目标视频的动作信息相结合,可以生成具有目标动作但保持源身份的新视频帧。

这个过程通常涉及到密集的光流估计、关键点转换和图像渲染等技术。

(5)口型同步

在面部动作迁移的基础上,将文本到口型映射的结果与迁移后的面部动作相结合,以实现口型的同步。

这可能将口型关键点的变化与面部动作迁移的结果进行融合,以确保口型的变化与文本内容一致。

可能还进行一些后处理步骤,如平滑处理、边界处理等,以提高生成视频的质量。

(6)视频生成和输出

将迁移后的面部动作和同步的口型与原始视频的背景相结合,生成最终的输出视频。

这可能涉及到图像合成、视频编码和压缩等技术。

最终的视频可以通过常见的视频格式(如MP4、AVI等)进行保存和分享。

4 测试过程

4.1 数据准备

面部检测数据:准备包含不同面部角度、光照条件、遮挡情况的图像和视频数据集。

语音识别数据:收集包含不同语音质量(如清晰、有噪声、不同语速等)的音频文件,并准备相应的文本标签用于验证。

面部动作迁移数据:准备源图像、目标视频和对应的音频文件,以模拟实际应用场景。

4.2 面部检测测试

使用面部检测算法在面部检测数据集上进行测试。

评估检测结果的准确性,包括召回率(检测到的面部数量与真实面部数量的比例)和精确率(检测到的面部中真实面部的比例)。

检查是否存在误检或漏检的情况,并尝试优化算法以提高性能。

4.3 语音识别测试

使用语音识别系统对语音识别数据集进行转录。

将转录结果与真实的文本标签进行比较,计算词错误率(WER)或字符错误率(CER)来评估识别的准确性。

分析识别错误的类型和原因,如噪声干扰、语速过快、发音不清晰等,并尝试通过调整模型参数或增加训练数据来提高识别性能。

4.4 文本到口型映射测试

准备一个包含文本和对应口型关键点变化的数据集。

使用文本到口型映射模型将文本转换为口型关键点变化。

将生成的口型关键点变化与真实的口型关键点变化进行比较,评估映射的准确性和可靠性。

如果可能的话,可以使用可视化工具来直观地检查生成的口型是否与文本内容相符。

4.5 面部动作迁移和口型同步测试

使用面部动作迁移系统对源图像和目标视频进行迁移。

在迁移过程中,将文本到口型映射的结果与面部动作迁移的结果相结合,实现口型的同步。

评估迁移后视频的视觉效果和口型同步的效果。

可以通过人工评估和定量指标(如结构相似性度量SSIM、峰值信噪比PSNR等)来评估视频质量。

检查是否存在不自然的面部动作或口型变化,并尝试优化迁移算法和同步机制以提高效果。

4.6 如何评估面部动作迁移的效果

评估面部动作迁移的效果通常涉及对比原始视频与迁移后视频的视觉质量、身份保持、表情真实性和动作一致性等方面。

如果迁移技术不够成熟或应用不当,可能会导致生成的面孔表情或动作显得不自然,甚至扭曲,给人带来不舒适的感觉。

在迁移过程中,如果处理不当,可能会导致原始面孔的身份特征丢失或被混淆,使得生成的面孔难以辨认或识别。

5 实验结果

5.1 技术整合与实现

首先通过语音识别技术将输入的语音或文本转化为音频特征,接着利用深度学习模型对音频特征进行处理,提取出与语音内容相关的关键信息。

在面部动作捕捉阶段,采用了面部关键点检测技术,能够准确识别并跟踪人脸的细微动作。通过将这些动作与从音频特征中提取的关键信息相结合,能够实现面部动作的迁移。

最后,利用口型同步技术,确保生成的面部动画与语音内容在时间上保持一致。通过调整面部动画的播放速度、口型形状等参数,能够使动画与语音内容完美同步。

5.2 最后结果

为了验证系统的性能,进行了一系列实验。在标准数据集上测试了语音识别技术的准确率,并发现其能够准确地将语音或文本转化为音频特征。接着利用深度学习模型对音频特征进行处理,并生成了与语音内容相关的面部动作。通过对比真实人脸动画和生成的动画,发现生成的动画在表情、口型等方面都非常逼真。

此外,还对生成的动画进行了口型同步的评估。结果表明口型同步技术能够有效地确保动画与语音内容在时间上保持一致。无论是快速讲话还是慢速讲话,系统都能够准确地调整动画的播放速度,以实现与语音内容的完美同步。

结论

本文所提出的方法成功地将深度学习、语音识别、面部动作捕捉以及口型同步技术融合在一起,实现了从语音或文本输入生成逼真的人脸动画,并确保其与语音内容完美同步。通过一系列实验验证和结果展示,证明了该系统的有效性和实用性。

首先,语音识别模块能够准确地将输入的语音或文本转化为音频特征,为后续的面部动作捕捉和口型同步提供了坚实的基础。

其次,面部动作捕捉模块通过先进的面部关键点检测技术,能够准确地识别并跟踪人脸的细微动作,包括表情变化和口型运动。这一步骤的准确性直接决定了最终生成的人脸动画的逼真程度。

最后,口型同步技术通过调整面部动画的播放速度、口型形状等参数,确保了动画与语音内容在时间上的完美同步。这不仅提高了用户体验,还使得生成的动画更加自然和流畅。

总的来说,本文的研究不仅推动了深度学习、语音识别、面部动作捕捉以及口型同步技术的融合与发展,还为相关领域的研究和应用提供了新的思路和方法。未来将进一步优化系统的性能,提高动画的逼真度和自然度,并探索更多应用场景,以推动该领域的发展。

参考文献

[1] 作者: Martín Abadi, et al. 文献题名:TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems 发布地方:GitHub仓库(https://github.com/tensorflow/tensorflow)

[2] 作者: Adam Paszke, et al. 文献题名:Automatic differentiation in PyTorch 发布地方: GitHub仓库(https://github.com/pytorch/pytorch)

[3] 作者: Baidu Research. 文献题名:DeepSpeech: Scaling up end-to-end speech recognition 发布地方: ArXiv

[4] 作者: Daniel Povey, et al. 文献题名:The Kaldi Speech Recognition Toolkit 发布地方: ASRU 2011 Tutorial

[5] 作者: Aliaksandr Siarohin, et al. 文献题名: First Order Motion Model for Image Animation 发布地方: ArXiv

[6] 作者: Arsha Nagrani, et al. 文献题名: VoxCeleb: A Large-scale Speaker Identification Dataset 发布地方: INTERSPEECH 2017

[7]作者: Elad Richardson, et al. 文献题名: Encoding in Style: a StyleGAN Encoder for Image-to-Image Translation 发布地方: ArXiv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语法分析-文法

如果对于一部文法中,存在至少一个句子有两个或者两个以上的语法树则该文法是二义性的。 我们可以以上面的例子进行解释,对于第棵个语法树,我们可以看到是先进行了加法运算再进行的乘法运算,因为需要先把EE作为整体运算完后再成为E…

上海亚商投顾:沪指低开低走 两市成交额跌破8000亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天震荡走低,三大股指尾盘均跌近1%。地产股逆势走强,光大嘉宝、天地源、云南城投…

幻兽帕鲁Palworld服务器手动+docker部署方法+备份迁移

目录 帕鲁部署官方文档帕鲁手动安装法手动安装steamcmd通过steamcmd安装帕鲁后端 docker容器一键部署幻兽帕鲁绿联云NAS机器部署幻兽帕鲁客户端连接附录1:PalServer.sh的启动项附录2:配置文件游戏存档保存和迁移 关于阿里云计算巢 帕鲁部署官方文档 htt…

学习MySQL(五):窗口函数

窗口函数介绍 窗口函数的引入是为了解决想要既显示聚集前的数据,又要显示聚集后的数据;窗口数对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 强调:使用MySQL …

​学者观察 | 从区块链应用创新看长安链发展——CCF区块链专委会荣誉主任斯雪明

导语 2024年1月27日,斯雪明教授在长安链发布三周年庆暨生态年会上发表演讲,认为在区块链发展过程中,不仅需要技术创新,同时需要有价值、有特色、有示范意义的应用创新。斯雪明教授介绍了国内区块链技术与应用发展的现状、趋势与挑…

【数据结构】排序(直接插入排序,希尔排序)

目录 一、排序的概念 二、常见的排序算法 三、插入排序 1.直接插入排序 1.直接插入排序实现 2.直接插入排序特性及复杂度 2.希尔排序 1.排序思路 2.希尔排序实现 3.希尔排序的特性及复杂度 一、排序的概念 排序:所谓排序,就是使一串记录&#x…

python手写数字识别(PaddlePaddle框架、MNIST数据集)

python手写数字识别(PaddlePaddle框架、MNIST数据集) import paddle import paddle.nn.functional as F from paddle.vision.transforms import Compose, Normalizetransform Compose([Normalize(mean[127.5],std[127.5],data_formatCHW)]) # 使用tran…

[Java基础揉碎]多线程基础

多线程基础 什么是程序, 进程 什么是线程 什么是单线程,多线程 并发, 并行的概念 单核cpu来回切换, 造成貌似同时执行多个任务, 就是并发; 在我们的电脑中可能同时存在并发和并行; 怎么查看自己电脑的cpu有几核 1.资源监视器查看 2.此电脑图标右键管理- 设备管理器- 处理器…

k8s 二进制安装 详细安装步骤

目录 一 实验环境 二 操作系统初始化配置(所有机器) 1,关闭防火墙 2,关闭selinux 3,关闭swap 4, 根据规划设置主机名 5, 做域名映射 6,调整内核参数 7, 时间同步 三 部署 dock…

uniapp vu3 scroll-view 滚动到指定位置

设置 scroll-view <scroll-view :scroll-y"true" :scroll-with-animation"true" :scroll-top"scrollTop" :style"height:${height}px"><view v-for"item in 10" :id"box${item}">box {{item}}</v…

原生IP介绍

原生IP&#xff0c;顾名思义&#xff0c;即初始真实IP地址&#xff0c;是指从互联网服务提供商获得的IP地址&#xff0c;IP地址在互联网与用户之间直接建立联系&#xff0c;不需要经过代理服务器代理转发。 原生IP具备以下特点。 1.直接性 原生IP可以直接连接互联网&#xff…

337_C++_内存对齐操作,内存分配、或其他需要数据对齐的场合中是很常见的操作

size_t ImagesCache::_alignSize(size_t srcSz, size_t alnSz) {if (0 == alnSz) {printf("[ImagesCache] Incorrect input parameters\n");return srcSz;

代码随想录算法训练营第五十四天

第二题我看了很久还是没太明白&#xff0c;我发现理解动规有一点点吃力了啊&#xff0c;努努力。 392.判断子序列 总感觉在不等于的时候&#xff0c;应该是dp[i][j] dp[i-1][j-2]; 这里其实按他那个图会更好理解一点。 class Solution { public:bool isSubsequence(string s, …

Gone框架介绍19 -如何进行单元测试?

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 请帮忙在github上点个 ⭐️吧&#xff0c;这对我很重要 &#xff1b;万分感谢&#xff01;&#xff01; 文章目录 单元测试…

CentOs安装

安装 开发工具 &#xff1a;GCC、 JDK、mysql 如果出现蓝屏&#xff0c;要在BIOS开启虚拟化支持&#xff0c;或者移除打印机。

Google:站长移除无效网址

当您的网址不需要呈现在Google站长中时&#xff0c;您可以在站长工具中移除网址 操作步骤&#xff1a;登录Google站长&#xff0c;绑定网站完成后&#xff0c;点击左侧删除 >> 输入网址 如果遇到一些网址&#xff0c;可以找寻网址间的规律&#xff0c;比如说&#xff0…

2024生日快乐祝福HTML源码

源码介绍 2024生日快乐祝福HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 2024生日快乐祝福HTML源码

Shell脚本 <<EOF ... EOF语法(Here Document)(特殊的输入重定向方式)(定界符)

文章目录 Here Document语法Here Document 的基本语法使用场景 关于定界符定界符不是变量定界符在 Here Document 中只是一个字符串&#xff0c;主要功能是标记输入文本的开始和结束&#xff0c;使用时应遵循最佳实践格式要求例子和说明如何使用定界符定界符可重复使用&#xf…

Spring数据访问全攻略:从JdbcTemplate到声明式事务

上文讲到 —— 航向数据之海&#xff1a;Spring的JPA与Hibernate秘籍 本文目录 四. JdbcTemplate的使用定义JdbcTemplate及其在Spring中的作用展示如何使用JdbcTemplate简化数据库操作1. 配置JdbcTemplate2. 使用JdbcTemplate查询数据3. 打印查询结果 五. Spring的事务管理介绍…

桥接模式

桥接模式&#xff1a;在这种模式下&#xff0c;虚拟机就像是局域网中一台独立的主机&#xff0c;能够访问网内任何一台机器。在桥接模式下&#xff0c;必须为虚拟系统手动配置IP地址、子网掩码&#xff0c;并且这些配置需要与宿主机器处于同一网段&#xff0c;以便虚拟系统和宿…