Interspeech 2023 | 火山引擎流媒体音频技术之语音增强和AI音频编码

news2025/1/24 22:52:05

背景介绍

为了应对处理各类复杂音视频通信场景,如多设备、多人、多噪音场景,流媒体通信技术渐渐成为人们生活中不可或缺的技术。为达到更好的主观体验,使用户听得清、听得真,流媒体音频技术方案融合了传统机器学习和基于AI的语音增强方案,利用深度神经网络技术方案,在语音降噪、回声消除、干扰人声消除和音频编解码等方向,为实时通信中的音频质量保驾护航。

作为语音信号处理研究领域的旗舰国际会议,Interspeech一直代表着声学领域技术最前沿的研究方向,Interspeech 2023 收录了多篇和音频信号语音增强算法相关的文章,其中,火山引擎流媒体音频团队共有 4 篇研究论文被大会接收,论文方向包括语音增强、基于AI编解码 、回声消除、无监督自适应语音增强

值得一提的是,在无监督自适应语音增强领域,字节跳动与西工大联合团队在今年的CHiME (Computational Hearing in Multisource Environments) 挑战赛子任务无监督域自适应对话语音增强(Unsupervised domain adaptation for conversational speech enhancement, UDASE) 获得了冠军(https://www.chimechallenge.org/current/task2/results)。CHiME挑战赛是由法国计算机科学与自动化研究所、英国谢菲尔德大学、美国三菱电子研究实验室等知名研究机构所于2011年发起的一项重要国际赛事,重点围绕语音研究领域极具挑战的远场语音处理相关任务,今年已举办到第七届。历届CHiME比赛的参赛队伍包括英国剑桥大学、美国卡内基梅隆大学、约翰霍普金斯大学、日本NTT、日立中央研究院等国际著名高校和研究机构,以及清华大学、中国科学院大学、中科院声学所、西工大、科大讯飞等国内顶尖院校和研究所。

本文将介绍这 4 篇论文解决的核心场景问题和技术方案,分享火山引擎流媒体音频团队在语音增强,基于AI编码器,回声消除和无监督自适应语音增强领域的思考与实践。

基于可学习梳状滤波器的轻量级语音谐波增强方法

论文地址:https://www.isca-speech.org/archive/interspeech_2023/le23_interspeech.html

背景

受限于时延和计算资源,实时音视频通信场景下的语音增强,通常使用基于滤波器组的输入特征。通过梅尔和ERB等滤波器组,原始频谱被压缩至维度更低的子带域。在子带域上,基于深度学习的语音增强模型的输出是子带的语音增益,该增益代表了目标语音能量的占比。然而,由于频谱细节丢失,在压缩的子带域上增强的音频是模糊的,通常需要后处理以增强谐波。RNNoise和PercepNet等使用梳状滤波器增强谐波,但由于基频估计以及梳状滤波增益计算和模型解耦,它们无法被端到端优化;DeepFilterNet使用一个时频域滤波器抑制谐波间噪声,但并没有显式利用语音的基频信息。针对上述问题,团队提出了一种基于可学习梳状滤波器的语音谐波增强方法,该方法融合了基频估计和梳状滤波,且梳状滤波的增益可以被端到端优化。实验显示,该方法可以在和现有方法相当的计算量下实现更好的谐波增强。

模型框架结构

基频估计器(F0 Estimator)

为了降低基频估计难度并使得整个链路可以端到端运行,将待估计的目标基频范围离散化为N个离散基频,并使用分类器估计。添加了1维代表非浊音帧,最终模型输出为N+1维的概率。和CREPE一致,团队使用高斯平滑的特征作为训练目标,并使用Binary Cross Entropy作为损失函数:

ccf651f2dea93e461c6c63dab70308de.png 7b5994b3b7a443e2f75f7aa8b0735b67.png

可学习梳状滤波器(Learnable Comb Filter)

对上述每一个离散基频,团队均使用类似PercepNet的FIR滤波器进行梳状滤波,其可以表示为一个受调制的脉冲串:

cb8fe5838bb459c0149b51d0ffc750aa.png

在训练时使用二维卷积层(Conv2D)同时计算所有离散基频的滤波结果,该二维卷积的权重可以表示为下图矩阵,该矩阵有N+1维,每一维均使用上述滤波器初始化:

70f106c24a62b810069a0b00fff81752.png

通过目标基频的独热标签和二维卷积的输出相乘得到每一帧基频对应的滤波结果:

94b1b08fe7ca1090a2c81614690fa5e9.png c2f19a1991b7ddffee645cb7ce462ee9.png

谐波增强后的音频将和原始音频加权相加,并和子带增益相乘得到最后的输出:

35d09757603b7883c470a04372599cf2.png

在推断时,每一帧仅需要计算一个基频的滤波结果,因此该方法的计算消耗较低。

模型结构

5c91676ca45f86cd2ac3cf5ca4c69d41.png

团队使用双路卷积循环神经网络(Dual-Path Convolutional Recurrent Network, DPCRN)作为语音增强模型主干,并添加了基频估计器。其中Encoder和Decoder使用深度可分离卷积组成对称结构,Decoder有两个并行支路分别输出子带增益G和加权系数R。基频估计器的输入是DPRNN模块的输出和线性频谱。该模型的计算量约为300 M MACs,其中梳状滤波计算量约为0.53M MACs。

模型训练

在实验中,使用VCTK-DEMAND和DNS4挑战赛数据集进行训练,并使用语音增强和基频估计的损失函数进行多任务学习。

a425f1c6649edf04bfa461663327cf5a.png 270a54f05c16b7704df70ae7bb79ac4e.png

实验结果

流媒体音频团队将所提出的可学习梳状滤波模型和使用PercepNet的梳状滤波以及DeepFilterNet的滤波算法的模型进行对比,它们分别被称作DPCRN-CF、DPCRN-PN和DPCRN-DF。在VCTK测试集上,本文提出的方法相对现有方法均显示出优势。

e05339f73242220f2787b9d0718c83c0.jpeg

同时团队对基频估计和可学习的滤波器进行了消融实验。实验结果显示,相对于使用基于信号处理的基频估计算法和滤波器权重,端到端学习得到的结果更优。

73f2db6b918b71e1593cd6659310671f.jpeg

基于Intra-BRNN 和GB-RVQ 的端到端神经网络音频编码器

论文地址:https://www.isca-speech.org/archive/pdfs/interspeech_2023/xu23_interspeech.pdf

背景

近年来,许多神经网络模型被用于低码率语音编码任务,然而一些端到端模型未能充分利用帧内相关信息,且引入的量化器有较大量化误差导致编码后音频质量偏低。为了提高端到端神经网络音频编码器质量,流媒体音频团队提出了一种端到端的神经语音编解码器,即CBRC(Convolutional and Bidirectional Recurrent neural Codec)。CBRC使用1D-CNN(一维卷积) 和Intra-BRNN(帧内双向循环神经网络) 的交错结构以更有效地利用帧内相关性。此外,团队在CBRC中使用分组和集束搜索策略的残差矢量量化器(Group-wise and Beam-search Residual Vector Quantizer,GB-RVQ)来减少量化噪声。CBRC以20ms帧长编码16kHz音频,没有额外的系统延迟,适用于实时通信场景。实验结果表明,码率为3kbps的 CBRC编码语音质量优于12kbps的Opus。

模型框架结构

5dfe1651aac3e343de02f93f55d9d4d8.png CBRC总体结构

Encoder和Decoder网络结构

Encoder采用4个级联的CBRNBlocks来提取音频特征,每个CBRNBlock由三个提取特征的ResidualUnit和控制下采样率的一维卷积构成。Encoder中特征每经过一次下采样则特征通道数翻倍。在ResidualUnit中由残差卷积模块和残差双向循环网络构成,其中卷积层采用因果卷积,而Intra-BRNN中双向GRU结构只处理20ms帧内音频特征。Decoder网络为Encoder的镜像结构,使用一维转置卷积进行上采样。1D-CNN和Intra-BRNN的交错结构使Encoder和Decoder充分利用20ms音频帧内相关性而不引入额外的延时。

2da413b03d5779b983383aa6eba54ed7.png CBRNBlock结构

分组和集束搜索残差矢量量化器 GB-RVQ

CBRC使用残差矢量量化器(Residual Vector Quantizer,RVQ)将编码网络输出特征量化压缩到指定比特率。RVQ以多层矢量量化器(Vector Quantizer,VQ)级联来压缩特征,每层VQ对前一层VQ量化残差进行量化,可显著降低同等比特率下单层VQ的码本参数量。团队在CBRC中提出了两种更优的量化器结构,即分组残差矢量量化器 (Group-wise RVQ) 和集束搜索残差矢量量化器(Beam-search RVQ)。

分组残差矢量量化器 Group-wise RVQ集束搜索残差矢量量化器 Beam-search RVQ
345baab8b0fc1d0946095374bbe92456.pnga7c77a4e483fc733f9b67586736d079b.png

Group-wise RVQ将Encoder输出进行分组,同时使用分组的RVQ对分组后特征进行独立量化,随后分组量化输出拼接输入Decoder。Group-wise RVQ以分组量化方式降低了量化器的码本参数量和计算复杂度,同时降低了CBRC端到端训练难度进而提升了CBRC编码音频质量。

团队将Beam-search RVQ引入到神经音频编码器端到端训练中,使用Beam-search算法选择RVQ中量化路径误差最小的码本组合,以降低量化器的量化误差。原RVQ算法在每层VQ量化中选择误差最小的码本为输出,但每层VQ量化最优的码本组合后不一定是全局最优码本组合。团队使用Beam-search RVQ,在每层VQ中以量化路径误差最小准则保留k个最优的量化路径,实现在更大的量化搜索空间中选择更优的码本组合,降低量化误差。



Beam-search RVQ算法简要过程:

1、每层VQ输入前层VQ的个候选量化路径,得到个候选量化路径。

2、从个候选量化路径中选择个量化路径误差最小的个量化路径作为当前VQ层输出。

3、在最后一层VQ中选择量化路径误差最小的路径作为量化器的输出。
a9bb79ffe3c30b34463da9d4f44e2041.png

模型训练

在实验中,使用LibriTTS数据集中245小时的16kHz语音进行训练,将语音幅度乘以随机增益后输入模型。训练中损失函数由频谱重建多尺度损失,判别器对抗损失和特征损失,VQ量化损失和感知损失构成。

468d93b5c201a300516ac474e540e6ef.png

实验结果

主客观得分

为了评估CBRC编码语音质量,构建了10条多语种音频对比集,在该对比集上与其他音频编解码器进行了对比。为了降低计算复杂的影响,团队设计了轻量化的CBRC-lite,其计算复杂度略高于Lyra-V2。由主观听感比较结果可知,CBRC在3kbps上语音质量超过了12kbps的Opus,同样超过了3.2kbps的Lyra-V2,这表明所提出方法的有效性。https://bytedance.feishu.cn/docx/OqtjdQNhZoAbNoxMuntcErcInmb中提供了CBRC编码后音频样音。

客观分主观听感得分
cb37a8eaefc39370c037f812f13e48c9.jpeg33e770f16787db0fb6f8481560c4d4aa.jpeg

消融实验

团队设计了针对Intra-BRNN、Group-wise RVQ 和 Beam-search RVQ的消融实验。实验结果表明在Encoder和Decoder使用Intra-BRNN均可明显提升语音质量。此外,团队统计了RVQ中码本使用频次并计算熵解码以对比不同网络结构下码本使用率。相比于全卷积结构,使用Intra-BRNN的CBRC将潜在编码比特率从4.94kbps提升到5.13kbps。同样,在 CBRC中使用Group-wise RVQ 和 Beam-search RVQ均能显著提升编码语音质量,且相比于神经网络本身的计算复杂度, GB-RVQ带来的复杂度增加几乎可忽略。

8b4b278506978c6cdc6282b88ef6f5eb.jpeg321f3e9c9d60459e23446521edc8cb01.jpeg

样音

原始音频

CBRC 3kbps

CBRC-lite 3kbps

基于两阶段渐进式神经网络的回声消除方法

论文地址:https://www.isca-speech.org/archive/pdfs/interspeech_2023/chen23e_interspeech.pdf

背景

在免提通信系统中,声学回声是令人烦恼的背景干扰。当远端信号从扬声器播放出来,然后由近端麦克风记录时,就会出现回声。回声消除 (AEC) 旨在抑制麦克风拾取的不需要的回声。在现实世界中,有很多非常需要消除回声的应用,例如实时通信、智能教室 、车载免提系统等等。

最近,采用深度学习 (DL) 方法的数据驱动 AEC 模型已被证明更加稳健和强大 。这些方法将 AEC 表述为一个监督学习问题,其中输入信号和近端目标信号之间的映射函数通过深度神经网络 (DNN) 进行学习。然而,真实的回声路径极其复杂,这对 DNN 的建模能力提出了更高的要求。为了减轻网络的建模负担,大多数现有的基于 DL 的 AEC 方法采用一个前置的线性回声消除(LAEC) 模块来抑制大部分回声的线性分量。但是,LAEC 模块有两个缺点:1)不合适的 LAEC 可能会导致近端语音的一些失真,以及 2)LAEC 收敛过程使线性回声抑制性能不稳定。由于 LAEC 是自优化的,因此 LAEC 的缺点会给后续的神经网络带来额外的学习负担。

为了避免 LAEC 的影响并保持更好的近端语音质量,本文探索了一种新的基于端到端 DL 的两阶段处理模式,并提出了一种由粗粒度 (coarse-stage) 和细粒度 (fine-stage) 组成的两阶段级联神经网络(TSPNN) 用于回声消除任务。大量的实验结果表明,所提出的两阶段回声消除方法能够达到优于其他主流方法的性能。

模型框架结构

如下图所示,TSPNN 主要由三个部分组成:时延补偿模块 (TDC)、粗粒度处理模块 (coarse-stage) 和细粒度处理模块 (fine-stage)。TDC 负责对输入的远端参考信号 (ref) 和近端麦克风信号 (mic) 进行对齐,有利于后续模型收敛。coarse-stage 负责将大部分的回声 (echo) 和噪声 (noise) 从 mic 中去除,极大减轻后续 fine-stage 阶段模型学习负担。同时,coarse-stage 结合了语音活跃度检测 (VAD) 任务进行多任务学习,强化模型对近端语音的感知能力,减轻对近端语音的损伤。fine-stage 负责进一步消除残余回声和噪声,并结合邻居频点信息来较好地重构出近端目标信号。

c158c89e4b40be0c262299f3de3a2ec1.png

为了避免独立优化每个阶段的模型而导致的次优解,本文采用级联优化的形式来同时优化 coarse-stage 和 fine-stage,同时松弛对 coarse-stage 的约束,避免对近端语音造成损伤。此外,为了让模型能够具有感知近端语音的能力,本发明引入了 VAD 任务进行多任务学习,在损失函数中加入 VAD 的 Loss。最终损失函数为:

其中 分别表示目标近端信号复数谱、coarse-stage 和 fine-stage 估计的近端信号复数谱;分别表示coarse-stage估计的近端语音活跃状态、近端语音活跃检测标签; 为一个控制标量,主要用于调节训练阶段对不同阶段的关注程度。本发明限制 来松弛对 coarse-stage 的约束,有效避免 coarse-stage 对近端的损伤。

实验结果

实验数据

火山引擎流媒体音频团队所提两阶段回声消除系统还与其他方法做了比较,实验结果表明,所提能够达到优于其他主流方法的效果。

fbf5703d0ddd84f375721e49f3f567b3.jpeg

具体例子

  1. 实验结果 Github 链接:https://github.com/enhancer12/TSPNN

  2. 双讲场景效果表现:

32138b74ce2f8189fa07e2727e21c2bb.jpeg

CHiME-7 无监督域自适应语音增强(UDASE)挑战赛冠军方案

论文地址:https://www.chimechallenge.org/current/task2/documents/Zhang_NB.pdf

背景:

近年来,随着神经网络和数据驱动的深度学习技术的发展,语音增强技术的研究逐渐转向基于深度学习的方法,越来越多基于深度神经网络的语音增强模型被提出。然而这些模型大多基于有监督学习,都需要大量的配对数据进行训练。然而在实际场景中,无法同时收录到嘈杂场景的语音和与之配对的不受干扰的干净语音标签,通常采用数据仿真的形式,单独采集干净语音与各种各样的噪声,将其按照一定信噪比混合得到带噪音频。这导致了训练场景与实际应用场景的不匹配,模型性能在实际应用中有所下降。

为了更好的解决以上域不匹配问题,利用真实场景中大量无标签数据,无监督、自监督语音增强技术被提出。CHiME挑战赛赛道2旨在利用未标记的数据来克服在人工生成的标记数据上训练的语音增强模型因训练数据与实际应用场景的不匹配导致的性能下降问题,研究的重点在于如何借助目标域的无标签数据和集外的有标签数据来提升目标域的增强结果。

模型框架结构:

dfbfbbd71866997c085113711ce8e852.png

无监督域自适应语音增强系统流程图

如上图所示,所提框架是一个教师学生网络。首先在域内数据上使用语音活动检测、UNA-GAN、仿真房间冲击响应、动态加噪等技术生成最接近目标域的有标签数据集,在该域外有标签数据集上预训练教师降噪网络Uformer+。接着在域内无标签数据上借助该框架更新学生网络,即利用预训练的教师网络从带噪音频中估计干净语音和噪声作为伪标签,将他们打乱顺序重新混合作为学生网络输入的训练数据,利用伪标签有监督的训练学生网络。使用预训练的MetricGAN判别器估计学生网络生成的干净语音质量评分,并与最高分计算损失,以指导学生网络生成更高质量的干净音频。每训练一定步长后以一定权重将学生网络的参数更新到教师网络中,以获取更高质量的监督学习伪标签,如此重复。

Ufomer+网络

Uformer+是在Uformer网络基础上加入MetricGAN改进得到的。Uformer是一个基于 Unet 结构的复数实数双路径conformer网络,它具有两条并行的分支,幅度谱分支和复数谱分支,网络结构如下图所示。幅度分支用于进行主要的噪声抑制功能,能够有效抑制大部分噪声。复数分支作为辅助,用于补偿语谱细节和相位偏差等损失。MetricGAN的主要思想是使用神经网络模拟不可微的语音质量评价指标,使其可以被用于网络训练中,以减少训练和实际应用时评价指标不一致带来的误差。这里团队使用感知语音质量评价(PESQ)作为MetricGAN网络估计的目标。

14d404af4c0cc82a6d322d1fa45c2653.png

Uformer网络结构图

RemixIT-G框架

RemixIT-G是一个教师学生网络,首先在域外有标签数据上预训练教师Uformer+模型,使用该预训练教师模型解码域内带噪音频,估计噪声和语音。接下来在同一批次内打乱估计的噪声和语音的顺序,重新将噪声和语音按打乱后的顺序混合成为带噪音频,作为训练学生网络的输入。由教师网络估计的噪声和语音作为伪标签。学生网络解码重混合的带噪音频,估计噪声和语音,与伪标签计算损失,更新学生网络参数。学生网络估计的语音被送入预训练的MetricGAN判别器中预测PESQ,并与PESQ最大值计算损失,更新学生网络参数。

所有训练数据完成一轮迭代后根据如下公式更新教师网络的参数:,其中为训练第K轮教师网络的参数, 为第K轮学生网络的参数。即将学生网络的参数以一定权重与教师网络相加。

数据扩充方法 UNA-GAN

ec301fcfeb51575b63f2203979a3eadb.png UNA-GAN结构图

无监督噪声自适应数据扩充网络UNA-GAN是一种基于生成对抗网络的带噪音频生成模型。其目的是在无法获取独立的噪声数据的情况下,只使用域内带噪音频,直接将干净语音转化为带有域内噪声的带噪音频。生成器输入干净语音,输出仿真的带噪音频。判别器输入生成的带噪音频或真实的域内带噪音频,判断输入的音频来自真实场景还是仿真生成。判别器主要根据背景噪声的分布来区分来源,在这个过程中,人类语音被视为无效信息。通过执行以上对抗训练的过程,生成器试图将域内噪声直接添加在输入的干净音频上,以迷惑判别器;判别器试图尽力区分带噪音频的来源。为了避免生成器添加过多噪声,覆盖掉输入音频中的人类语音,使用了对比学习。在生成的带噪音频、和输入的干净语音对应位置采样256个块。相同位置的块的配对被视为正样例,不同位置的块的配对被视为负样例。使用正负样例计算交叉熵损失。

实验结果

结果表明所提出的Uformer+相比基线Sudo rm-rf具有更强的性能,数据扩充方法UNA-GAN也具有生成域内带噪音频的能力。域适应框架RemixIT基线在SI-SDR上取得了较大提升,但在DNS-MOS上指标较差。团队提出的改进RemixIT-G同时在两个指标上都取得了有效提升,并在竞赛盲测集上取得了最高的主观测听MOS打分。最终测听结果如下图所示。

185e11a0cb9eec3dd014dede77d1936c.png

总结与展望

上述介绍了火山引擎流媒体音频团队基于深度学习在特定说话人降噪,AI编码器,回声消除和无监督自适应语音增强方向做出的一些方案及效果,未来场景依然面临着多个方向的挑战,如怎么样在各类终端上部署运行轻量低复杂度模型及多设备效果鲁棒性,这些挑战点也将会是流媒体音频团队后续重点的研究方向。

加入我们

火山引擎流媒体团队,致力于提供全球互联网范围内高质量、低延时的实时音视频通信能力,帮助开发者快速构建语音通话、视频通话、互动直播、转推直播等丰富场景功能,目前已覆盖互娱、教育、会议、游戏、汽车、金融、IoT 等丰富实时音视频互动场景,服务数亿用户。

音频开发工程师和音频资深算法工程师热招中,欢迎同学们加入!

7de62e15f6db2d2e9b1912f915c18365.jpeg

扫描二维码 or 点击阅读原文了解更多职位信息~

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

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

相关文章

微服务--Seata(分布式事务)

TCC模式在代码中实现:侵入性强,并且的自己实现事务控制逻辑 Try,Confirm() cancel() 第三方开源框架:BeyeTCC\TCC-transaction\Himly 异步实现:MQ可靠消息最终一致性 GlobalTransacational---AT模式

Threejs里反向播放动画

在Blender里给对象添加了一个动画后,假设是在帧1到帧40添加的动画帧,那么正常播放时是从帧1到帧40,反向播放则是从帧40到帧1,本文讲述如何在Threejs里方向播放Blender里添加的动画。 一 添加动画 之前文章中已经讲述如何在Blende…

MAC ITEM 解决cd: string not in pwd的问题

今天使用cd 粘贴复制的路径的时候,报了这么一个错. cd: string not in pwd eistert192 Library % cd Application Support cd: string not in pwd: Application eistert192 Library % 让人一脸懵逼. 对比一下,发现中文路径里的空格截断了路径 导致后面的路径就没有办法被包含…

财报解读:迈向高端化,珍酒李渡如何持续讲好品牌故事?

2023年上半年,尤其是第二季度,白酒行业淡季属性较为明显。对于市场情况,中国酒业协会《2023中国白酒市场中期研究报告》也有所披露:约40.91%的受访者反馈春节后平日的白酒消费量有所减少,约31.82%的受访者反馈五一期间…

数据结构与算法(二)算法分析

算法的特性 算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。 输入输出 算法具有零个或多个输入至少有一个或多个输出:算法是一定需要输出的,不需要输出,你用这个算法干吗? 有穷性 指算法在执行有限的步骤…

教你如何进行vcruntime140_1.dll文件下载安装,4种方法详细的安装方法

今天主要要跟大家说说vcruntime140_1.dll文件下载安装,其实要下载安装这个文件还是有不少方法的,只要不要慌,有的时候办法解决,首先我们要知道vcruntime140_1.dll是Microsoft Visual C的一部分,是许多计算机程序运行所…

Python项目打包与部署(1):模块与包的概念与关系

Python是动态类型编程语言,意味着python不需要提前编译。1个Python项目通常也包含多个.py文件, 通常也会引用python标准库,或第3方库,也存在着依赖关系。因此python项目也 当实际构建1个 Python 项目时,模块与包是我们…

【python基础教程】类中属性和方法的具体定义方法及使用

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 以下介绍在python的re模块中怎样应用正则表达式 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备…

Mybatis1.2 查询所有数据

1.2 查询所有数据 1.2.1 编写接口方法1.2.2 编写SQL语句1.2.3 编写测试方法1.2.4 起别名解决上述问题1.2.5 使用resultMap解决上述问题1.2.6 小结 如上图所示就页面上展示的数据,而这些数据需要从数据库进行查询。接下来我们就来讲查询所有数据功能,而实…

JavaScript【转】

以下内容转载和参考自:w3school的JavaScript学习内容,HTML JavaScript。 JavaScript 使 HTML 页面更具动态性和交互性,前面我们都是在代码中一开始就将元素的值、属性、style样式写死,使用JavaScript 的话就可以对这些内容动态的更…

WordPress(6)网站侧边栏倒计时进度小工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 效果图在这里插入图片描述一、添加位置二、主题style.css文件中添加美化1.引入库2.添加自定义的HTML模块效果图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 在主题中 child.js…

QT DAY 4

时钟: #include "widget.h" #include "ui_widget.h"int hour0; int min0; int sec0; int count0; Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setFixedSize(800,600);timer new …

【LeetCode-中等题】200. 岛屿数量

文章目录 题目方法一:深度优先搜索 dfs方法二:广度优先搜索 bfs方法三:(重点掌握)并查集 题目 方法一:深度优先搜索 dfs 思路:让一个扫描指针扫描每一个格子,然后每扫到一个为1的格…

代码随想录—力扣算法题:19删除链表的倒数第N个节点.Java版(示例代码与导图详解)

19.删除链表的倒数第N个节点 力扣题目链接 更多内容可点击此处跳转到代码随想录,看原版文件 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 进阶:你能尝试使用一趟扫描实现吗? 示例 1&#xff1…

浅析Linux系统I/O模型

文章目录 概述阻塞式I/O模型非阻塞式I/O模型I/O多路复用模型信号驱动式I/O模型异步I/O模型相关参考 概述 在操作系统中,I/O类操作是相对慢速的,应用发起一个I/O操作,需要等待I/O资源就绪后,才能继续后面的处理。这种简单的请求-响…

无涯教程-JavaScript - NORMINV函数

NORMINV函数取代了Excel 2010中的NORM.INV函数。 描述 对于指定的平均值和标准差,该函数返回正态累积分布的反函数。 语法 NORMINV (probability,mean,standard_dev)争论 Argument描述Required/OptionalProbabilityA probability corresponding to the normal distributio…

NVME Linux的查询命令-继续更新

NVME Linux的查询命令 查看NVMe设备 # nvme list 查看nvme controller 支持的一些特性 # nvme id-ctrl /dev/nvme0 查看设备smart log信息 # nvme smart-log /dev/nvme0 查看设备error 信息 # nvme error-log /dev/nvme0 设备的所有命名空间 # nvme list-ns /dev/nvmeX 检…

uni-app之android项目云打包

1,项目根目录,找到mainfest.json,如果appid是空的,需要生成一个appid 2,点击重新获取appid,这个时候需要登录,那就输入账号密码登录下 3,登陆后可以看到获取appid成功 4,…

企业文件加密防泄密软件系统——「天锐绿盾」

天锐绿盾是一款企业电子文件透明加密安全防泄密管理系统,采用文件过滤驱动技术,对电子文档进行实时动态保护,防止企业计算机信息被破坏、丢失、泄密等安全问题。 PC访问地址: 首页 以下是关于天锐绿盾的详细介绍: 透明…

密度图及山脊图绘图基础

文章目录 3 种绘制密度图方法对比多组数据、同一个核函数渐变颜色填充“山脊”图同一坐标系中多个密度图的绘制 Seaborn 的 kdeplot() 函数是 Python 中绘制密度图的方式之一,Matplotlib 在现阶段则没有具体的绘制密度图的函数,一般是结合 Scipy 库中的 …