Glow-TTS论文阅读

论文链接:Glow-TTS: A Generative Flow for Text-to-Speech via Monotonic Alignment Search

摘要

近年来,文本到语音(TTS)模型,如FastSpeech和ParaNet已被提出以并行方式从文本生成混合声谱图。尽管具有这些优势,但如果没有自回归TTS模型作为外部对准器的指导,并行TTS模型无法进行训练。本工作提出了一种基于流的并行TTS生成模型Glow-TTS,它不需要任何外部对准器。通过结合流的特性和动态规划,该模型搜索文本和语音潜在表示之间最可能的单调对齐。实验证明,强制执行硬单调对齐可实现稳健的 TTS,它可以推广到长话语,并使用生成流可以实现快速、多样化和可控的语音合成。在合成时,Glow-TTS比自回归模型Tacotron 2获得了一个数量级的速度提升,语音质量可与之媲美。实验进一步表明,该模型可以很容易地扩展到多扬声器设置。

简介

在神经TTS模型中,自回归模型如Tacotron 2和Transformer TTS表现出了最先进的性能。尽管自回归TTS模型的综合质量很高,但在实时服务中直接部署它们还存在一些困难。当模型的推理时间随输出长度线性增长,在没有设计复杂的框架前提下,生成长话语引起的不良延迟可以传播到 TTS 系统的多个管道。此外,大多数自回归模型在某些情况下都缺乏鲁棒性;例如,当输入文本包含重复的单词时,自回归TTS模型有时会产生严重的注意错误。

为了克服自回归TTS模型的这些局限性,并行的TTS模型,如FastSpeech被提出。这些模型可以比自回归模型更快地合成mels谱图。除了快速采样之外,FastSpeech还通过限制其对齐单调来减少合成失败的情况,如错误发音、跳过或重复单词。然而,为了训练并行的TTS模型,文本和语音之间的注意力对齐信息是必要的。最近提出的平行模型从它们的外部对齐器中提取注意图,预训练自回归TTS模型。因此,模型的性能在很大程度上取决于外部对准器的性能。

本工作消除了任何外部对准的必要性,并简化了并行TTS模型的训练过程。在这里,提出了Glow-TTS,一个基于流的并行TTS生成模型,可以内部学习自己的对齐方式。通过结合流和动态规划的特性,Glow-TTS有效地搜索文本和潜在语音表示之间最可能的单调对齐。提出的模型是直接训练,以最大对数似然与对齐语音。实验证明,强制执行硬单调对齐可实现稳健的 TTS,它可以推广到长话语,而使用流可以实现快速、多样化和可控的语音合成。

Glow-TTS生成梅尔谱图的速度比自回归TTS模型Tacotron 2快15.7倍,同时获得了相当的性能。在鲁棒性方面,当输入话语较长时,该模型的性能明显优于Tacotron 2。通过改变语音的潜在表征,可以合成各种语调模式的语音,调节语音的音高。进一步表明,该模型可以扩展到多扬声器设置,只需要一些修改。

相关工作

文本和语音对齐估计

传统上,隐藏马尔可夫模型(hmm)一直被用来估计文本和语音之间的未知对齐。在语音识别中,CTC(Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks)被提出作为一种方法来缓解hmm的缺点,例如通过判别神经网络模型,假设条件独立于观察结果。上述两种方法都可以通过动态规划的前向后向算法进行有效的对齐估计。本工作引入了一个类似的动态规划方法来搜索文本和语音潜在表示之间最可能的对齐,该建模与CTC的不同之处在于它是生成的,而与hmm的不同之处在于它可以并行采样序列,而不需要假设条件独立于观察。

TTS模型

TTS模型是一类从文本中合成语音的生成模型。Tacotron 2、Deep Voice 3和Transformer TTS等TTS模型从文本中生成可与人的声音相媲美的梅尔谱图。增强TTS模型的表达能力也被研究。已经有人提出了通过控制语调、节奏等因素来生成不同语音的辅助嵌入方法,也有一些研究旨在将不同说话人的声音合成语音。最近,一些研究提出了并行生成梅尔频谱图帧的方法。与自回归TTS模型相比,FastSpeech和ParaNet显著加快了mel谱图的生成,同时保留了合成语音的质量。然而,两种并行的TTS模型都需要从预训练的自回归TTS模型中提取对齐信息,以缓解文本和语音之间的长度不匹配问题。Glow-TTS是一个独立的并行TTS模型,通过利用流和动态规划的特性,在内部学习对齐文本和语音。

基于Flow的生成模型

基于Flow的生成模型由于其优点受到了广泛的关注;此类模型可以通过应用可逆变换来估计数据的精确可能性,生成流只是为了最大化可能性而进行训练。除了有效的密度估计,NICE: Non-linear Independent Components EstimationDensity estimation using Real NVPGlow: Generative Flow with Invertible 1x1 Convolutions中提出的变换保证了快速高效的采样。Waveglow和FloWaveNet中将这些转换引入语音合成中,以克服自回归声码器WaveNet采样速度慢的问题;该两个模型合成原始音频的速度都比WaveNet快得多。通过应用这些转换,Glow-TTS可以并行合成给定文本的mel谱图。

与本工作并行的是,AlignTTSFlowtronFlow-TTS被提出。AlignTTS和Flow-TTS是不需要外部对准器的并行TTS模型,Flowtron是一个基于flow的模型,具有风格转移能力和语音变化的可控性。但是,AlignTTS 不是基于流的模型,而是前馈网络,Flowtron 和 Flow-TTS 使用了软注意力模块。通过同时使用硬单调对齐和生成流,提出的模型在鲁棒性、多样性和可控性方面结合了两全其美。

Glow-TTS

受人类有序读出文本而不跳过任何单词的事实的启发,本工作设计了Glow-TTS来生成基于文本和语音表示之间的单调和非跳过对齐的MEL语谱图。

训练和推理过程

Glow-TTS通过基于流的编码器 f d e c : z → x f_{dec}:z→x fdec:zx将mel谱图的条件分布 P X ( x ∣ c ) P_X(x|c) PX(xc)建模转换为条件先验分布 P Z ( z ∣ c ) P_Z(z|c) PZ(zc), 其中 x 和 c x和c xc分别表示输入 mel 谱图和文本序列。通过使用变量的变化,可以计算出数据的精确对数似然如下:
在这里插入图片描述

用网络参数 θ θ θ和对齐函数 A A A参数化数据和先验分布。先验分布 P Z P_Z PZ为各向同性多元高斯分布,由文本编码器 f e n c f_{enc} fenc得到先验分布的 μ 和 σ μ和σ μσ的全部统计量。文本编码器将文本条件 c = c 1 : T t e x t c = c_{1:T_{text}} c=c1:Ttext映射到统计量中, μ = μ 1 : T t e x t μ = μ_{1:T_{text}} μ=μ1:Ttext σ = σ 1 : T t e x t σ = σ_{1:T_{text}} σ=σ1:Ttext,其中 T t e x t T_{text} Ttext表示文本输入长度。在本论文公式中,对齐函数 A A A代表从语音的潜在表示的索引到 f e n c f_{enc} fenc的统计索引的映射: A ( j ) = i A(j) = i A(j)=i,如果 z j ∼ N ( z j ; μ i , σ i ) z_j ∼ N (z_j; μ_i, σ_i) zjN(zj;μi,σi)。假设对齐函数A是单调且满射的,以确保Glow-TTS不会跳过或重复文本输入;则先验分布可以表示为:
在这里插入图片描述
其中 T m e l T_{mel} Tmel表示输入mel谱图序列的长度。

目标是找到参数 θ θ θ和对齐 A A A,使数据的对数似然最大化,如方程3。然而,要找到全局解是一个计算难题。为了解决这一难题,通过将目标分解为两个后续问题来减少参数和对齐的搜索空间:( i i i)搜索关于当前参数 θ θ θ的最可能的单调对齐 A ∗ A^* A,如公式4;( i i ii ii)更新参数 θ θ θ以最大化对数似然对数 l o g log log p X ( x ∣ c ; θ , A ∗ ) p_X (x|c;θ,A^∗) pX(xc;θ,A)。在实践中,使用迭代方法处理这两个问题。在每个训练步骤,首先找到 A ∗ A^* A,然后使用梯度下降更新 θ。迭代过程实际上是广泛使用的维特比(Viterbi)训练的一个例子,它使最可能隐藏对齐的对数似然最大化。修正后的目标不能保证方程3的全局解,但仍然提供了一个较好的全局解的下界。
在这里插入图片描述
为了解决对齐搜索问题( i i i),引入了一种对齐搜索算法——单调对齐搜索(MAS)。为了估计推理时最可能的单调对齐 A,还训练持续时间预测器 f d u r f_{dur} fdur以匹配从对齐 A ∗ A^* A计算的持续时间标签,如等式 5 所示。遵循 FastSpeech的架构,将持续时间预测器附加到文本编码器的顶部,并使用对数域中的均方误差损失 (MSE) 对其进行训练;还将停止梯度算子 s g [ ⋅ ] sg[·] sg[]应用于持续时间预测器的输入以避免影响最大似然目标,如图1a所示。持续时间预测器的损失如公式6所示。
在这里插入图片描述在推断过程中,如图1b所示,文本编码器和持续时间预测器将预测先验分布和对齐的统计信息。然后,从先验分布中采样潜变量,通过基于流的译码器对隐变量进行变换,并行合成梅尔谱图。
在这里插入图片描述

图1 Glow-TTS的训练和推理过程简图

单调对齐搜索

MAS分别从输入语音和文本中寻找潜在变量和先验分布统计量之间最可能的单调对齐。图2a显示了可能的单调对齐的一个示例。
在这里插入图片描述

图2 单调对齐搜索/MAS算法示意图

在算法1中提出了对齐搜索算法,首先推导出部分对齐的递归解,然后找到整个对齐。设 Q i , j Q_{i,j} Qi,j为最大对数似然,其中先验分布和潜在变量的统计量分别部分地给予给第 i i i行和第 j j j列元素。然后, Q i , j Q_{i,j} Qi,j可以用 Q i − 1 , j − 1 Q_{i-1,j-1} Qi1,j1 Q i , j − 1 Q_{i,j-1} Qi,j1递归公式化,如公式 7 所示,因为如果部分序列的最后一个元素 z j z_j zj μ i , σ i {μ_i, σ_i} μi,σi对齐,则先前的潜在变量 z j − 1 z_{j−1} zj1应该与 μ i − 1 , σ i − 1 {μ_{i-1}, σ_{i-1}} μi1,σi1 μ i , σ i {μ_i, σ_i} μi,σi对齐以满足单调性和满射性。
在这里插入图片描述
这个过程如图2b所示,迭代计算 Q Q Q Q T t e x t , T m e l Q_{T_{text,Tmel}} QTtext,Tmel的所有值。类似地,可以通过确定递归关系(等式7)中哪个 Q Q Q值更大来获得最可能的对齐 A ∗ A^* A。因此,可以通过缓存所有 Q Q Q值通过动态规划有效地找到 A ∗ A^* A A ∗ A^* A的所有值都从对齐的末尾回溯, A ∗ ( T m e l ) = T t e x t A^*(T_{mel}) = T_{text} A(Tmel)=Ttext,如图 2c 所示。

算法的时间复杂度为 O ( T t e x t × T m e l ) O(T_{text}×T_{mel}) O(Ttext×Tmel)。尽管该算法难以并行化,但在不需要GPU执行的情况下,可以在CPU上高效运行。在实验中,每次迭代花费的时间小于20 ms,不到总训练时间的2%。此外,在推断过程中不需要MAS,因为使用持续时间预测器来估计对齐。
在这里插入图片描述

算法1

模型架构

Decoder/解码器

Glow-TTS 的核心部分是基于流的解码器。在训练期间,需要有效地将梅尔谱图转换为潜在表示,以进行最大似然估计和内部对齐搜索。在推理过程中,需要将先验分布有效地转换为梅尔谱图分布以进行并行解码。因此,解码器由一系列可以并行执行正向和反向变换的流组成。具体来说,解码器是多个块的堆栈,每个块由激活归一化层、可逆 1x1 卷积层和仿射耦合层组成;除了不使用局部调节,遵循 WaveGlow中的仿射耦合层架构。

为了提高计算效率,将80个通道的梅尔谱图帧沿时间维度分成两部分,并在流操作之前将它们分组到一个160通道的特征图中;还修改了1x1卷积,以减少计算雅可比行列式的时间。在每一次1x1卷积之前,将feature map沿着通道维度分成40组,分别进行1x1卷积。为了使每组的信道混合,分别从耦合层分离的特征图的一半和另一半中提取相同数量的信道。

Encoder and Duration Predictor/编码器和持续时间预测器

遵循Transformer TTS的编码器结构,并做了两个轻微的修改;一是删除了位置编码,并将相对位置表示添加到self-attention模块中,二是向编码器预处理网添加了一个残差连接。为了估计先验分布的统计量,在编码器的末尾添加了一个线性投影层。持续时间预测器由两个卷积层(ReLU激活)、层归一化、dropout和一个投影层组成。持续时间预测器的结构和配置与FastSpeech相同。

完整详细的模型架构见附件A。

实验

为了评价所提出的方法,在两个不同的数据集上进行了实验。对于单个speaker设置,使用单个女性speaker数据集LJSpeech,该数据集由13,100个短音频剪辑组成,总时长约为24小时。将数据集随机分为训练集(12,500个样本)、验证集(100个样本)和测试集(500个样本)。对于speaker设置,使用LibriTTS语料库的train-clean-100子集,它由247个speaker的音频录音组成,总时长约为54小时。首先修剪所有音频片段的开始和结束沉默,并过滤掉文本长度超过190的数据;然后将其分为训练(29,181个样本)、验证(88个样本)和测试集(442个样本)。此外,还收集分布外的文本数据用于稳健性测试。与 Location-Relative Attention Mechanisms For Robust Long-Form Speech Synthesis相似,从《哈利波特与魔法石》的前两章中提取了227句话语,采集数据的最大长度超过800。

比较了Glow-TTS与最佳的公开可用的自回归TTS模型Tacotron 2。所有的实验都选择音素作为输入文本标记,遵循Waveglow的梅尔谱图的配置,两个模型生成的所有梅尔谱图都通过预先训练的声码器WaveGlow转换为原始波形。在训练过程中,简单地将可学习先验的标准差 σ σ σ设为常数1。使用Adam优化器和Noam学习率计划(Transformer中提出)对Glow-TTS进行240K次迭代训练,这只需要在两个NVIDIA V100 gpu上进行3天的混合精确训练。

为了训练多speaker的Glow-TTS,增加了speaker嵌入层,增加了隐藏维度;speaker嵌入层应用于所有仿射耦合层的解码器作为一个全局条件。其余设置与单个扬声器设置相同。为了进行比较,还训练Tacotron 2作为基线,它在每个时间步将speaker嵌入层与编码器输出连接起来。使用与单个扬声器相同的模型配置。所有多speaker模型在4块NVIDIA V100 gpu上进行了960K迭代训练。

结果

音频质量

通过Amazon Mechanical Turk测量平均意见评分(MOS),以比较所有音频片段的质量,包括GT和合成样本;从测试集中随机抽取50个句子进行评价。结果如表1所示。声码器对GT梅尔谱图转换后的语音质量(4.19±0.07)是TTS模型的上限。在推断时改变先验分布的标准差(即温度T),Glow-TTS在0.333温度下表现最佳。在任何温度下,它都显示出与Tacotron 2相当的性能。
在这里插入图片描述

表1 单扬声器TTS模型的平均意见评分(MOS), 95%置信区间

采样速度和鲁棒性

采样速度

使用测试集来测量模型的采样速度。图3a表明,本模型的推断时间在40ms几乎是恒定的,无论长度如何,而Tacotron 2的推断时间由于连续采样而随长度线性增加。平均而言,Glow-TTS的合成速度是Tacotron 2的15.7倍。测量了在端到端环境下使用Glow-TTS和WaveGlow合成1分钟语音的总推理时间。合成1分钟语音的总推断时间仅为1.5秒,Glow-TTS和WaveGlow的推断时间分别占总推断时间的4%和96%;Glow-TTS合成mel谱图的推断时间仅为55ms,与声码器相比可以忽略不计。

鲁棒性

通过谷歌Cloud Speech-ToText API测量了《哈利波特与魔法石》中合成的长句子样本的字符错误率(CER)。图3b显示Tacotron 2的CER在输入字符长度超过260左右时开始增长。另一方面,尽管Glow-TTS在训练过程中没有看到如此长的文本,但它对长文本具有鲁棒性。

在这里插入图片描述

图3 推理时间和长度鲁棒性的比较

多样性和可控性

因为 Glow-TTS 是基于流的生成模型,它可以合成多样化的样本;从输入文本中采样的每个潜在表示 z z z都被转换为不同的梅尔谱图 f d e c ( z ) f_{dec}(z) fdec(z)。具体来说,潜在表示 z ∼ N ( μ , T ) z ∼ N (μ, T ) zN(μ,T)可以表示: z = μ + ε ∗ T z = μ + ε * T z=μ+εT,其中 ε ε ε表示来自标准正态分布的样本,并且 μ μ μ T T T分别表示先验分布的均值和标准差(即温度)。

为了分解 ε ε ε T T T的影响,在图4中通过每次改变 ε ε ε T T T一个来绘制合成样本的音调轨迹。图 4a 表明不同的重音或语调模式来自 ε ε ε,而图 4b 表明可以控制语音的音高,同时仅通过改变 T T T来保持相似的语调。此外,可以通过在持续时间预测器的预测持续时间内乘以一个正标量值来控制说话的速度。结果如图5所示;乘以预测持续时间的值分别为1.25、1.0、0.75和0.5。
在这里插入图片描述

图4 在LJ数据集上训练的Glow-TTS合成语音样本的基频(F0)轮廓

在这里插入图片描述

图5 不同语速下生成的语音样本的mel谱图

多speaker-TTS

音频质量

选择了50个speaker,并从测试集中随机抽取每个speaker的一句话进行评估。结果如表2所示。GT梅尔谱图转换的语音质量(4.22±0.07)是TTS模型的上限,Glow-TTS模型与最佳配置达到3.45 MOS,能媲美Tacotron 2的性能。
在这里插入图片描述

表2 多speaker-TTS的平均意见评分(MOS), 95%置信区间

Speaker-Dependent Duration

图 6a 显示了从具有不同speaker说的同一句子中生成的语音的音高轨迹。由于输入的唯一区别是speaker身份,结果表明Glow-TTS模型以不同的方式预测每个输入标记相对于speaker身份的持续时间。

Voice Conversion

由于没有向编码器提供任何说话人身份,因此先验分布被迫独立于说话人身份。换句话说,Glow-TTS学会了解开潜在表征 z z z和speaker的身份。为了研究解纠缠的程度,将一个GT混合谱图转换为具有正确说话人身份的潜在表示,然后将其转换为不同speaker身份的潜在表示。详细的方法可以在附录B.3中找到,结果如图6b所示。结果表明,转换后的样本具有不同的音调水平,但保持了相似的趋势。

在这里插入图片描述

图6 在LibriTTS数据集上训练的Glow-TTS合成语音样本的基频(F0)轮廓

结论

本文提出了一种新型的并行TTS模型——Glow-TTS。Glow-TTS是一种基于流量的生成模型,直接使用最大似然估计进行训练。由于该模型能够自行找到文本和语音潜在表示之间最可能的单调对齐,因此整个训练过程在不需要外部对齐器的情况下得到简化。除了简单的训练程序外,还表明Glow-TTS合成mel谱图的速度是自回归基线Tacotron 2的15.7倍,同时表现出了相当的性能;还展示了Glow-TTS的其他优势,如控制合成语音的语速或音调的能力、鲁棒性以及对多speaker设置的可扩展性。由于这些优势,相信所提出的模型可以应用于各种TTS任务,如韵律转移或风格建模。

附录A

A.1 模型架构细节

详细的编码器架构如图7所示,编码器获取一个文本序列并通过前处理网络和Transformer编码器对其进行处理;然后,编码器的最后一个投影层和持续时间预测器使用隐藏表示 h h h别预测先验分布和持续时间的统计信息
在这里插入图片描述

图7 Glow-TTS的编码器结构

图8描述了在解码器中使用的一些实现细节和解码器架构。图8a中表示解码器得到一个梅尔谱图并压缩它;解码器通过多个流块对其进行处理,每个流块包含激活归一化层、仿射耦合层和可逆 1x1 卷积层;解码器重塑输出以使其等于输入大小。图8b展示了Squeeze和Unsqueeze操作;Squeeze时,通道大小增加一倍,时间步数变为一半。如果时间步数是奇数,简单地忽略梅尔谱图序列的最后一个元素,它对应于大约 11 毫秒的音频,这在质量上没有区别。本论文设计分组的1x1卷积能够混合通道;对于每一组,分别从耦合层分离的特征图的一半和另一半中提取相同数量的通道。图8c显示了一个示例,用于耦合层的两个分区分别为蓝色和白色;如果输入通道大小为 8,组数为 2,共享一个小的 4x4 矩阵作为可逆 1x1 卷积层的内核;通道混合后,将输入分成每组,分别进行 1x1 卷积。如果耦合层将一个8通道特征图[a, b, g, h, m, n, s, t]分成两半[a, b, g, h]和[m, n, s, t],当组数为2时,实现将其分组为[a, b, m, n]和[g, h, s, t],当组数为4时,实现将其分组为[a, m,],[b, n],[g, s],[h, t]。
在这里插入图片描述

图8 Glow-TTS的解码器结构及解码器的实现细节

A.2 超参数

Glow-TTS的超参数如表3所示。与主流的基于流的生成模型需要大量参数的想法相反,Glow-TTS (28.6M)的参数总数低于FastSpeech (30.1M)。
在这里插入图片描述

表3 Glow-TTS的超参数

附录B

B.1 Attention Error Analysis

使用100个测试句子来测量注意对齐结果。平均句子长度为59.65,最大句子长度为315。结果如表4所示。DeepVoice 3和ParaNet的结果取自Non-autoregressive neural text-to-speech,由于字素-音素转换工具的不同,不能直接进行比较。注意掩码是一种在推断时仅在目标位置周围的固定窗口上计算注意的方法,当采用注意掩模技术将注意约束为单调时,模型的注意误差较小。使用位置敏感注意的Tacotron 2也很少出现注意错误。虽然Glow-TTS在测试句子上的表现略逊于Tacotron 2,但与Tacotron 2相比,Glow-TTS并没有失去对极长的句子的鲁棒性。

在这里插入图片描述

表4 TTS模型在100个测试句子中的注意错误数

B.2 Glow-TTS与Tacotron 2的并排评价

在 Tacotron 2 和 Glow-TTS 之间进行了 7-point CMOS 评估,采样温度为 0.333,它们都在 LJSpeech 数据集上进行了训练。通过对 50 个项目的 500 次评分,Glow-TTS 以 0.934 的差距赢得了 Tacotron 2,如表 5 所示,这表明提出的模型优于 Tacotron 2。
在这里插入图片描述

表5 单speaker-TTS模型的比较平均意见评分(CMOS)

B.3 语音转换方法

为了将源说话者 s s s的梅尔谱图 x x x转换为目标说话者 s ^ \hat{s} s^的目标梅尔谱图 x ^ \hat{x} x^,首先通过基于流的解码器 f d e c f_{dec} fdec的反向传递与源说话者身份 s s s找到潜在表示 z z z z = f d e c − 1 ( x ∣ s ) z = f_{dec}^{-1}(x|s) z=fdec1(xs)。然后,通过带目标speaker身份 s ^ \hat{s} s^的译码器的前向传递,得到目标梅尔谱图 x ^ = f d e c ( z ∣ s ^ ) \hat{x} = f_{dec}(z|\hat{s}) x^=fdec(zs^)

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Ubuntu上安装Glow,您可以按照以下步骤进行操作: 1. 首先,您需要确保您的Ubuntu系统已经安装了PyTorch框架。您可以通过运行以下命令来安装PyTorch: ``` pip install torch torchvision ``` 2. 接下来,您需要下载Glow的源代码。您可以从Glow的官方GitHub仓库中获取源代码。您可以使用以下命令克隆存储库: ``` git clone https://github.com/chaiyujin/glow ``` 3. 进入克隆的存储库目录: ``` cd glow ``` 4. 现在,您可以使用以下命令安装Glow的依赖项: ``` pip install -r requirements.txt ``` 5. 安装完成后,您可以使用以下命令来运行Glow: ``` python run.py ``` 通过按照上述步骤进行操作,您应该能够在Ubuntu上成功安装和运行Glow。请注意,这些步骤是基于官方文档和提供的引用进行的。如果您遇到任何问题,请参考官方文档或提供的引用中的更多信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [glow:快速数据科学建模的例程](https://download.csdn.net/download/weixin_42151373/16308530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [ubuntu安装ch34x驱动](https://blog.csdn.net/Vingnir/article/details/129692235)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [利用Snappy Ubuntu来控制piglow灯光](https://blog.csdn.net/UbuntuTouch/article/details/49944895)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值