WeNet:面向生产的流式和非流式端到端语音识别工具包
这篇文章介绍了WeNet,一个面向生产的开源端到端(E2E)语音识别工具包。WeNet的主要特点和贡献如下:
-
统一流式和非流式识别:提出了一种名为U2的两阶段框架,能够在单一模型中同时支持流式和非流式语音识别,解决了传统E2E模型难以同时支持这两种模式的问题。
-
模型架构:采用混合的连接主义时间分类(CTC)/注意力(AED)架构,使用Transformer或Conformer作为编码器,并通过动态块训练技术实现流式和非流式的统一。
-
生产就绪:WeNet的设计完全基于PyTorch及其生态系统,支持从模型训练到部署的无缝衔接,无需依赖Kaldi等其他工具,简化了安装和使用。
-
运行时优化:支持多种运行时平台(如x86服务器和ARM嵌入式设备),并通过量化技术显著提升了推理速度和效率。
-
实验验证:在AISHELL-1数据集和15,000小时的中文数据集上进行了广泛实验,验证了WeNet在流式和非流式模式下的性能,展示了其在实际应用中的潜力。
-
未来工作:WeNet已经支持自定义语言模型和基于gRPC的语音识别微服务框架,未来将继续更新更多功能。
WeNet通过统一流式和非流式识别、简化部署流程、优化运行时性能,提供了一个高效、轻量级的E2E语音识别解决方案,适用于从研究到生产的多种应用场景。这里是自己的论文阅读记录,感兴趣的话可以参考一下,如果需要阅读原文的话可以看这里,如下所示:
摘要
本文提出了一种名为WeNet的开源语音识别工具包,其中实现了一种名为U2的新两阶段方法,用于在单一模型中统一流式和非流式端到端(E2E)语音识别。WeNet的主要动机是缩小E2E语音识别模型在研究和部署之间的差距。WeNet提供了一种在实际场景中高效部署自动语音识别(ASR)应用的方法,这是其与其他开源E2E语音识别工具包的主要区别和优势。我们开发了一种混合的连接主义时间分类(CTC)/注意力架构,使用Transformer或Conformer作为编码器,并使用注意力解码器对CTC假设进行重评分。为了在统一模型中实现流式和非流式识别,我们采用了一种基于动态块的注意力策略,允许自注意力机制在随机长度的上下文中聚焦。我们在AISHELL-1数据集上的实验表明,与标准的非流式Transformer相比,我们的模型在非流式ASR中实现了5.03%的相对字符错误率(CER)降低。经过模型量化后,我们的模型在运行时具有合理的实时因子(RTF)和延迟。
官方开源项目地址在这里,如下所示:
1 引言
端到端(E2E)自动语音识别(ASR)模型在过去几年中获得了越来越多的关注,例如连接主义时间分类(CTC)[1, 2]、循环神经网络转录器(RNN-T)[3, 4, 5, 6]和基于注意力的编码器-解码器(AED)[7, 8, 9, 10, 11]。与传统的混合ASR框架相比,E2E模型的最大优势是其极其简化的训练过程。
最近的研究[12, 13, 14]也表明,E2E系统在标准词错误率(WER)上已经超越了传统的混合ASR系统。考虑到E2E模型的上述优势,将新兴的ASR框架部署到实际生产中变得非常必要。然而,部署E2E系统并不容易,有许多实际问题需要解决。
首先,流式问题。流式推理对于许多需要ASR系统快速响应且低延迟的场景至关重要。然而,某些E2E模型(如LAS[8]和Transformer[15])难以以流式方式运行。要么需要大量努力,要么会引入明显的准确性损失才能使这些模型以流式方式工作[16, 17, 18]。
其次,统一流式和非流式模式。流式和非流式系统通常是分开开发的。在单一模型中统一流式和非流式可以减少开发工作量、训练成本以及部署成本,这也是生产应用所偏好的[19, 20, 21, 22]。
第三,生产问题,这是我们在WeNet设计过程中最关心的问题。将E2E模型推广到实际生产应用需要大量努力。因此,我们必须仔细设计推理工作流程,包括模型架构、应用和运行时平台。由于自回归束搜索解码的工作方式,大多数E2E模型架构的工作流程极其复杂。此外,在边缘设备上部署模型时,还应考虑计算和内存成本。至于运行时平台,尽管有多种平台可以用于神经网络推理,如ONNX(Open Neural Network Exchange)、LibTorch in Pytorch、TensorRT[23]、OpenVINO、MNN[24]和NCNN,但仍需要语音处理和高级深度学习优化知识来为特定应用选择最佳平台。
在本工作中,我们提出了WeNet来解决上述问题。“We”在WeNet中受到“WeChat”的启发,意味着连接和共享,而“Net”则来自Espnet[25],因为我们参考了Espnet中的许多优秀设计。Espnet是最流行的开源端到端语音研究平台。它主要关注端到端ASR,并采用广泛使用的动态神经网络工具包Chainer和PyTorch作为主要的深度学习引擎。相比之下,WeNet的主要动机是缩小E2E语音识别模型在研究和生产之间的差距。基于面向生产的原则,WeNet采用了以下实现。首先,我们提出了一种新的两阶段框架,即U2,以解决统一流式和非流式问题。其次,从模型训练到部署,WeNet仅依赖于PyTorch及其生态系统。WeNet的关键优势如下:
-
生产优先且生产就绪:WeNet的Python代码符合TorchScript的要求,因此通过Torch Just In Time(JIT)可以直接导出训练好的模型,并使用LibTorch进行推理。研究和生产模型之间没有差距。
-
流式和非流式ASR的统一解决方案:WeNet采用U2框架,实现了一个准确、快速且统一的E2E模型,有利于工业应用。
-
便携式运行时:提供了多个运行时,展示了如何在不同平台上托管WeNet训练的模型,包括服务器(x86)和嵌入式(Android平台上的ARM)。
-
轻量级:WeNet专门为E2E语音识别设计,代码简洁明了,完全基于PyTorch及其生态系统。因此,它不依赖于Kaldi[26],简化了安装和使用。
我们的实验表明,WeNet是一个易于学习的语音识别工具包,提供从研究到生产的端到端解决方案。本文将描述模型架构、系统设计和运行时基准,包括实时因子(RTF)和延迟。
2 WeNet
模型架构
由于我们的目标是解决流式、统一和生产问题,解决方案应简单易构建,便于在运行时应用,同时保持良好的性能。
U2,一种统一的两阶段联合CTC/AED模型,为这些问题提供了一个很好的解决方案。如图1所示,U2由三部分组成:共享编码器、CTC解码器和注意力解码器。共享编码器由多个Transformer[15]或Conformer[27]层组成,仅考虑有限的右侧上下文以保持平衡的延迟。CTC解码器由一个线性层组成,将共享编码器的输出转换为CTC激活,而注意力解码器由多个Transformer解码器层组成。在解码过程中,CTC解码器在第一阶段以流式模式运行,注意力解码器在第二阶段用于提供更准确的结果。
2.1.1 训练
U2的训练结合了CTC损失和AED损失:
如前所述,当共享编码器不需要完整话语信息时,U2可以在流式模式下工作。我们采用动态块训练技术来统一非流式和流式模型。首先,输入通过固定的块大小C分割成多个块,每个块关注自身和所有先前的块,因此第一阶段的CTC解码器的整体延迟仅取决于块大小。当块大小受限时,模型以流式方式工作;否则,它以非流式方式工作。其次,块大小在训练中从1动态变化到当前训练话语的最大长度,因此训练好的模型学会以任意块大小进行预测。经验表明,较大的块大小会带来更好的结果,但延迟更高,因此我们可以在运行时通过调整块大小轻松平衡准确性和延迟。
2.1.2 解码
为了在研究阶段的Python解码过程中比较和评估联合CTC/AED模型的不同部分,WeNet支持四种解码模式:
-
attention:对模型的AED部分应用标准的自回归束搜索。
-
ctc_greedy_search:对模型的CTC部分应用CTC贪心搜索,CTC贪心搜索比其他模式快得多。
-
ctc_prefix_beam_search:对模型的CTC部分应用CTC前缀束搜索,可以给出n-best候选。
-
attention_rescoring:首先对模型的CTC部分应用CTC前缀束搜索以生成n-best候选,然后使用相应的编码器输出在AED解码器部分对n-best候选进行重评分。
在开发运行时阶段,WeNet仅支持attention_rescoring解码模式,因为这是我们生产中的最终解决方案。
系统设计
WeNet的整体设计栈如图2所示。注意,底层栈完全基于PyTorch及其生态系统。中间栈由两部分组成。当我们开发研究模型时,使用TorchScript进行模型开发,使用Torchaudio进行实时特征提取,使用分布式数据并行(DDP)进行分布式训练,使用Torch Just In Time(JIT)进行模型导出,使用PyTorch量化进行模型量化,并使用LibTorch进行生产运行时。LibTorch生产用于托管生产模型,设计用于支持各种硬件和平台,如CPU、GPU(CUDA)、Linux、Android和iOS。顶层栈展示了WeNet中典型的从研究到生产的流程。以下小节将详细介绍这些模块的设计。
2.2.1 数据准备
在数据准备阶段不需要任何离线特征提取,因为我们使用实时特征提取进行训练。WeNet只需要Kaldi格式的转录、波形列表文件和模型单元字典来创建输入文件。
2.2.2 训练
WeNet的训练阶段具有以下关键特性:
-
实时特征提取:基于Torchaudio,可以生成与Kaldi相同的Mel滤波器组特征。由于特征是从原始PCM数据实时提取的,我们可以在时间和频率级别对原始PCM进行数据增强,最后在特征级别进行增强,从而丰富数据的多样性。
-
联合CTC/AED训练:联合训练加快了训练的收敛速度,提高了训练的稳定性,并给出了更好的识别结果。
-
分布式训练:WeNet支持使用PyTorch中的分布式数据并行(DDP)进行多GPU训练,以充分利用多工作者的多GPU资源,实现更高的线性加速。
2.2.3 解码
提供了一组Python工具,用于识别波形文件并在不同解码模式下计算准确性。这些工具帮助用户在部署模型之前验证和调试模型。支持第2.1.2节中的所有解码算法。
2.2.4 导出
由于WeNet模型是使用TorchScript实现的,因此可以通过Torch JIT直接导出到生产环境中。然后,导出的模型可以使用LibTorch库在运行时托管,同时支持float-32模型和量化int-8模型。在嵌入式设备(如基于ARM的Android和iOS平台)上使用量化模型可以提高推理速度,甚至提高一倍以上。
2.2.5 运行时
目前,我们支持在两个主流平台上托管WeNet生产模型,即x86作为服务器运行时和Android作为设备运行时。为两个平台提供了C++ API库和可运行的演示,用户还可以使用C++库实现自定义系统。我们仔细评估了ASR系统的三个关键指标,即准确性、实时因子(RTF)和延迟。第3.2节中报告的结果将表明,WeNet适用于许多ASR应用,包括服务API和设备语音助手。
3 实验
我们在开源的中文普通话语音语料库AISHELL-1[28]上进行了实验,该语料库包含150小时的训练集、10小时的开发集和5小时的测试集。测试集总共包含7,176个话语。对于声学特征,通过Torchaudio实时计算80维对数Mel滤波器组(FBANK),窗口大小为25ms,步长为10ms。此外,应用了SpecAugment[29],使用最大频率掩码(F=10)的2个频率掩码和最大时间掩码(T=50)的2个时间掩码来缓解过拟合。在编码器前使用了两个卷积子采样层,核大小为3*3,步长为2。对于模型参数,我们使用12个Transformer层作为编码器,6个Transformer层作为解码器。使用Adam优化器,学习率计划为25,000个预热步骤。此外,我们通过平均训练期间在开发集上具有较低损失的前K个最佳模型来获得最终模型。
统一模型评估
我们首先评估了一个非流式模型(M1)作为基线,该模型通过全注意力进行训练和推理,另一个统一模型(M2)采用动态块策略。M2在解码时使用不同的块大小(full/16/8/4)进行推理,其中full表示全注意力非流式情况,16/8/4表示流式情况。
如表1所示,统一模型不仅在全注意力情况下与非流式模型显示出可比的结果,而且在流式情况下使用有限的块大小16/8/4也给出了有希望的结果,验证了动态块训练策略的有效性。
比较四种不同的解码模式,attention_rescoring模式在非流式模式和统一模式下始终能提高CTC结果。ctc_greedy_search和ctc_prefix_beam_search的性能几乎相同,并且随着块大小的减小,它们的性能显著下降。attention_rescoring模式缓解了ctc_prefix_beam_search结果的性能下降,而attention模式则略微降低了性能。
由于attention模式是自回归过程,而attention_rescoring模式不是,因此attention_rescoring模式更快且具有更好的RTF。总体而言,attention_rescoring模式不仅显示出有希望的结果,而且具有更低的RTF。因此,基于动态块的统一模型与attention_rescoring解码是我们生产中的选择。因此,运行时仅支持attention_rescoring模式。
运行时基准
本节将展示上述统一模型M2的量化、RTF和延迟基准。我们在服务器x86平台和设备ARM Android平台上分别完成了基准测试。
对于云x86平台,CPU为4核Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz,总内存为16G。仅使用一个线程进行CPU线程和TorchScript推理,因为云服务需要并行处理,单线程避免了并行处理中的性能下降。对于设备Android,CPU为4核高通骁龙865,内存为8G,单线程用于设备推理。
3.2.1 量化
这里我们仅比较量化前后的CER。如表2所示,量化前后的CER相当。表2中的CER结果与表1中的结果略有不同,因为表1中的结果是通过Python研究工具评估的,而表2中的结果是通过运行时工具评估的。
3.2.2 RTF
如表3所示,随着块大小的减小,RTF增加,因为较小的块需要更多的前向计算迭代。此外,量化可以在设备(Android)上带来约2倍的加速,在服务器(x86)上略有改善。
3.2.3 延迟
对于延迟基准,我们创建了一个WebSocket服务器/客户端来模拟真实的流式应用,因为此基准仅在服务器x86平台上进行。我们评估的平均延迟如下:
-
模型延迟(L1):由模型结构引入的等待时间。对于我们的基于块的解码,平均等待时间理论上为块大小的一半。我们模型的总模型延迟为(chunk/2∗4+6)∗10(ms),其中4是子采样率,6是编码器前两个CNN层引入的lookahead,10是帧移。
-
重评分成本(L2):第二阶段注意力重评分的时间成本。
-
最终延迟(L3):用户(客户端)感知的延迟,即用户停止说话与获得识别结果之间的时间差。当我们的ASR服务器接收到语音结束信号时,它首先对剩余语音进行CTC搜索,然后进行第二阶段的注意力重评分,因此重评分成本是最终延迟的一部分。网络延迟也应考虑在内,但由于我们在同一台机器上测试服务器/客户端,因此可以忽略不计。
如表4所示,不同块大小的重评分成本几乎相同,这是合理的,因为重评分计算与块大小无关。此外,最终延迟主要由重评分成本决定,这意味着我们可以通过减少重评分成本进一步减少最终延迟。最后,随着解码块从4变为8,从8变为16,最终延迟略有增加。
15,000小时任务
我们进一步使用从各种领域(包括脱口秀、电视剧、播客和广播)收集的15,000小时中文数据集训练提出的U2模型,以展示我们模型在工业规模数据集上的能力。该模型在三个测试集上进行评估。
我们使用Conformer[27]作为共享编码器,解码器与之前的实验相同,是一个Transformer。Conformer在Transformer的基础上增加了卷积模块,因此它可以捕捉局部和全局上下文,并在不同的ASR任务中获得更好的结果。特别地,因果卷积用于Conformer的块训练,我们添加了额外的3维音高特征,与80维FBANK连接。我们保持了之前实验中编码器的主要结构,仅将Transformer层更改为12个Conformer层,具有多头注意力(4个头)。每个Conformer层使用384个注意力维度和2048个前馈维度。此外,我们还使用了梯度累积来稳定训练,并每4步更新一次参数。此外,我们通过平均训练期间在评估集上具有较低损失的前10个最佳模型来获得最终模型。我们使用动态块训练训练了一个全上下文的Conformer CTC模型和一个U2模型。使用三个测试集评估这些模型,包括AISHELL-1、电视剧领域和对话领域。U2模型在attention_rescoring解码模式下工作,而Conformer模型在attention解码模式下工作。如表5所示,我们可以看到U2在总体上取得了与Conformer基线相当的结果,甚至在AISHELL-1测试集上使用全注意力进行推理时取得了更好的结果。当块大小为16时,CER并没有明显变差。
为了分析为什么U2模型在AISHELL-1任务上表现更好,我们收集了每个测试集中的平均话语时长,如表5所示。由于AISHELL-1中的平均话语时长比其他两个测试集长得多,AISHELL-1任务可能需要更强的全局信息建模能力。U2模型可以使用注意力解码器对CTC假设进行重评分,这使得它更适合AISHELL-1任务。
4 结论
我们提出了一种新的开源面向生产的E2E语音识别工具包,名为WeNet,提供了一个统一的流式和非流式应用解决方案。本文介绍了工具包背后的模型结构、系统设计和基准测试。整个工具包设计精良、轻量级,并在开放数据集和内部大型数据集上展示了出色的性能。WeNet已经在运行时支持自定义语言模型,采用了n-gram和WFST。此外,WeNet还支持基于gRPC的语音识别微服务框架应用。未来将更新更多功能。
相关文章:
WeNet:面向生产的流式和非流式端到端语音识别工具包
这篇文章介绍了WeNet,一个面向生产的开源端到端(E2E)语音识别工具包。WeNet的主要特点和贡献如下: 统一流式和非流式识别:提出了一种名为U2的两阶段框架,能够在单一模型中同时支持流式和非流式语音识别&…...
《我在技术交流群算命》(二):QGraphicsItem怎么写自定义信号啊(QObject多继承顺序问题)
某位群友突然无征兆的抛出以下问题: QGraphicsItem怎么写自定义信号啊 看到这个问题的时候我是比较疑惑的,按鄙人对 Qt 的了解,自定义信号只需: 继承QObject类中加入Q_OBJECT宏声明一个信号并使用 但该群友毕竟也不是一个Qt新手࿰…...
实践深度学习:构建一个简单的图像分类器
引言 深度学习在图像识别领域取得了巨大的成功。本文将指导你如何使用深度学习框架来构建一个简单的图像分类器,我们将以Python和TensorFlow为例,展示从数据准备到模型训练的完整流程。 环境准备 在开始之前,请确保你的环境中安装了以下工…...
实践:事件循环
实践:事件循环 代码示例 console.log(1); setTimeout(() > console.log(2), 0); Promise.resolve(3).then(res > console.log(res)); console.log(4);上述的代码的输出结果是什么 1和4肯定优先输出,因为他们会立即方式堆栈的执行上下文中执行&am…...
基于Python的医院预约挂号与诊断系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
计算机网络基础
文章目录 名词含义1.应用层1.1网络应用原理1.1.1网络应用体系1.1.2进程通信1.1.3可供程序使用的运输服务1.1.4因特网的运输服务1.1.5应用层协议 1.2WEB和HTTP1.2.1HTTP概述1.2.2持续与非持续连接1.2.3报文格式 名词含义 ISP(Internet Service Provider,因特网服务提…...
Rabbitmq追问1
如果消费端代码异常,未手动确认,那么这个消息去哪里 2024-12-31 21:19:12 如果消费端代码发生异常,未手动确认(ACK)的情况下,消息的处理行为取决于消息队列的实现和配置,以下是基于 RabbitMQ …...
基于SpringBoot和OAuth2,实现通过Github授权登录应用
基于SpringBoot和OAuth2,实现通过Github授权登录应用 文章目录 基于SpringBoot和OAuth2,实现通过Github授权登录应用0. 引言1. 创建Github应用2. 创建SpringBoot测试项目2.1 初始化项目2.2 设置配置文件信息2.3 创建Controller层2.4 创建Html页面 3. 启动…...
python数据分析:使用pandas库读取和编辑Excel表
使用 Pandas,我们可以轻松地读取和写入Excel 文件,之前文章我们介绍了其他多种方法。 使用前确保已经安装pandas和 openpyxl库(默认使用该库处理Excel文件)。没有安装的可以使用pip命令安装: pip install pandas ope…...
SpringCloud源码分析-Lettue Redis
redis connection异步发送 底层是nio channel...
Linux(13)——网络概述
目录 一、TCP/IP 网络模型: 1、应用层(Application): 2、传输层(Transport): 3、互联网层(Internet or network): 4、链路层(Link࿰…...
PHP框架+gatewayworker实现在线1对1聊天--聊天界面布局+创建websocket连接(5)
文章目录 聊天界面布局html代码 创建websocket连接为什么要绑定? 聊天界面布局 在View/Index目录下创建index.html html代码 <div id"chat"><div id"nbar"><div class"pull-left">与牛德胜正在聊天...</div…...
Qos的详细解释
QoS(Quality of Service),即服务质量,是一种用于网络管理的技术,旨在确保不同类型的数据流(如语音、视频、文件传输等)在网络中按优先级和要求得到适当的带宽、延迟、抖动和丢包率等服务&#x…...
未来20年在大语言模型相关研究方向--大语言模型的优化与改进
未来20年在大语言模型相关研究方向 模型性能优化 模型架构创新:研究新型的模型架构,如探索更高效的Transformer变体、融合递归神经网络(RNN)和卷积神经网络(CNN)的优点,以提高模型的性能、可扩展性和适应性,满足不同应用场景对模型效率和效果的要求。高效训练算法:开…...
【Vue】vue-router使用addRoute动态加载路由后刷新页面404
场景:动态加载路由,点击菜单路由跳转正常,但刷新页面报404 原因:使用404做异常路由捕获 刷新页面会导致路由丢失,重建路由时先加载了静态路由(包含异常路由捕获404),此时动态路由还未…...
《计算机组成及汇编语言原理》阅读笔记:p177-p177
《计算机组成及汇编语言原理》学习第 13 天,p177-p177 总结,总计 1 页。 一、技术总结 1.real mode A programming model where the program has access to the entire capability of the machine, bypassing security and memory management. Useful…...
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举
本篇博客将聚焦于通过递归来实现两种经典的枚举方法:指数型枚举和排列型枚举。这两种枚举方式在计算机科学和算法竞赛中都有广泛应用,无论是在解题中,还是在实际工作中都极具价值。 目录 前言 斐波那契数列递归 递归实现指数型枚举 算法思…...
游泳溺水识别数据集,对25729张图片进行YOLO,COCO JSON, VOC XML 格式的标注,溺水平均识别率在89.9%
游泳溺水识别数据集,对25729张图片进行YOLO,COCO JSON, VOC XML 格式的标注,溺水识别率在92% 训练结果 数据集和标签 验证 游泳测试视频 根据测试的视频来获取检测结果: 游泳测试视频的置信度设置60% 检测结果如下&…...
coredns报错plugin/forward: no nameservers found
coredns报错plugin/forward: no nameservers found并且pod无法启动 出现该报错原因 是coredns获取不到宿主机配置的dns地址 查看宿主机是否有dns地址 resolvectl status 我这里是配置正确后,如果没配置过以下是不会显示出dns地址的 给宿主机增加静态dns地址之后将…...
【欢迎讨论方案一的可行性】SpringBoot集成netty,在handler中调用@Component注解的类
在Netty中处理请求时,调用一个由Spring Boot管理的Component注解的类 在Netty中处理请求时,调用一个由Spring Boot管理的Component注解的类,需要确保Spring上下文能够正确地注入这些组件。 方法一:使用Autowired注入Spring组件 …...
如何在LaTeX文档中为脚注添加横线,并调整横线的长度和厚度。
当然,以下是一个简单的例子,展示了如何在LaTeX文档中使用scrextend宏包来为脚注添加横线,并调整横线的长度和厚度。 ### 步骤1:导入scrextend宏包 在你的LaTeX文档的导言区(\begin{document}之前的部分)&…...
【C语言】可移植性陷阱与缺陷(三):整数的大小
目录 一、概述 二、整数类型的大小差异 三、 跨平台代码中的整数大小问题 3.1. 内存使用 3.2. 性能问题 3.3. 数据截断 3.4. 序列化/反序列化 四、解决整数大小问题的策略 4.1. 使用固定大小的整数类型 4.2. 条件编译 4.3. 避免假设 4.4. 文档化 五、总结 在C语言编…...
nginx基础篇 - 控制命令详解:启动/停止、配置文件检查/重新加载、nginx平滑升级
文章目录 1. nginx命令2 使用Unix工具发送信号3 常用操作3.1 检查配置文件3.2 启动nginx3.3 停止nginx3.4 重启nginx 4 平滑升级nginx 1. nginx命令 执行nginx -h命令可以看到所有的nginx命令及其解释: nginx命令使用方法: nginx [-?hvVtTq] [-s signal] [-p p…...
汽车驾校转型做无人机执照培训详解, “驾” 起无人机培训新未来?
汽车驾校转型做无人机执照培训,这一趋势确实在一定程度上预示着无人机培训领域的新未来。以下是对这一转型的详细分析: 一、转型背景 1. 无人机行业快速发展: 无人机技术在农业、影视、安防、物流等多个领域的应用不断拓展,市场…...
如何科学评估与选择新版本 Python 编程语言和工具
文章目录 摘要引言评估新版本的关键因素适用性评估成本与收益分析 新版本功能的实际应用示例代码模块详细解析示例代码模块代码模块解析实际应用场景如何运行与配图 QA环节总结参考资料 摘要 随着技术的快速发展,编程语言和软件工具不断推出新版本,带来…...
TS中的enum变量和普通object区别
文章目录 一、定义二、编译后的输出三、类型安全四、使用场景五、混合使用 这两种数据经常混用,但是也有一定区别,特殊情况下混用会报错 一、定义 enum变量通常用使用常量object则没有限制值的类型 // 案例 enum Direction {Up,Down,Left,Right } const …...
SOT23-6封装小功率H桥常用直流电机、磁保持继电器驱动芯片大全
H桥常用直流电机、磁保持继电器驱动芯片大全 前言替换规则 引脚定义1:GR6205 | 2~5.5V | 200mAFM116C | 2.5V~5V | 500mATMI8118 | 1.6V~7.2V | 1.35AMX116L | 2~7V | 500mAMX116H | 2~8V | 800/1000 mAHT7K1201 | 1.8…...
Spring中的反射
反射是框架设计的灵魂,它可以使框架更加灵活和可扩展。框架是一种半成品软件,可以在其基础上进行软件开发,极大地简化了编码过程。而反射机制则是将类的各个组成部分封装为其他对象,对类进行解剖。通过反射,我们可以在…...
5.12--DenseNet
1.网络结构介绍 DenseNet最大的特点是对相同大小的特征图来说,每一层都与前馈层和后序层相连,以及两层之间是拼接起来的而不是简单的相加。该网络主要由Dense块和Transition层组成。 结构介绍: 密集连接:每层都和前馈层和后面的…...
PeaZip:支持200+格式,跨平台解压工具,安全又高效
PeaZip 作为一款功能全面的压缩工具,不仅完全免费且开源,兼容多种主流操作系统,包括 Windows、Linux 和 macOS。它不仅支持常见的压缩格式如 ZIP、RAR、7Z、TAR 和 GZIP,还能处理超过 200 种不同的文件格式,满足用户多…...
go项目使用gentool生成model的gen.go问题
Gen Tool 是一个没有依赖关系的二进制文件,可以用来从数据库生成结构。 使用方法: go install gorm.io/gen/tools/gentoollatest在项目根目录,执行连接的数据库中指定某几张表结构生成数据库model层 gentool -dsn "root:123456tcp(localhost:330…...
物理知识1——电流
说起电流,应该从电荷说起,而说起电荷,应该从原子说起。 1 原子及其结构 常见的物质是由分子构成的,而分子又是由原子构成的,有的分子是由多个原子构成,有的分子只由一个原子构成。而原子的构成如图1所示。…...
VDSuit-FuLL全身惯性动捕设备在人形机器人遥操作的具体应用
随着具身智能的火热,人形机器人遥操作的话题又回到了大众视野。人形机器人的遥操作有众多实现方案,其中基于动作捕捉设备进行人形机器人的遥操作成为了目前业内讨论较多的方向。动作捕捉指的是一种可以实时跟踪、记录、重建角色运动轨迹,并将…...
从零开始学TiDB(8) TiFlash 主要架构
一.TiFlash的主要架构 二.TiFlash 主要功能 1.异步复制 2.一致性读取 T0 时刻从客户端写入两行数据 k1 value100 k999 value7 分别写入到了两个region,并且产生raft log 此时TiFlash还没有TiKV的这两行数据 此时TiFlash同步了key1 value100的数据 还没有同步 …...
LeetCode题解:2625. 扁平化嵌套数组,递归
原题链接 https://leetcode.cn/problems/flatten-deeply-nested-array/ 题目解析 题目要求我们将一个多维数组扁平化到指定的深度。具体来说,我们需要将数组中的子数组扁平化,直到达到给定的深度n。如果子数组的深度大于n,则不进行扁平化。…...
基于深度学习的视觉检测小项目(五) 项目真正的开端
之前的所有都是项目概况和基础知识的铺垫,从今天开始真正进入项目。 首先明确一下项目的流程: • 任务分解分块,并作出每一块的大致功能规划 • 拆解工种,任务分派,约定工种间的接口方式和数据交互方式 • 按照任务块…...
使用ExecutorService和@Async来使用多线程
文章目录 使用ExecutorService和Async来使用多线程采用ExecutorService来使用多线程多线程过程的详细解释注意事项优点 使用Async来使用多线程对比Async和ExecutorService的多线程使用方式使用 ExecutorService 的服务类使用 Async 的服务类异步任务类自定义线程池主应用类解释…...
ArcGIS基础:使用【标识】工具完成分区统计线要素的长度
如上所示,有某个地区的部分管线数据,都是一些线要素。 如上所示,这片区域有好几个管理员,并有自己的管辖范围,现在需要根据这个范围,简单统计一下各自管理员(张三、李四、王五)范围内…...
专业高程转换工具 | 海拔高度与椭球高度在线转换系统
海拔高度转换工具:专业的高程转换系统 在线体验 立即使用 欢迎访问我的博客:https://cdtools.click,这里有更多实用的工具和技术分享。 工具背景 在测绘、工程、GIS 等领域,经常需要处理不同高程系统之间的转换。最常见的需求…...
springboot自定义注解的使用
目录 背景分析代码 背景 需求:对现有系统中所有数据库表都建立一张对应的备份表;在对主表进行增加,修改,删除操作的同时对备份表进行相同的操作。首先想到的应该是备份一个数据库就完事了~不过实际情况没这么简单,总之…...
Wallpaper壁纸制作学习记录13
骨骼物理模拟 Wallpaper Engine还允许您为人偶变形骨骼配置某些物理模拟。选择骨骼时,点击编辑约束来配置骨骼这些属性。 警告 请记住,物理模拟可能会根据用户的最大FPS设置略微改变其行为。 Wallpaper Engine编辑器将始终以高帧速率渲染。您可以将壁纸…...
Linux系统离线部署MySQL详细教程(带每步骤图文教程)
1、登录官网下载对应的安装包 MySQL :: Developer Zone 2、将压缩包上传到服务器上,这里直接上传到/usr/local路径上 使用sftp工具上传到/usr/local目录上 3、解压压缩包 tar -xf mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz 4、将mysql-8.0.39-linux-glibc2.17…...
慧集通iPaaS集成平台低代码训练-实践篇
练习使用帐号信息: 1.致远A8平台(请自行准备测试环境) 慧集通连接器配置相关信息 访问地址: rest账号:rest rest密码: OA账号: 2.云星空(请自行准备测试环境) 连接…...
C程序设计:计算球的体积
问题:根据输入的半径值,计算球的体积。…...
AWS re:Invent 2024 - Dr. Werner Vogels 主题演讲
今年,我有幸亲临现场参加了所有的 keynote,每一场都让我感受到深深的震撼。无论是全新的功能发布,还是令人眼前一亮的新特性展示,每一场 keynote 都精彩纷呈,充满干货,值得反复学习和回味。 恰好ÿ…...
如何使用 `uiautomator2` 控制 Android 设备并模拟应用操作_VIVO手机
在 Android 自动化测试中,uiautomator2 是一个非常强大的工具,能够帮助我们通过 Python 控制 Android 设备执行各种操作。今天,我将通过一个简单的示例,介绍如何使用 uiautomator2 控制 Android 设备,执行特定的应用启动、广告跳过以及其他 UI 操作。此示例的目标是自动化…...
分析服务器 systemctl 启动gozero项目报错的解决方案
### 分析 systemctl start beisen.service 报错 在 Linux 系统中,systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时,如果服务启动失败,systemctl 会输出错误信息,帮助我们诊断和解决问题。 本文将通过一个实际的…...
UE蓝图战利品掉落动画
战利品掉落动画,其实就是添加个冲量 add impulse 什么是冲量? 冲量 (impulse)是作用在物体上的力 在 时间上的累积效果...
Singleton: WebRTC中ThreadManager中的单例模式
1. 什么是单例模式: 旨在确保一个类只有一个实例,并提供全局访问点。 应用场景:需要一个全局唯一的实例,避免资源浪费。 2. 单例模式的实现: Lazy Initialization(懒汉式)(延迟初…...
node.js之---CommonJS 模块
CommonJS概念 在 Node.js 中,CommonJS 是一种模块化规范,它定义了如何在 JavaScript 中创建和使用模块。CommonJS 是 Node.js 使用的默认模块系统。它让开发者能够分离代码,便于重用和维护。 CommonJS 模块的基本特性 模块导出 在 CommonJ…...