TTS 文本转语音模型综合简述

本文参考文献:

[1] Kaur N, Singh P. Conventional and contemporary approaches used in text ot speech synthesis: A review[J]. Artificial Intelligence Review, 2023, 56(7): 5837-5880.

[2] TTS | 一文了解语音合成经典论文/最新语音合成论文篇【20240111更新版】_tts原理架构图-CSDN博客

【——————目前持续更新中——————】 

【可预见更新:Transformer-TTS、VITS、NaturalSpech、Flow-based、Diffusion-based

目录

模型综述

模型分类

模型组成

评判标准

传统模型简介

Articulatory synthesis(发音合成)类语音合成技术

Formant Synthesis(共振峰语音合成)

Concatenative speech synthesis(拼接语音合成)

Statistical parametric speech synthesis(统计参数语音合成,SPSS)

深度学习模型(简述)

Restricted Boltzmann machines

Deep Belief Network 

Deep Neural Network

Recurrent Neural Networks

Deep Gaussian Process

优缺点简单总结

Challenging TTS

ETTS 

多语者多语言 TTS 

当前先进的 TTS 模型(SOTA)

自回归模型(Autoregressive Model)

非自回归模型(Non-Autoregressive Model)

TTS 发展小总结


 

模型综述

模型分类

传统的合成语音模型包括:

  • 发音合成:articulatory synthesis,通过模拟声道和声带的形态和动态来生成语音

  • 共振峰合成:formant synthesis,通过调整声道的滤波器来模拟声音的共振峰

  • 拼接语音合成:concatenative speech,使用预先录制的人类语音单元(如音素、音节或单词)的片段,并将它们连接起来以形成连续的语音

  • 统计参数技术:statistical parametric techniques(基于隐马尔可夫模型),参数可以包括基频、频谱包络、共振峰频率等,用参数化模型来生成语音。

b61ddd1385b54544879d4c468a8347a9.png

而最近的模型通常是基于深度学习方法的统计参数声学模型,以及一些端到端模型。

 

模型组成

通常由两个部分组成:

  • Natural Language Processing:自然语言处理,将文本转为声学表示向量。

  • Digital Signal Processing:人工合成语音波形

 

评判标准

通常,判断一个模型生成的语音的质量可以用两个标准来评判:

  • Intelligibility:合成难易程度和可理解性(说了什么?能不能听懂)

  • Naturalness:和人类语音的接近程度(像真人说的吗?)

 

传统模型简介

Articulatory synthesis(发音合成)类语音合成技术

  • 通过模拟人的发声器官,进行建模,从而产生语音

  • 优点:Intelligence 很不错,但是不够自然,很像机器人声音,原因是当时是通过X相片对人的声道进行建模,因此建模不够准确。这类模型并不是很流行。

 

Formant Synthesis(共振峰语音合成)

  • 基于规则的语音合成方法,用各种参数进行规范化生成

  • 避免了拼接语音合成技术中在声音单元边界常常出现的问题,但是还是很机械化发音,这类模型并不是很流行。

 

Concatenative speech synthesis(拼接语音合成)

  • 一般分为两种,一种是基于单位(unit-based)合成,一种是基于二音节(diaphone-based)合成。

  • 前者使用大量语料库,后者每个二音节只有一个copy。而且后者还需要使用PSOLA算法来调整韵律,但这需要对每个音阶周期精确标注,这会导致合成的声音不太自然。

  • 后者的力量主要源自语料库。记录的声音被按照音素切割,最终选择最能匹配的音素进行链接生成语音

  • 损失函数主要有两个:搜索匹配损失(target cost)和连接损失(concatenation cost)

  • 它所需要的语料库是最大的限制。人们做了很多努力去压缩,去编码语料库,最终合成的语音确实只能且自然,但合成的都是正经阅读风格的语音,缺少风格的多样性、音色多样性等。而且搞到最后,不同的单元之间的边界过度还是不那么平滑。

690feeec27d348378eb324f7edb69eac.png

 

Statistical parametric speech synthesis(统计参数语音合成,SPSS)

  • 主要是为了参数化语音的各个特征。通常后面需要接一个Vocoder,用于将参数转为语音波形。描述使用的参数比如基频(fundamental frequency,f0)、梅尔频率倒谱系数(MFCC)、频谱图(Spectrogram)等。

  • 基于隐马尔可夫模型(HMM)的 SPPS:解决了拼接语音合成在针对不同语音风格目标导致的耗时低效,存储空间大等问题。

  • 基于深度学习的 SPSS:通常为基于 DNN 和 RNN,LSTM 的表现也非常亮眼

 

深度学习模型(简述)

Restricted Boltzmann machines

Restricted Boltzmann machines(受限玻尔兹曼机):主要用于DNN的预训练器,用来映射随机变量之间的依赖关系,一般有两层——可见层和隐藏层,同一层变量之间没有关系。

1597936939d1435f96fd3b63657aff8c.png

 

Deep Belief Network 

Deep Belief Network(深度置信网络):多个RBM进行堆叠。另外还有 Deep Conditional Restricted Boltzmann Machine(DCRBM,深度条件受限模型玻尔兹曼机)

5b0ffac781284780b16379e682c71361.png

 

Deep Neural Network

Deep Neural Network(深度神经网络):为了回归和分类问题设计,每一层都是非线性函数,因此可以去表示输入和输出之间的复杂关系。不过由于较多的层数会导致梯度的消失,因此对于较低层来说,信息的获取较为困难。

53e81ba89d4f4e77ab86a81306b11eeb.png

  • 基本原理:文本先转为语言向量,然后通过DNN映射到输出的语音参数上,最后通过 vocoder合成语音波形。

  • 分类:根据输入和输出的语音特征向量表示,深度学习方法可以分成深度生成模型、深度联合模型和深度条件模型。

  • DNN 是监督学习,不过可能会出现过拟合的情况。而且在某些主观评价中 HMM 比 DNN 好,原因在于 DNN 针对缺失的f0使用了插值算法,这就导致了合成的语音中的噪音。而针对这些问题,人们也提出了相应的解决方案:

    • 针对过拟合,提出了使用 DBN 预训练的 DNN。

    • 针对声学建模的准确性,使用了RBM来对频谱包络进行建模,DNN不再随机初始化权重,而是使用DBN来进行预训练。

  • 此外,DNN 比 HMM 还优秀在能够自动表示语音的输入上下文和输出声学特征之间的依赖关系。

  • 而且针对多人语料库,通过向单个隐藏层或者多个隐藏层中添加语者独热向量,DNN 也可以实现多人语音合成。

 

Recurrent Neural Networks

Recurrent neural networks(循环神经网络):由于 DNN 难以捕捉时间特征,因此就会导致在帧尺度上的语音参数预测的不连续性。有些算法可以缓解这种情况,但是也会导致相关的副作用。RNN 就在此提供了第二种方案。输入门决定控制当前时间步的输入信息有多少要传递给单元状态,遗忘门决定从此状态中丢弃多少旧信息,输出门基于当前的输入和先前状态决定当前的时间步的输出。

  • RNN可以轻松学习时间序列数据,因此可以针对统计语音合成中的协同发音特征(即语音单元之间的联系)进行建模,因此可以在输出层生成平滑的语音轨迹。

  • 不过,由于RNN系列的声音合成模型涉及到大量的计算,因此RNN在实时语音合成任务中的应用并不比DNN要好。

 

Deep Gaussian Process

Deep Gaussian Process(深度高斯过程):DNN 模型主要强调训练阶段数据的拟合,虽然对语音质量有着很明显的改善,但是经常会出现过拟合的问题。而 DGP 此时就是 DNN 和 RNN 的替代。相比于 DNN 用了大量的超参数,DGP 通过级联贝叶斯核回归,可以使用更少的超参数来将语言向量映射到声学变量。由于训练过程中同时考虑了模型复杂度和数据拟合,并且在数据拟合过程中使用的是最大化边缘似然,因此模型不太容易出现过拟合的问题。

  • 基于 DGP 的 TTS 模型在单语者、多语者任务上都表现出色。针对较少的训练数据、较多的训练数据都表现不错。在引入循环架构后,其表现得到了优化。其最大的问题可能在于计算量。

  • 相较于 DNN 和 RNN,DGP 无论在 MOS 中还是在偏好测试分数中都比二者要高。

 

优缺点简单总结

  • Articulatory synthesis:发音合成,通过对发声器官进行建模

    • 优点:不需要数据库,就能合成能够被理解的语音。

    • 缺点:语音有点像机器人,并且非常难部署

  • Formant synthesis:共振峰合成,基于提供的一系列规则进行建模

    • 优点:可理解语音,防止帧边界处的声学故障,对算力和存储空间有限制的平台友好,不需要数据库

    • 缺点:语音不自然,生成的语音一听就是人工的,有点像机器人。

  • Concatenative synthesis:串联合成,串联声音单元合成语音

    • 优点:比较像人类发出的声音

    • 缺点:需要大量的声音数据,声音的各项特征、风格等不可以改动,在连接处的声音质量也比较差

  • HMM based:基于HMM合成,基于统计参数的方法,使用HMM来生成各项统计参数,并使用Vocoder来合成声音

    • 优点:很方便调整语音特征,可以使用更少的语音数据去生成不同风格(比如情绪)的语音

    • 缺点:语音轨迹过于平滑导致言语含糊不清,需要大量训练数据来生成听起来自然的语音。由于 HMM 中使用的决策树存在碎片问题,因此未对复杂的上下文依赖关系进行建模

  • HMM using RBM and DBN:使用RBM和DBN的HMM,使用相关技术对频谱包络分布进行建模,就可以在合成的时候对频谱包络进行预测了。

    • 优点:对低频范围的频谱包络建模减轻了过度平滑的问题

    • 缺点:准确性提高了,但是自然性没有怎么提高。

  • DNN:深度神经网络,对HMM的决策树进行替换,替换为DNN,用来映射输入语言变量和输出语音参数。

    • 优点:既可以对输入特征之间复杂的上下文依赖关系进行建模,又不会遇到训练数据的碎片问题

    • 缺点:反向传播计算量大,并且无法对多模态进行建模。

  • RNN:循环神经网络,使用的是双向长短期记忆和神经网络来对语音参数进行建模。

    • 优点:能够捕捉到时序特征,从而改善了声音建模

    • 缺点:计算复杂度较高,使其无法应用到实时语音合成任务中去

  • DGP:深度高斯过程,使用级联贝叶斯核回归(BKRs)来建模

    • 优点:和DNN相比使用了更少的超参数,不易过拟合,在多语者语料库上表现优秀

    • 缺点:没有循环结构,无法捕捉时间特征,部分参数失真仍然比DNN要高。

 

Challenging TTS

ETTS 

ETTS:Expressive TTS,TTS主要需要研究说什么,谁说和怎么说三个问题,ETTS 集中解决的就是第三个问题。这其中包括韵律节奏变化、情感表达等多维度。之前可以通过总结并调整语音参数来实现,不过需要依靠大量的数据库,并且每种情感都需要一个模型。后来,从2004年开始采用单个模型去生成带情感语音。

  • 当时使用的是分类代码和纬度值(categorical code and dimensional values),不过这项技术无法表达复杂的情感,并且有着注释模糊的问题存在。

  • 后面又有人提出了使用 emotion exemplar,去提取情感表达后和input text一起送进语音合成模型中。如何提取则是去解析声谱,使用胶囊神经网络和残差神经网络去提取相应内容,然后通过seq2seq架构和文本一起共同生成语音

  • 随后又有GST(Global Style Token)网络,核心思想就是使用一个风格标记的权重来决定语音的整体风格等等。随后人们在此基础上进行改动,并最终练出了一个可以微调心情的模型。

 

多语者多语言 TTS 

Multi-speaker/Multi-lingual TTS:多语者、多语言语音合成

  • 使用多任务学习,并复制输出层,模型很容易能够支持多语者的训练。这样的模型通过冻结隐藏层,仅仅改变回归层,可以在有限的训练数据的条件下取得不错的成绩。不过它也会随着语者的增多而线性扩展。

  • 而如果是采用 IPA trainning(国际音标)训练的多语言模型,我们可以很容易将其扩展为对多语者的支持,GL vocoder 就是这样的模型产物,作者将其针对不同口音、语言等做出了改进。

  • 在编码单元中引入语者嵌入向量后,多语者语音同样可以得以合成。

 

当前先进的 TTS 模型(SOTA)

自回归模型(Autoregressive Model)

最近,人们逐渐在使用自回归模型(AR model)来合成语音,这些模型通常先从文本生成梅尔频谱图,然后再通过vocoder来合成最终的语音。不过由于这类模型的训练和合成是串行进行的,就会导致其训练速度很慢,并且生成的语音健壮性也不足(漏读、重复等),这可能是因为自回归模型比较难捕捉长期依赖性(即上下文之间的依赖)。与此同时,非自回归模型也相继被提出,相较于对应的AR模型来说有着更高的合成率但准确性较低。不过有些技术:Knowledge distillation、word mapping、source target alignment constraints、duration prediction也可以用来提高准确性。

  • WaveNet:是全自回归概率模型,使用了深度卷积神经网络对用于训练的语音的概率分布进行建模,支持多语言、多口音,并且MOS也比较高,大幅减少了合成语音和自然语音之间的差距,也促成了端到端语音合成的发展。

  • Tacotron:也是端到端的语音合成,使用序列到序列的模型来获得语言文本到梅尔谱图的映射关系。缺失的相位信息则是由Griffin-Lim算法补充。此外,它是使用字符作为合成语音的基本单位,因此适配很多语言。并且它的生成速度要比WaveNet要更快。

  • Tacotron 2:是一代的加强版,同时结合了CNN和RNN,并使用更简单的构建块(LSTM、CNN)等来进行解码和编码。

  • Deep-voice:是百度开发的,由很多模块组成,2代可以用单个模型来合成多个语音,3代则是用了在LibriSpeechASR数据集上学习的全卷积神经网络,主要由编码器、解码器和转换器(为了和Vocoder对接)组成。

 

非自回归模型(Non-Autoregressive Model)

  • ParaNet:一个基于完全卷积注意力的非自回归TTS模型,在一次前馈过程中就生成语音波形。它使用自回归编码器的注意力蒸馏,反复细化文本和梅尔频谱图之间的对齐。Encoder类似DV3的编码器,解码器主要由注意力模块、全卷积模块、再一个注意力模块组成。为了提高性能,它预测对数梅尔频谱图,也预测对数线性频谱图。而作为一个非自回归模型,它的合成速度是远远胜过自回归模型的。

  • Parallel Tacotron:一个轻量级卷积非自回归TTS模型,使用VAE来捕捉语音局部上下文信息,训练合成同时进行,2代的持续时间模型基于注意力蒸馏,并使用软动态时间对齐进行迭代细化,因此在训练的时候就可以不用教师强制等方法,而是直接用可微的持续时间模型传播误差梯度,因此合成的声音就更自然。

  • FastSpeech:能够并行生成梅尔频谱图,生成速度非常快。模型主要通过预测音素持续时间来生成语音,并借用了自回归模型中的教师模型的注意力,通过均方误差进行训练。模型包括六个前馈变换模块,用来将音素序列转换成梅尔频谱图序列,并使用长度调节器来桥接序列长度不匹配的情况。不过,也正因为采用的是教师模型简化版本,其生成的梅尔频谱图信息存在缺失,也无法准确确定音素持续时间。2代通过直接训练原始真实语音数据防止了信息丢失(原来采用的是教师模型简化的数据),从目标语音中确定持续时间、音高和能量的值,并使用连续小波变换方法将音高轮廓转换为音高频谱图。最终,2代通过使用简化的训练管线和高质量的语音,使其原始版本FastSpeech的速度提高了3倍。

  • Parallel WaveNet:17年的,用的平行前馈网络,采用了概率密度蒸馏方法进行训练(将教师模型(可能是更大、更复杂的WaveNet模型)的输出概率分布作为软目标,学生模型被训练来模拟教师模型的输出分布,从而提高语音合成的质量和性能。)。它可以生成多个语者带有不同口音的声音。

 

TTS 发展小总结

  • 以前使用的基于规则的发音和共振峰合成方法虽然产生了高度可理解的声音,但合成的语音听起来很机器人,因此并没有得到太多的欢迎。

  • 之后,诸如基于单元和基于双音素的语音合成方法等串联方法,即使生成自然语音,也需要来自单个说话者的更大的语音语料库。此外,生成阅读式语音并且声音在帧边界处不连续。与这些传统的语音合成方法相比,SPSS(尤其是基于深度学习的方法)通过从参数表示合成语音来提供更准确的声学建模。这些模型最适合对输入语言特征和输出语音参数之间的复杂非线性关系进行建模。此外,在 RNN 架构中使用双向 LSTM 能够对时间特征进行建模,而 DGP 有助于在很大程度上缓解 DNN 中的过拟合问题,并利用多说话人语音语料库生成语音。

  • 目前,最先进的TTS模型采用的是自回归和非自回归模型,一方面自回归 TTS 能够重新生成高质量的语音,另一方面非自回归 TTS 能够高速合成语音。

 

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

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

相关文章

代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点 35.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有…

2024 ccfcsp认证打卡 2023 03 01 田地丈量

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt(); // 输入 n,表示矩形的数量int a in.nextInt(); // 输入 a,表示整个区域的长度int b in.nextInt()…

Git 常用命令速查

Git 是一个分布式版本控制系统&#xff0c;用于管理代码和其他文件。它允许您跟踪代码的更改&#xff0c;并在必要时回滚到以前的版本。 本文将介绍一些 Git 常用命令&#xff0c;帮助您快速上手 Git。 初始化 Git 仓库 git init添加文件到暂存区 git add <file_name>…

superset 二开增加 flink 数据源连接通过flink sql 查询数据

前言 superset 目前还不支持 flink 的数据源连接&#xff0c;目前我们公司在探索使用数据湖那一套东西&#xff1a; 使用 flink 作为计算引擎使用 paimon oss对象存储对接 flink 作为底层存储使用 superset 通过 flink gateway 查询 paimon 数据形成报表 增加flink数据源 …

C++零基础入门学习视频课程

教程介绍 本专题主要讲解C基础入门学习&#xff0c;所以不会涉及很深入的语法和机制。但会让你整体多面的了解和学习C的核心内容&#xff0c;快速学习使用C&#xff0c;我们的目标是先宏观整体把握&#xff0c;在深入各个击破&#xff01; 学习地址 链接&#xff1a;https:/…

简单谈谈什么是块存储?

块存储是最简单的数据存储形式&#xff0c;通常用于存储区域网络(SAN) 或 云存储 设置。文件存储在固定大小的块中&#xff0c;可以更轻松地访问文件以进行快速或频繁的编辑。虽然更复杂且成本更高&#xff0c;但存储在此类系统中的数据可以轻松访问&#xff0c;而不会影响操作…

如何在Win10使用IIS服务搭建WebDAV网站并实现无公网IP访问内网文件内容

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

docker 的八大技术架构(图解)

docker 的八大技术架构 单机架构 概念&#xff1a; 应用服务和数据库服务公用一台服务器 出现背景&#xff1a; 出现在互联网早期&#xff0c;访问量比较小&#xff0c;单机足以满足需求 架构优缺点&#xff1a; 优点&#xff1a;部署简单&#xff0c;成本低 缺点&#xff1…

80个Python数据分析必备实战案例.pdf(附代码),完全开放下载

大家好&#xff0c;我是彭涛。 随着数据时代的来临&#xff0c;Python数据分析技能现在愈加重要&#xff0c;无论是从事数据科学、商业分析还是决策支持&#xff0c;掌握 Python 数据分析的技能都将成为你事半功倍的利器。 之前为大家陆续梳理了基础资料&#xff0c;爬虫资料…

C# WPF编程-事件

C# WPF编程-路由事件 路由事件概要路由事件的三种方式 WPF事件WPF最重要的5类事件&#xff1a;生命周期事件 鼠标事件键盘事件多点触控输入原始触控 路由事件概要 路由事件是具有更强传播能力的事件&#xff0c;它们可在元素树中向上冒泡和向下隧道传播&#xff0c;并沿着传播…

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师&#xff08;进阶&#xff09;》是由“ i春秋学院联合网易安全部”出品&#xff0c;资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战&#xff0c;帮助学员纵向提升技能&#xff0c;横向拓宽视野&#xff0c;牢靠掌握Web安全工程师核心…

【任职资格】某大型制造型企业任职资格体系项目纪实

该企业以业绩、责任、能力为导向&#xff0c;确定了分层分类的整体薪酬模式&#xff0c;但是每一名员工到底应该拿多少工资&#xff0c;同一个岗位的人员是否应该拿同样的工资是管理人员比较头疼的事情。华恒智信顾问认为&#xff0c;通过任职资格评价能实现真正的人岗匹配&…

DVB-S系统仿真学习

DVB-S系统用于卫星电视信号传输&#xff0c;发送端框图如下所示 扰码 实际数字通信中&#xff0c;载荷数据的码元会出现长连0或长连1的情况&#xff0c;不利于接收端提取时钟信号&#xff0c;同时会使得数据流中含有大量的低频分量&#xff0c;使得QPSK调制器的相位长时间不变…

中国国际通信大会2024|中国通信展览会|通信展览会

中国国际通信大会2024|中国通信展览会|通信展览会 中国国际信息通信展览会&#xff08;ICT展&#xff09;是亚太地区最具影响力的信息通信技术盛会之一。每年一度的ICT展汇聚了来自全球各行各业的专业人士&#xff0c;为各领域的科技公司、创新企业以及技术爱好者们提供一个难得…

数据结构学习——无头+单向+非循环链表增删查改实现

链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 注意&#xff1a; 链式结构在逻辑上是连续的&#xff0c;但是在物理上不一定连续在链表实现过程中&#xff0c;结点一…

轻松赚钱,精彩生活:上班族副业赚钱新攻略大揭秘!

薪水总是捉襟见肘&#xff0c;每月账单总让人倍感压力。你是否曾在静谧的夜晚&#xff0c;躺在床上&#xff0c;思索如何为家庭多赚一分钱&#xff1f;其实&#xff0c;你并不孤单。在这个充满机遇与挑战的时代&#xff0c;越来越多的人开始寻找副业&#xff0c;以期望让生活更…

使用easyYapi生成文档

easyYapi生成文档 背景1.安装配置1.1 介绍1.2 安装1.3 配置1.3.1 Export Postman1.3.2 Export Yapi1.3.3 Export Markdown1.3.4 Export Api1.3.6 常见问题补充 2. java注释规范2.1 接口注释规范2.2 出入参注释规范 3. 特定化支持3.1 必填校验3.2 忽略导出3.3 返回不一致3.4 设置…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

spring boot3自定义注解+拦截器+Redis实现高并发接口限流

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 内容简介 实现思路 实现步骤 1.自定义限流注解 2.编写限流拦截器 3.注册拦截器 4.接口限流测试 写在前…

2024最新Win系统下VSCode下载安装与配置C/C++教程

2024最新Win系统下VSCode下载安装与配置C/C教程 文章目录 2024最新Win系统下VSCode下载安装与配置C/C教程1、下载安装VSCode2、安装运行时环境GCGC的环境配置 3、安装VSCode插件4、配置程序调试环境4.1确定文件存储路径4.2新建文件夹【.vscode】4.3在.vscode文件夹里新建四个配…