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

使用F5-tts复刻音色

最近第一人称视角的视频很火,想试试看复刻一下电视剧中某个角色的音色。看了下字节的API,嗯。。。138元一个音色,还不包括合成语音的费用,算了还是看看开源项目吧。

随便搜了搜,发现了两个项目一个是openvoice,另一个是F5-tts。openvoice看介绍感觉比较麻烦,所以直接试了F5-tts。

安装步骤

# 安装conda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh# 安装 Miniconda - Linux 版本安装脚本
bash Miniconda3-latest-Linux-x86_64.sh# 添加清华大学的 Anaconda 镜像源(free 频道)以加速下载
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/# 添加清华大学的 Anaconda 镜像源(main 频道)以加速下载
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/# 设置显示频道地址,便于查看包的来源
conda config --set show_channel_urls yes# 创建名为 f5-tts 的 conda 环境,指定 Python 版本为 3.10
conda create -n f5-tts python=3.10# 激活刚创建的 conda 环境
conda activate f5-tts# 从 GitHub 克隆 F5-TTS 代码库
git clone https://github.com/SWivid/F5-TTS.git# 进入 F5-TTS 项目目录
cd F5-TTS# 以可编辑模式安装项目,会自动安装 pyproject.toml 中定义的所有依赖
pip install -e .# 安装ffmpeg
sudo apt update
sudo apt install ffmpeg -y

复刻并生成指定的音频

# 指定端口
f5-tts_infer-gradio --port 7860 --host 0.0.0.0

打开网站后,操作界面如下,步骤很简单
在这里插入图片描述

第一次运行的时候会很慢,因为后台需要先下载对应的模型,生成音频后听了不满意的话,可以反复生成,直到满意为止,然后点击右上角的下载下来
在这里插入图片描述

项目源码阅读

Gradio框架

在这里插入图片描述

可以看到这些命令对应的代码入口,f5-tts_infer-gradio命令启动的就是一个Gradio web。

Gradio 是一个非常适合快速构建机器学习模型 Web 界面的 Python 库,学习它可以帮助你:

  • 快速搭建模型的交互式演示页面
  • 在本地或远程分享模型的 UI 界面
  • 用于调试和展示深度学习模型

通过简单的代码如下, 即可构建一个简单的交互页面

import gradio as grdef greet(name):return "Hello " + name + "!"with gr.Blocks() as demo:name = gr.Textbox(label="Name")output = gr.Textbox(label="Output Box")greet_btn = gr.Button("Greet")greet_btn.click(fn=greet, inputs=name, outputs=output, api_name="greet")demo.launch()

页面如下,简单的几行代码就完成了输入、调用函数返回结果、输出返回结果
在这里插入图片描述

回到项目代码中,可以看到web是这样组织得到的
在这里插入图片描述

找到对应button绑定click函数的代码
在这里插入图片描述

在 Gradio 中,函数返回值传递给 UI 组件的过程是通过事件处理系统完成的。以 F5-TTS 应用中的 basic_tts 函数为例:

@gpu_decorator
def basic_tts(ref_audio_input,ref_text_input,gen_text_input,remove_silence,randomize_seed,seed_input,cross_fade_duration_slider,nfe_slider,speed_slider,
):if randomize_seed:seed_input = np.random.randint(0, 2**31 - 1)audio_out, spectrogram_path, ref_text_out, used_seed = infer(ref_audio_input,ref_text_input,gen_text_input,tts_model_choice,remove_silence,seed=seed_input,cross_fade_duration=cross_fade_duration_slider,nfe_step=nfe_slider,speed=speed_slider,)return audio_out, spectrogram_path, ref_text_out, used_seed

事件绑定

generate_btn.click(basic_tts,inputs=[ref_audio_input,ref_text_input,gen_text_input,remove_silence,randomize_seed,seed_input,cross_fade_duration_slider,nfe_slider,speed_slider,],outputs=[audio_output, spectrogram_output, ref_text_input, seed_input],
)

值映射过程

  • 当点击 generate_btn 时,Gradio 调用 basic_tts 函数
  • 函数参数来自 inputs 列表中指定的 UI 组件的当前值
  • 函数返回一个元组,其中每个元素按顺序映射到 outputs 列表中的组件
  • 第一个返回值 audio_out 映射到 audio_output
  • 第二个返回值 spectrogram_path 映射到 spectrogram_output
  • 第三个返回值 ref_text_out 映射到 ref_text_input
  • 第四个返回值 used_seed 映射到 seed_input

语音模型

不是搞AI的,下面只记录些搜索来的基本概念,不保证是对的,仅个人观点

在 F5-TTS 项目中,主要提供了两个文本到语音 (TTS) 模型

  • F5-TTS
  • E2-TTS

F5-TTS

F5-TTS全称为"A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching"(使用流匹配技术生成流畅且忠实语音的讲故事者)这个模型采用了近年来在图像和语音生成中非常成功的 扩散模型(Diffusion Model) 框架。

扩散模型的本质是"先加噪声,再去噪声"

  • 训练阶段:把真实数据(如图像、语音)逐步添加噪声,直到变成接近纯噪声的形式(像模糊图、沙沙声等);
  • 生成阶段:从随机噪声出发,通过一个训练好的模型一步步“去噪”还原出真实数据

为什么叫“扩散”?
它借用了物理学中**扩散过程(Diffusion Process)**的概念。你可以把“加噪声”看作是一种扩散(从结构明确的数据变成无序的噪声),然后再反过来学习“反扩散”过程(从混乱中恢复秩序)。

E2-TTS

这里的E2 TTS 是一种 零样本语音合成(Zero-Shot TTS)模型。 这个搜出来的东西不多,有需要可以自己去看看论文
https://arxiv.org/abs/2406.18009

加载模型

在这里插入图片描述

web启动的时候,默认就会加载f5-tts模型。

"hf://..." 是一种 Hugging Face 模型资源路径的简写形式。它等价于标准 Hugging Face 文件地址,例如:

"hf://SWivid/F5-TTS/F5TTS_v1_Base/model_1250000.safetensors"

等价于

https://huggingface.co/SWivid/F5-TTS/resolve/main/F5TTS_v1_Base/model_1250000.safetensors

hugging face上找对应的模型

路径的结构是:

hf://<用户名>/<仓库名>/<子文件夹>/<文件名>

所以你访问的实际 URL 是:

https://huggingface.co/SWivid/F5-TTS/tree/main/F5TTS_v1_Base/

safetensors文件格式
.safetensors 是由 Hugging Face 推出的安全模型格式,主要用于替代 .pt 格式以防止 pickle 反序列化带来的安全风险。虽然不是 PyTorch 原生格式,但可以很好地与 PyTorch 一起使用,只需安装一个轻量库即可。

pip install safetensors

加载代码大致如下

from safetensors.torch import load_file
import torch
import torch.nn as nn# 定义模型
model = MyModel()  # 你自己的模型定义# 加载 safetensors 格式的参数
state_dict = load_file("model.safetensors")# 加载到模型中
model.load_state_dict(state_dict)
model.eval()

音频处理代码

这段代码实现了对参考音频的预处理操作,是 F5-TTS 系统中批量推理过程的重要组成部分。具体d代码如下:

audio, sr = ref_audio
if audio.shape[0] > 1:audio = torch.mean(audio, dim=0, keepdim=True)rms = torch.sqrt(torch.mean(torch.square(audio)))
if rms < target_rms:audio = audio * target_rms / rms
if sr != target_sample_rate:resampler = torchaudio.transforms.Resample(sr, target_sample_rate)audio = resampler(audio)
audio = audio.to(device)

这段代码确保了无论输入参考音频的格式、音量或采样率如何,都能被标准化为模型所期望的格式,从而提高语音合成的质量和一致性。

立体声转单声道处理

if audio.shape[0] > 1:audio = torch.mean(audio, dim=0, keepdim=True)
  • 检查音频是否为立体声(多个通道)
  • 如果是,通过对所有通道取均值将其转换为单声道
  • keepdim=True 保持张量维度结构一致

为什么转换?

  • 语音识别或模型训练时,大多数模型只支持单声道输入
  • 转换可以减少计算资源、统一数据形态

音量标准化

rms = torch.sqrt(torch.mean(torch.square(audio)))
if rms < target_rms:audio = audio * target_rms / rms
  • 计算音频的均方根(RMS)值,这是音频音量的度量
  • 如果音频 RMS 低于目标值 (target_rms,默认 0.1),则进行音量提升
  • 通过简单的比例缩放使音频达到标准音量水平
  • 注意:这里只对音量过低的音频进行提升,而不会降低过响的音频

采样率调整

if sr != target_sample_rate:resampler = torchaudio.transforms.Resample(sr, target_sample_rate)audio = resampler(audio)
  • 检查音频的采样率是否与目标采样率匹配(默认 24000Hz)
  • 如果不匹配,使用 torchaudio 的 Resample 转换器调整采样率
  • 这确保无论输入音频格式如何,模型始终处理相同采样率的音频

为什么要采样?
现实中声音是“连续”的,但计算机只能处理“离散数据”。

  • 采样就是将连续的声音波形,以一定频率转换成数字序列
  • 每秒采的点越多,声音保真度越高,但数据量越大

奈奎斯特定理(Nyquist Theorem)
为了完整还原频率为 f 的信号,采样率应至少为 2f .比如:人类听力最高大约 20kHz,采样率应不低于 40kHz → CD 采样率为 44.1kHz。

设备迁移

audio = audio.to(device)
  • 将音频张量移动到指定计算设备(GPU/CPU)
  • 确保后续计算在正确的设备上执行

音频张量是什么?
在深度学习中,“张量”就是多维数组(n 维矩阵)的统称。音频本质是:一段声音的数字采样值的序列。这些数字构成了张量结构,就称为“音频张量”。张量是深度学习的通用数据结构.

  • 可以直接送入神经网络模型
  • 支持 GPU 加速(.to('cuda')
  • 易于做各种运算(卷积、傅里叶变换、归一化、拼接等)

音频张量具体是什么样子的数据
(channels, samples) —— torchaudio 默认加载格式

  • channels: 有多少个声道?(1 = 单声道,2 = 立体声)
  • samples: 每个声道的采样点数量 = 时长 × 采样率
    举个例子: (2, 16000) 可以理解为“两个数组,每个数组里有 16000 个浮点数字,每个数字表示一小段声音的振幅。”
    [
    [左声道数据0, 左声道数据1, …,左声道数据16000],
    [右声道数据0, 右声道数据1, …,右声道数据16000]
    ]

为什么要移动?

  • PyTorch 的模型和数据必须在同一计算设备(CPU 或 GPU),否则会报错
  • GPU 运算速度远快于 CPU,适合大批量数据或深度模型

计算音频时长

动态时长计算(默认模式)

 # Calculate duration
ref_text_len = len(ref_text.encode("utf-8"))
gen_text_len = len(gen_text.encode("utf-8"))
duration = ref_audio_len + int(ref_audio_len / ref_text_len * gen_text_len / local_speed)

使用比例方法计算所需时长:ref_audio_len / ref_text_len * gen_text_len / local_speed

ref_audio_len 是参考音频时长,ref_text_len是参考文本长度,gen_text_len是要生成文本的长度,local_speed是语速

  • ref_audio_len / ref_text_len 计算参考音频的讲话速度(每个字节多少帧)
  • 乘以 gen_text_len得到生成文本按相同速度需要的帧数
  • 除以 local_speed调整语速(大于1加速,小于1减速)

这种计算方法确保了生成的语音保持与参考音频相似的讲话风格和速度,同时允许用户通过 speed参数灵活调整。

TTS 模型推理核心代码

这段代码是 F5-TTS 系统中语音生成的核心部分,实现了从文本到语音的转换过程。以下是详细解析:

# inference
with torch.inference_mode():generated, _ = model_obj.sample(cond=audio,text=final_text_list,duration=duration,steps=nfe_step,cfg_strength=cfg_strength,sway_sampling_coef=sway_sampling_coef,)del _generated = generated.to(torch.float32)  # generated mel spectrogramgenerated = generated[:, ref_audio_len:, :]generated = generated.permute(0, 2, 1)if mel_spec_type == "vocos":generated_wave = vocoder.decode(generated)elif mel_spec_type == "bigvgan":generated_wave = vocoder(generated)if rms < target_rms:generated_wave = generated_wave * rms / target_rms# wav -> numpygenerated_wave = generated_wave.squeeze().cpu().numpy()if streaming:for j in range(0, len(generated_wave), chunk_size):yield generated_wave[j : j + chunk_size], target_sample_rateelse:generated_cpu = generated[0].cpu().numpy()del generatedyield generated_wave, generated_cpu

生成梅尔频谱图

语音合成系统的后半部分流程:文本 → 梅尔频谱图 → 音频。 梅尔频谱图已经包含了要说的内容,语调、音色、速度等。梅尔频谱图可视化后长这个样子
在这里插入图片描述

下面的代码就是生成梅尔频谱图的代码,generated 是梅尔频谱图的张量表示

with torch.inference_mode():generated, _ = model_obj.sample(cond=audio,text=final_text_list,duration=duration,steps=nfe_step,cfg_strength=cfg_strength,sway_sampling_coef=sway_sampling_coef,)
  • torch.inference_mode(): 启用推理模式,禁用梯度计算以节省内存和提高速度
  • model_obj.sample(): 调用模型的采样方法,生成梅尔频谱图
    • cond=audio: 条件输入,即参考音频
    • text=final_text_list: 要生成的文本(已预处理,包含拼音转换)
    • duration: 计算得到的输出音频持续时间(帧数)
    • steps=nfe_step: 流匹配扩散模型的推理步数(默认32)
    • cfg_strength: 分类器引导强度,控制生成内容对条件的依赖程度
    • sway_sampling_coef: 摇摆采样系数,影响语音多样性

梅尔频谱图处理

generated = generated.to(torch.float32)  # generated mel spectrogram
generated = generated[:, ref_audio_len:, :]
generated = generated.permute(0, 2, 1)

有些模型输出是 float16 或其他精度,为了兼容 vocoder (声码器)等组件,这里转换为 float32

  • generated.to(torch.float32): 确保频谱图为浮点32位格式
  • generated[:, ref_audio_len:, :]: 裁剪掉参考音频部分,只保留生成的语音
  • generated.permute(0, 2, 1): 重新排列张量维度以匹配声码器的输入要求

声码器解码

Vocoder(声码器) 是一种把语音的“特征表示”还原成可听波形的工具或模型。它是语音合成系统(如 TTS、语音克隆、语音转换)中的最后一个步骤。它接受类似 梅尔频谱图 的特征图,输出“听得见的声音”。

if mel_spec_type == "vocos":generated_wave = vocoder.decode(generated)
elif mel_spec_type == "bigvgan":generated_wave = vocoder(generated)# wav -> numpy
generated_wave = generated_wave.squeeze().cpu().numpy()

两种声码器

  • vocos: 较新的神经声码器
  • bigvgan: NVIDIA的高质量声码器

这里声码器(vocoder)将梅尔频谱图转换为音频波形,得到的 generated_wave 是一个 PyTorch 张量(tensor)。张量转numpy的原因是后续的音频拼接、交叉淡入淡出等操作使用 NumPy 函数更方便

音量调整

if rms < target_rms:generated_wave = generated_wave * rms / target_rms
  • 只有当参考音频音量低于目标音量时才调整生成音频
  • 确保生成的音频与参考音频音量水平相匹配

转换为 NumPy 数组

generated_wave = generated_wave.squeeze().cpu().numpy()
  • squeeze(): 移除大小为1的维度
  • cpu(): 将张量从 GPU 移至 CPU
  • numpy(): 转换为 NumPy 数组以便后续处理

音频交叉淡入淡出拼接

在语音合成中,每句可能是分段生成的波形,例如一段文字生成了多个音频段

"你好,今天" → 波形A   
"过得怎么样?" → 波形B

这个时候就要使用交叉淡入淡出拼接多个音频,让合成的音频听起来更自然。

交叉淡入淡出(Crossfade) 是一种常用的音频拼接技术,用于平滑地连接多个音频片段,避免听起来突兀或出现明显断点。

可以理解为将两段音频在头尾处重叠在一起,例如,A音频5秒,B音频3秒直接拼接是一个8秒的C音频,交叉淡入淡出是将A最后一秒和B音频的头一秒重叠在一起,此时得到的是一个7秒的音频。
A音频最后一秒的音量是逐渐减弱的,B音频是从弱变强的。

 # 使用交叉淡入淡出技术拼接所有生成的波形final_wave = generated_waves[0]for i in range(1, len(generated_waves)):prev_wave = final_wavenext_wave = generated_waves[i]# 计算交叉淡入淡出的样本数,确保不超过波形长度cross_fade_samples = int(cross_fade_duration * target_sample_rate)cross_fade_samples = min(cross_fade_samples, len(prev_wave), len(next_wave))if cross_fade_samples <= 0:# 无法重叠,直接拼接final_wave = np.concatenate([prev_wave, next_wave])continue# 重叠部分prev_overlap = prev_wave[-cross_fade_samples:]next_overlap = next_wave[:cross_fade_samples]# 淡出和淡入权重fade_out = np.linspace(1, 0, cross_fade_samples)fade_in = np.linspace(0, 1, cross_fade_samples)# 创建交叉淡变的重叠部分cross_faded_overlap = prev_overlap * fade_out + next_overlap * fade_in# 组合最终波形new_wave = np.concatenate([prev_wave[:-cross_fade_samples], cross_faded_overlap, next_wave[cross_fade_samples:]])final_wave = new_wave# 创建合并的频谱图combined_spectrogram = np.concatenate(spectrograms, axis=1)

相关文章:

使用F5-tts复刻音色

最近第一人称视角的视频很火&#xff0c;想试试看复刻一下电视剧中某个角色的音色。看了下字节的API&#xff0c;嗯。。。138元一个音色&#xff0c;还不包括合成语音的费用&#xff0c;算了还是看看开源项目吧。 随便搜了搜&#xff0c;发现了两个项目一个是openvoice&#x…...

使用亮数据代理IP+Python爬虫批量爬取招聘信息训练面试类AI智能体(附完整源码)

文章目录 一、为什么要用代理IP&#xff1f;(重要&#xff01;)二、环境准备&#xff08;5分钟搞定&#xff09;三、爬虫核心代码解析&#xff08;含反反爬技巧&#xff09;四、数据清洗的3个关键步骤五、训练AI智能体的实战技巧六、法律风险防范&#xff08;必须看&#xff01…...

[软件工程]第二章题目汇总

1 [单选题] 原型化模型是&#xff08; &#xff09;。 A、适用于客户需求被明确定义的情况 B、很难产生有意义产品的一种冒险模型 C、提供一个精确表述的形式化规格说明 D、适用于客户需求难以清楚定义的情况 2 [单选题] 下列关于增量模型的说法正确的是&#xff08; &…...

Java EE进阶1:导读

1.发展历程 2.学习内容 前⾯的课程中,学习的是Java基础,JavaEE主要学习Java的应用,也就是学习Java在企业中是如何应用的 Java更多场景是业务开发,更狭义点可以理解为web开发.所以咱们的学习也是围绕着如何使用Java来做web开发 2.1 什么是Web开发&#xff1f; web&#xff08…...

Unity自定义shader打包SpriteAtlas图集问题

Unity打包图集还是有一些坑的&#xff0c;至于图集SpriteAtlas是什么请参考我之前写的文章&#xff1a;【Sprite Atlas】Unity新图集系统SpriteAtlas超详细使用教程_spriteatlas 使用-CSDN博客 问题&#xff1a; 今天碰到的问题是&#xff0c;shader绘制的时候&#xff0c;因…...

系统集成项目管理工程师学习笔记之启动过程组

第十章 启动过程组 制定项目章程 定义 制定项目章程是编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程。 正式批准的项目文件 作用 1、明确项目与组织战略目标之间的直接联系 2、确立项目的正式地位 3、展示组织对项目的承诺 本过程仅开展一…...

vscode 常用调试

一、文件执行 python script.py {"name": "Python 调试程序: 当前文件","type": "debugpy","request": "launch","program": "${file}","console": "integratedTerminal"…...

Java 07异常

异常 指的是程序在编译和执行的过程中&#xff0c;出现的非正常的情况&#xff1b; 当然语法错误并不属于错误异常体系 最大的Throwable; 分为两个&#xff1a;Error ExceptionError 严重级别问题 常见的 堆内存溢出 栈内存溢出Exception 分为两个子类 RuntimeException 运…...

2025年PMP 学习二十三 16章 高级项目管理

2025年PMP 学习二十三 16章 高级项目管理 文章目录 2025年PMP 学习二十三 16章 高级项目管理高级项目管理战略管理战略管理的组成要素&#xff1a;企业战略转化为战略行动的阶段&#xff1a; 组织战略类型战略组织类型组织级项目管理OPM&#xff08;公司项目管理&#xff09; 组…...

【Java高阶面经:微服务篇】1.微服务架构核心:服务注册与发现之AP vs CP选型全攻略

一、CAP理论在服务注册与发现中的落地实践 1.1 CAP三要素的技术权衡 要素AP模型实现CP模型实现一致性最终一致性(Eureka通过异步复制实现)强一致性(ZooKeeper通过ZAB协议保证)可用性服务节点可独立响应(支持分区存活)分区期间无法保证写操作(需多数节点可用)分区容错性…...

ISCC 2025决赛 wp

PWN Dilemma 64位程序没有开启PIE&#xff0c;并且过滤了execve&#xff0c;不能使用system这些的了&#xff0c;所以要考虑ORW来做 进入main函数分析&#xff0c;这里有两个函数一个func_1一个func_2。 这两个函数都有漏洞&#xff0c;以下是详细分析&#xff1a; 对于func…...

C++(5)switch语句 循环while

这是一个电影评分的程序 default 就是 如果上述的都没有执行 就统一的执行default的内容。 然后记得break ___________________________________ 循环 &#xff08;while&#xff09; while的使用方式 输出 0-9的while循环...

操作系统----软考中级软件工程师(自用学习笔记)

目录 1、计算机系统层次结构 2、程序顺序执行的特征 3、程序并发执行的特征 4、三态模型 5、同步与互斥 6、信号量机制 7、PV操作 8、死锁 9、进程资源图 10、死锁避免 11、线程 12、程序局部性原理 13、分页存储管理 14、单缓冲器 15、双缓冲区 16、磁盘调度算…...

利用Spring Boot和Redis构建高性能缓存系统

利用Spring Boot和Redis构建高性能缓存系统 引言 在现代Web应用中&#xff0c;缓存是提升系统性能的关键技术之一。Redis作为一种高性能的内存数据库&#xff0c;广泛应用于缓存场景。本文将介绍如何利用Spring Boot和Redis构建一个高性能的缓存系统&#xff0c;涵盖Redis的基…...

每日一题:1、虚拟IPv4地址转换为32位整数(JS)

题目背景 我们需要处理一种特殊的虚拟IPv4地址&#xff0c;这种地址由4个小节组成&#xff0c;每节之间用#分隔。与标准IPv4地址不同&#xff0c;虚拟IPv4地址的第一节范围是1~128&#xff0c;后三节的范围是0~255。我们需要将这种虚拟IPv4地址转换为一个唯一的32位整数。如果…...

[Vue]组件介绍和父子组件间传值

组件介绍 Vue3的 .vue文件中的主要部分分别分为三个&#xff1a;<template>、<script>、<style> <template>&#xff1a; 结构&#xff0c;相当于原html中的<head><body><footer>部分。原本的index.html现在只做一个容器&#xff0…...

Vue3 中使用 provide/inject 实现跨层级组件传值失败的原因及解决方案

1、基础用法 父组件&#xff1a; <script setup> import { ref, provide } from vue; import ChildComponent from ./ChildComponent.vue; const parentData ref(初始数据); // 提供数据 provide(parentData, parentData); </script>子组件&#xff1a; <sc…...

Git Hooks 和 自动生成 Commit Message

前言&#xff1a; 企业编程必须始终依赖流程&#xff0c;而不是个人。个人能力很重要&#xff0c;应该鼓励&#xff0c;但不能指望它&#xff0c;否则软件质量将不一致&#xff0c;没有可持续性。一旦顶级程序员跳槽&#xff0c;公司就会陷入困境。企业应该努力改进工作流程&am…...

【小明剑魔视频Viggle AI模仿的核心算法组成】

Viggle AI 作为一款先进的生成式视频AI工具&#xff0c;其核心技术栈融合了多项前沿算法。以下是深度解析其核心算法架构及实现原理&#xff1a; 一、核心算法组成 1. 运动控制生成&#xff08;Motion Control Generation&#xff09; 算法框架&#xff1a;基于扩散模型&…...

Linux学习心得问题整理(二)

day05 Linux基础入门 Linux语法解析 如何理解ssh远程连接?如何使用ssh使用远程连接服务&#xff1f; ssh进也称远程服务终端&#xff0c;常见连接方式可以包括windows和Linux两种方式 首先咱们使用windows窗口进行连接&#xff0c;这里就采用xshell连接工具来给大家做演示吧…...

百度网盘加速补丁v7.14.1.6使用指南|PC不限速下载实操教程

软件介绍 本加速补丁可突破百度网盘限速限制&#xff0c;无需会员、无次数限制&#xff0c;实测下载速度可达带宽峰值。 三步极速配置教程 1. 环境准备 → 卸载电脑原有百度网盘客户端&#xff08;避免冲突&#xff09; → 关闭杀毒软件/安全卫士&#xff08;防止误删补丁&am…...

RocketMQ消息拉取模式详解

RocketMQ提供了两种消息拉取模式&#xff0c;Pull模式&#xff08;主动拉取&#xff09;和 Push模式&#xff08;长轮询&#xff09;。 一、消息拉取模式分类 1. Pull模式&#xff08;主动拉取&#xff09; 特点&#xff1a;消费者主动向Broker发送请求拉取消息实现类&#…...

C++23 容器从其他兼容范围的可构造性与可赋值性 (P1206R7)

文章目录 背景与动机提案内容与实现细节提案 P1206R7实现细节编译器支持 对开发者的影响提高灵活性简化代码向后兼容性 总结 C23标准引入了对容器构造和赋值的新特性&#xff0c;这些特性使得容器能够更灵活地从其他兼容范围初始化&#xff0c;并支持从范围赋值。这些改进由提案…...

深入解析 HTTP 中的 GET 请求与 POST 请求​

在互联网的世界里&#xff0c;数据的传输与交互无时无刻不在发生。HTTP&#xff08;超文本传输协议&#xff09;作为 Web 应用的基石&#xff0c;承载着浏览器与服务器之间的通信重任。而 GET 请求和 POST 请求&#xff0c;作为 HTTP 协议中最为常用的两种请求方法&#xff0c;…...

华三(H3C)IRF堆叠心跳的LACP MAD、BFD MAD和ARP MAD差异

华三&#xff08;H3C&#xff09;IRF堆叠心跳的三种MAD&#xff08;多主检测&#xff09;机制——LACP MAD、BFD MAD和ARP MAD在实现原理、组网要求及适用场景上存在显著差异。以下是三者的对比分析&#xff1a; 一、核心区别对比 特性LACP MADBFD MADARP MAD检测原理扩展LAC…...

thread 的mutex优化

std::mutex mtx; int shared_data 0;void increment() {std::lock_guard<std::mutex> lock(mtx); // 自动加锁shared_data; // 临界区 } // 离开作用域时自动解锁std::lock_guard 在离开作用域时自动解锁的行为是基于 C 的 RAII (Resource Acquisition Is Initializa…...

深入解析前端 JSBridge:现代混合开发的通信基石与架构艺术

引言&#xff1a;被低估的通信革命 在移动互联网爆发式增长的十年间&#xff0c;Hybrid App&#xff08;混合应用&#xff09;始终占据着不可替代的地位。作为连接 Web 与 Native 的神经中枢&#xff0c;JSBridge 的设计质量直接决定了应用的性能上限与开发效率。本文将突破传…...

打破次元壁,VR 气象站开启气象学习新姿势​

在教育领域&#xff0c;VR 气象站同样发挥着巨大的作用&#xff0c;为气象教学带来了全新的模式&#xff0c;打破了传统教学的次元壁&#xff0c;让学生们以全新的姿势学习气象知识。​ 在传统的气象教学中&#xff0c;学生们主要通过课本、图片和老师的讲解来学习气象知识。这…...

python八股文汇总(持续更新版)

python装饰器 一、装饰器是什么&#xff1f; 装饰器是Python中一种"化妆师"&#xff0c;它能在不修改原函数代码的前提下&#xff0c;给函数动态添加新功能。 本质&#xff1a;一个接收函数作为参数&#xff0c;并返回新函数的工具。作用&#xff1a;像给手机贴膜…...

C#入门系列【基础类型大冒险】从0到1,解锁编程世界的“元素周期表”

C#入门系列【基础类型大冒险】从0到1&#xff0c;解锁编程世界的“元素周期表” 嘿&#xff0c;欢迎来到C#的奇妙世界&#xff01;如果把编程比作建造一座大厦&#xff0c;那么基础类型就是我们手中的“砖块”和“水泥”。它们看似普通&#xff0c;却构成了所有复杂程序的基石…...

物流项目第四期(运费模板列表实现)

前三期&#xff1a; 物流项目第一期&#xff08;登录业务&#xff09;-CSDN博客 物流项目第二期&#xff08;用户端登录与双token三验证&#xff09;-CSDN博客 物流项目第三期&#xff08;统一网关、工厂模式运用&#xff09;-CSDN博客 模板列表 在后台系统中&#xff0c…...

数据中心Overlay解决方案

文档围绕数据中心 Overlay 解决方案展开,指出数据中心向大集中、虚拟化、云业务演进,传统架构存在网络规划复杂、弹性不足、业务扩展受限等问题。Overlay 网络在物理网络上构建虚拟网络,实现名址分离、网络与物理解耦,支持业务灵活部署。方案采用VXLAN 技术(如 SDN 控制模…...

中级网络工程师知识点8

1.无线控制器&#xff1a;实现无线网络统一管理&#xff0c;无缝漫游 2.无线认证系统&#xff1a;实现用户使用用户名和密码认证登录&#xff0c;外来访客通过扫描二维码或者手机短信验证登录无线网络 3.POE交换机&#xff1a;实现无线AP的接入和供电 4.高密吸顶式AP&#x…...

【Linux笔记】——简单实习一个日志项目

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a; 【Linux笔记】——线程同步信号量与环形队列生产者消费者模型的实现(PV操作) &#x1f516;流水不争&#xf…...

BRIGHTONE : 520-On-Chain WOHOO Carnival

BRIGHTONE is launching the “520-On-Chain WooHoo Carnival,” and the very first blast of $WOOHOO goes live right on schedule—ushering in a new on-chain celebration of joy! ​At exactly 21:09 on May 20, the “520-On-Chain WooHoo Carnival” officially kicks…...

在Java项目中集成Deepseek大语言模型实践指南

1. 引言 随着人工智能技术的发展&#xff0c;大语言模型在各领域应用日益广泛。本文将详细介绍如何在Java项目中集成Deepseek大模型&#xff0c;实现智能文本生成、对话等功能。 2. 前期准备 准备Java Spring Boot项目环境确保Maven已配置注册Deepseek账号并获取API密钥 获取a…...

医疗影像中,DICOM点云、三角面片实体混合渲染(VR)

此文章&#xff0c;涉及到专业性比较强&#xff0c;所以&#xff0c;大部分的内容&#xff0c;基本上都是示例代码的形式出现。以下的技术路径&#xff0c;完全经过实践验证&#xff0c;并且效果很好&#xff0c;可以放心使用。 1 概述 在医学影像中&#xff0c;对DICOM的渲染…...

程序运行报错分析文档

zryhuawei:~/src/modules/Connect$ ./newbuild/OpConnectAidTool \WARNING: MYSQL_OPT_RECONNECT is deprecated and will be removed in a future version. replace into process_tracking (step_id,date,status,context_data,start_time,end_time,error_log) values(?,?,?…...

C++数据结构——红黑树

文章目录 一、背景二、关键操作1. 旋转2. 变色3. 查找4. 插入5. 删除 三、面试考点 一、背景 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff08;BST&#xff09;&#xff0c;通过颜色标记和旋转操作保证树的高度平衡&#xff0c;从而确保插入…...

【Java实战】线程池 并发 并行 生命周期(详细解释)

线程池&#xff1a; 一种复用线程的技术 不使用线程池的问题&#xff1a; 用户每提出一个需求&#xff0c;都要创建一个新的线程。 创建线程池的方法&#xff1a; JDK 5.0起提供了一个代表线程池的接口&#xff1a;ExecutorService。 方式一&#xff1a; 使用ExecutorServic…...

Qwen3多方位评测

一、Qwen3核心优势 结论&#xff0c;针对这些场景&#xff1a;上下文理解、任务编排、工具调用、数据要素抽取等环节&#xff0c;Qwen3-32B已接近DeepSeek-R1。 二、关键测试环节 1、上下文改写 Qwen3-32B对绝对时间语境理解优于Qwen2.5-72B。 其余改写方面&#xff0c;三…...

银行反欺诈理论、方法与实践总结(下):解决方案

一、金融反欺诈防控体系 反欺诈防控体系是金融机构应对欺诈风险的重要工具&#xff0c;它通常包括事前识别、事中决策和事后处置三个关键阶段。 事前识别阶段&#xff1a;此阶段涉及欺诈情报的收集和账户安全的保护&#xff0c;通过名单和画像的构建来识别潜在风险。例如&…...

自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models

Paperhttps://arxiv.org/pdf/2501.04699 Code (coming soon) 目录 方法 实验 EditAR是一个统一的自回归框架&#xff0c;用于各种条件图像生成任务——图像编辑、深度到图像、边缘到图像、分割到图像。 next-token预测的功效尚未被证明用于图像编辑。 EditAR主要构建在Ll…...

Java中的集合详解

下面是文章详细介绍了 Java 集合框架的基本思路、主要接口与实现、各类集合之间的区别与各自的适用场景&#xff0c;以及一些常见的使用技巧和最佳实践&#xff0c;供你参考。 Java中的集合详解 在 Java 开发中&#xff0c;集合&#xff08;Collection&#xff09;作为存储和操…...

前端mjs和js文件区别,mjs和cjs区别---.es.js和.mjs的区别

https://www.cnblogs.com/jocongmin/p/18432236 同一份配置如下,一般打包出来的结果时是一样的,只不过扩展名不一样 export default defineConfig({build: {rollupOptions: {output: [// 同一份配置&#xff0c;仅扩展名不同{ format: es, entryFileNames: [name].mjs },{ fo…...

【深度学习】Transformer 的应用

目录 一、自然语言处理领域 1、自然语言处理领域的应用 2、BART模型 3、BERTSum模型与自动文本摘要 4、SG-Net与机器阅读理解 5、SG-Net的应用 6、总结 二、计算机视觉领域 1、图像分类 &#xff08;1&#xff09;背景与挑战 &#xff08;2&#xff09;Transformer的…...

C#学习10——泛型

一、什么是泛型&#xff1f; 官方理解&#xff1a;允许开发者在定义类、接口、方法或委托时使用类型参数 个人理解&#xff1a; 类型模具&#xff08;类似Object变色龙&#xff09; 二、泛型有什么用&#xff1f; 通过参数化类型实现代码复用&#xff0c;提升类型安全性并…...

Spring Validation校验

使用 JSR 303 (Bean Validation) 校验接口参数 JSR 303&#xff0c;也称为Bean Validation规范&#xff0c;提供了一种在Java应用程序中执行验证的标准化方式。它允许你通过注解直接在领域或者DTO&#xff08;数据传输对象&#xff09;类上定义校验规则。 1. 添加依赖 首先需…...

精益数据分析(72/126):MVP的核心法则——消除阻碍与聚焦关键指标

精益数据分析&#xff08;72/126&#xff09;&#xff1a;MVP的核心法则——消除阻碍与聚焦关键指标 在创业领域&#xff0c;许多失败案例源于对产品开发的认知偏差——过度追求功能完善或盲目跟风增长&#xff0c;却忽略了用户核心需求的最直接满足。今天&#xff0c;我们结合…...

从头实现react native expo本地生成APK

根据github上老外的经验制作了一个react native expo项目起始模版,准备放到资源下载里(已经免积分放置好),这个起始模版带有个人非常喜欢的tailwindcss,由于raact native使用sheetstyle这种风格的样式,不太喜欢.当然,我们使用react native paper组件库时,就要对组件库里的组件使…...