论文地址:A Wavenet For Speech Denoising

项目地址:Github-speech-denoising-wavenet

其他资料:演示地址

摘要

  • 目前,大多数语音处理技术使用幅度谱图作为前端,因此默认放弃信号的一部分:相位。为了克服这一局限性,我们提出了一种基于Wavenet的语音去噪端到端学习方法。所提出的模型自适应保留了Wavenet强大的声学建模能力,同时通过消除其自回归特性,显著降低了时间复杂度。具体来说,该模型使用非因果膨胀卷积预测目标域,而非单一目标样本。我们提出的模型的判别式自适应是通过最小化回归损失以监督的方式学习的。这些修改使得模型在训练和推理过程中具有高度的并行性。 计算评价和感知评价均表明,该方法优于常用的基于幅度谱图处理的维纳滤波方法

1. 介绍

  • 在过去的几十年中,机器学习已经为复杂的问题提供了解决方案,这些问题以前是信号处理技术无法实现的[4,12,38]。 语音识别就是其中的一个问题,其中机器学习产生了非常强烈的影响。然而,直到今天,标准做法不是直接在时域中工作,而是明确地使用时频表示作为输入[1,34,35],以降低原始波形的高维性。 同样,大多数语音去噪技术都使用幅度谱图作为前端[13、17、21、34、36]。 然而,这种做法的缺点是**丢弃潜在的有价值的信息(相位)**并利用通用特征提取器(幅度谱图分析),而不是学习给定数据分布的特定特征表示。

  • 最近已经证明神经网络在处理离散音频信号样本之间的结构化时间依赖性方面是有效的。例如,考虑语音波形的最局部结构(≈几十毫秒)。在此范围内,可以捕获说话者(音色)的许多声音特征,语音中的语言模式也可以通过音素的形式被理解。需要注意的是,这些层次的结构并不是离散的,这使得明确关注不同层次结构的技术注定不是最优的。这表明,能够直接从原始音频中学习多尺度结构的深度学习方法在学习这些结构方面可能具有很大的潜力。为此,判别模型被用于端到端学习音乐[6,15]或语音分类[5,20,39]。原始音频波形也被成功地用于生成任务[7,18,30,22]。有趣的是,大多数这些生成模型都是自回归的[7,18,30],SEGAN除外——它是基于生成对抗网络[22]。我们不知道任何生成原始音频模型是基于变分自编码器的。

  • 之前的讨论激发了我们对采用Wavenet模型(自回归生成模型)进行语音去噪的研究。我们的主要假设是,通过从原始音频中学习多尺度层次表示,我们可以克服使用幅度谱图作为此任务的前端的固有局限性。 在这个方向上已经存在一些工作。 80年代,Tamura等人[27]使用四层前馈网络直接在原始音频域操作,以学习降噪映射。 最近,Pascual等人[22]提出使用端到端生成对抗网络进行语音去噪,Qian等人[24]使用贝叶斯Wavenet进行语音去噪。在这三种情况下,它们提供的结果均优于基于处理幅度谱图的同类方法。

  • 第2节描述了原始Wavenet架构,第3节描述了我们提出的修改方案。在第4节中,我们将实验并讨论一些架构参数。最后,第5节以突出最相关的贡献作为结尾。

2. Wavenet

  • Wavenet能够合成自然发声语音[30]。给定先前样本的某些片段后,此自回归模型将生成下一个样本的概率分布。下一个样本是从这个分布中采样产生的。将之前生成的样本按顺序输入到模型中,从而产生完整的样本序列,从而增强结果音频波形的时间连续性。图1给出了模型的高级可视化描述。Wavenet是PixelCNN图像生成模型的音频域自适应[19,31]。Wavenet保留了PixelCNN的许多特征,如:因果关系门控卷积单元离散softmax输出分布以及在引入膨胀卷积和非线性量化[30]的同时调节模型的可能性。下面介绍了Wavenet的一些关键特性。

    图1 Wavenet的概述。

门控单元

  • 图2 左–残差层。 右–有增长膨胀因子的因果膨胀卷积。

与LSTM [9]中一样,S型门控控制每层激活的贡献:

其中*和⊙分别表示卷积和逐元素乘积,f,t,t’,g表示过滤器、输入时间、输出时间和门标,Wf和Wg是卷积滤波器,图2(左)描述了S型门控的使用方法。

因果膨胀卷积

Wavenet使用因果膨胀卷积[30,37]。它使用了一系列小卷积滤波器(长度= 2)与指数增长的膨胀因子。这导致感受野随深度呈指数级增长。非对称填充与膨胀因子成比例,可防止激活信息向后传播,从而加强了因果关系-见图2(右)。每个膨胀的卷积包含在残差层[8]中,由一个s形门和一个附加的1x1卷积和一个残差连接控制-参见图2(左)。

μ律量化

使用离散Softmax输出分布时,有必要使用更粗糙的8bit量化以使任务在计算上易于处理。通过μ律非线性压扩,然后进行8bit量化(256个可能的值):

残差连接

残差连接具有两个优势。首先,有助于训练深度模型。其次,每一层的信息都可以直接传播到最终层。因此网络可以将不同层次提取的特征显式地融合到最终的预测中。图1和图2(左)提供了如何使用残差连接的更多详细信息。

上下文堆

增加膨胀系数会急剧增加感受野的大小,而Context Stacks可以加深网络的同时避免这一问题。这是通过将彝族膨胀到最大膨胀系数的层堆叠到一起实现的,并且可以根据需要进行多次。例如,图2(右)由一个堆组成。

时间复杂度

Wavenet一个显著的缺点是需要顺序生成样本(不能并行化),在语音降噪Wavenet设计中着重考虑了这一限制。

3. 语音降噪WaveNet

语音降噪技术旨在提高具有干扰背景噪声语音信号的清晰度和整体感知质量。通常经问题表述为:mt = st+bt,其中mt=混合信号,st=语音信号,bt=背景噪声信号。目标是给定混合信号mt估计语音信号st。语音降噪与语音合成有许多相同的特性,同时也有一些独特的特性——这些特性促进了这种Wavenet自适应的设计。图3给出了模型的高级可视描述。其主要特点如下:

  • 图3 语音去噪Wavenet概览

  • 图4 非因果的,膨胀因子指数增长的膨胀卷积。

  • 图5 根据目标字段预测

非因果

与语音合成相反,在语音去噪中,一些未来的样本通常可以帮助作出更充分的预测。即使在模型响应的延迟只有几毫秒的实时应用中,模型也可以访问在某个感兴趣的特定样本之后很短时间内样本中有价值的信息。因此,考虑到Wavenet的时间复杂性是一个主要的约束条件,该模型去掉了它的自回归因果性质。对Wavenet的非对称膨胀卷积模式(如图2所示)的逻辑扩展是将过滤器长度增加到3,并在每个膨胀层上使用对称填充。如果我们要增强的样本位于感受野的中心,这就会使感兴趣的样本周围的上下文加倍,并消除因果关系。模型可以获得过去与未来相同数量的样本来进行预测。如图4所示。在早期的实验中,长度为5,11和21的较大滤波器的性能较差。

实值预测

Wavenet使用离散softmax输出避免对输出分布的形状做出任何假设——这适合于对多模态分布进行建模。但是,早期使用离散softmax输出进行的实验证明是不利的。 相反,潜在的多模式输出分布允许将伪像引入去噪信号中。 这表明实值预测(假设单峰高斯形状的输出分布)似乎更适合我们的问题。 此外,使用离散softmax输出进行的实验导致输出分布具有高方差——表示具有最高概率的值置信度低μ律量化也是不利的,因为它不成比例地放大了背景噪声。 由于这些原因,提出的模型无需任何预处理即可预测原始音频

恒等能量损失

我们建议利用两项损失来加强能量节约:

从混合输入中去掉去噪语音,就可以估计出背景噪声信号,如图3所示-及以下公式:

最终,网络预测了信号的两个组成部分,并且,由于第二个输出是通过对语音估计的无参数操作产生的,由此产生的损失直接代表了模型执行实际感兴趣任务的能力。由:

有:

因此,提出的估算bt’的方法将两个项损失调整为原始混合音频的恒等能量:Emt‘ = Emt。 先前的工作考虑了能量守恒的流程:用于源分离[23,3]或用于语音增强[34]。 最后,请注意,拟议损失中的第一项对应于标准L1损失——在表1的基准模型中使用以进行比较。

判别模型

请注意,提出的模型不再是自回归模型,其输出也不是显式建模概率分布,而是输出本身。 此外,通过最小化回归损失函数,以监督方式训练模型。 结果:提出的模型不是生成模型(如Wavenet),而是判别模型

最后的3x1卷积

如前所述,提出的模型不是自回归的。 也就是说,前面生成的样本不会反馈到模型中以告知将来的预测——这会在结果信号中强制实现时间连续性。 早期的实验产生了带有零星点间断的波形,听起来非常混乱。将最后两个层的1x1卷积核替换为3x1卷积核可以重新施加连续性约束。 我们还考虑了更大的内核,但这些并没有改善结果。

目标字段预测

提出的模型在单次正向传播中并不是只预测一个样本,而是预测一组样本—参见图5。将推理过程从1个样本并行化到1000个样本,可以显著节省内存和时间。这是因为重叠数据用于预测邻近的样本,而通过预测目标字段,这些冗余计算只进行一次。

模型的感受野长度(rf)是用于预测单个去噪输出样本的输入样本数。 为了保持目标字段(tf)中的每个输出样本具有有助于其预测的完整的上下文感受野,呈现给模型的片段的长度必须等于:rf +(tf - 1)。 最后,请注意,代价是按样本计算的——在训练期间,目标字段的单个样本代价用均值表示。

条件

该模型以与说话人身份对应的二进制编码标量为条件。 该条件值是每个卷积运算中的偏置项。 条件值1-28代表组成训练集的28位说话人。 此外,我们添加了一个辅助代码(全零)来表示任一说话人身份,以便将训练后的模型用于未知说话人。 相同的训练数据会根据其说话人ID或零值呈现给模型。 1/29%的训练样本的条件值设为零。 注意,该条件处理过程也可以解释为数据增强策略

只有噪声的数据增强

在观察到我们的模型难以产生静音之后,我们采用了一种增强形式,即其中一部分训练样本仅包含背景噪声。 在第4.3节中,我们使用10%和20%的纯噪声训练样本进行实验。

去噪步骤

在网络中加入带噪声的语音片段,并将条件值设为零。默认情况下,网络批量地对输入去噪,迭代地将去噪后的每个片段附加到之前的片段上。另外,我们使用的全卷积架构在时域上是灵活的。因此,它允许对不同长度的音频进行去噪,而不是训练时使用的音频。这使得该模型可以一次性降噪整个音频样本——只要有足够的内存可用。

4. 实验

4.1 数据集

使用的数据集[22,29]是从两个来源生成的:语音数据由Voice Bank 语料库 [32]提供,而环境声音由多环境多通道噪声数据库(DEMAND)[28]提供。我们使用的Voice Bank语料库的子集包含来自世界各地的30位母语为英语的人朗读400个句子——28位讲者用于训练,2名用于测试。录音质量达到录音棚质量,采样频率为48kHz,本次研究将频率下采样到16kHz。我们使用的DEMAND子集提供了在13种不同环境条件下的录音,例如在公园,公共汽车或咖啡馆中–在训练过程中将8种背景噪声与语音混合在一起,在测试过程中使用了5种背景噪声。 DEMAND是使用以48kHz采样的16通道阵列制作的,但是出于此工作的目的,所有通道被合并并二次采样至16kHz。在训练期间,增加了两个人工噪声类别——训练期间总共提供了10种不同的噪声类别训练样本以以下四种信噪比(SNR):0、5、10和15dB之一与10种噪声类型之一进行合成混合。这样可以在40种不同的噪声条件下,从28位说话者那里获得11572个训练样本测试样本以四种不同的SNR之一:2.5、7.5、12.5和17.5dB,与5种测试噪声类型之一进行合成混合,因此2个说话人有20种噪声条件。结果,测试集包含了824个来自未知的说话人和噪声条件的样本。对于两组,样本平均持续3秒,标准偏差为1秒。不使用对音频的预处理(例如,预加重过滤[22]或μ律量化 [30]),从而从最严格的意义上讲,该流程是端对端的。

4.2 基本实验设置

本文提出的模型具有30个残差层,如图2(左)所示。每层的膨胀因子以2的幂增加1、2,…,256、512的范围内。此模式重复3次(3堆)。在第一次膨胀卷积之前,线性1通道输入通过标准的3x1卷积投影到128个通道,以符合每个残差层中的滤波器数量。残差连接是128通道的1x1卷积,将残差连接求和后将应用RELU激活函数最后的两个3x1卷积不进行膨胀,分别包含2048和256个通道,并由RELU层分隔。输出层通过使用1x1滤波器将特征图线性投影为单通道时间信号。使用该参数会得到6139个样本(384毫秒)的感受野目标字段由1601个样本(100毫秒)组成——经过优化以符合我们的内存限制。该模型大小相对较小(630万个参数)加上对1601个样本的一次并行推断,因此在GPU上的嘈杂音频降噪时间仅为每秒0.56秒。除非明确说明,否则我们假定使用以下基本实验设置:训练时使用恒等能量损失,以说话人ID为条件,没有使用数据增强。可以在线获取代码和预训练模型。

我们将比较的基准模型设置为:i)噪声信号,以及ii)基于维纳滤波的信号处理方法——一种广泛用于语音去噪[34、25]或源分离[2、3、23、11]的技术 。 基线算法使用基于先验SNR估计的Wiener滤波方法[25],见4。

4.3 计算度量评估

我们的目的是从三个方面测量去噪语音的质量:信号失真背景噪声干扰整体质量。 为此,我们考虑了三种措施[10]:SIG-信号失真预测器BAK-背景噪声干扰预测器; 和OVL-整体质量预测指标。 这些评价指标在1-5分范围内,旨在通过计算来近似表示人类感知试验产生的平均意见得分(MOS)。

我们进行了如下实验:研究纯噪声数据的增加、目标字段长度、恒等能量损失和条件如何影响模型的性能。 与这些实验有关的已计算MOS度量值一起列在表1中。斜体行对应于上面介绍的基本实验设置。 非斜体行表示对基本设置进行了单个参数调整。

没有数据增强(0%)的基本实验设置可以在所有指标上获得更好的结果。 但是,通过人耳主观感受可以清楚地发现,使用10%的纯噪声增强训练可以使模型在没有语音出现的片段产生静音,而不会降低信号质量,这在听觉上评估去噪样本时令人愉悦。仅20%的噪声增强会得到较低的MOS额定计算值,进一步的聆听表明它并没有提高去噪样本的质量。

此外,我们观察到训练时使用更长的目标字段的对于实现有效去噪至关重要。用小的目标字段长度训练的模型产生的音频不仅无法进行去噪,而且听起来比输入更模糊。此外,我们发现目标字段长度较小的模型需要很长的推理时间(由于存在很多冗余计算),因此,表1中较小目标字段长度的结果是使用20个样本的感知测试集计算得出的。

尽管从听觉上几乎感受不到改善,但提出的恒等能量损失也比标准的L1损耗获得了更好的结果。 之所以会发生这种情况,是因为恒等能量损失仅是L1损失的两倍,这是所提出的模型计算背景噪声估计的方式造成的。当可以通过更强大的模型预测背景噪声时,我们将继续研究损失的影响。

结果表明,以说话人ID为条件有利于实现更好的语音降噪效果。所有指标都有所改善,尽管改善十分微小。 听觉感受确认了计算度量评估的结果:条件样本中的背景噪声和算法伪像能明显的感知到有所减少。

将我们提出的模型与基线维纳滤波方法进行比较时,我们发现OVL和SIG结果相当,这表明维纳滤波同样可以保留语音信号的质量。 但是,我们提出的方法比维纳滤波更有效地去除了背景噪声。 与此相符,听觉感受证实了维纳滤波有一下风险:没有测量到强烈的语音信号失真,同样也没有大量消除背景噪声。 将维纳滤波MOS度量与在噪声信号上测量的MOS度量进行比较时,可以观察到基线算法在不引入算法构件的情况下降噪。

可以看出,仅凭计算度量并不能得出明确的表示最佳配置。基于先前讨论的主观听觉和计算出的MOS度量,我们认为以下模型可以获得最佳的声音结果:有条件,恒等能量损失,目标字段为1601个样本,增加10%的纯噪声数据。

4.4 感知评估

对33位参与者进行了感知测试,以获得关于语音降噪Wavenet有效性的主观反馈。选择了20个音频样本来构成感知测试集:4个SNR,每个SNR取5个样本,测试集中的2个说话人的样本数量也相等。除了这些限制以外,还随机选择了样本。向参与者展示了每个样本的4种变体:i)带有语音和背景噪声的原始混合音频,ii)干净的语音,iii)通过维纳滤波去噪的语音,以及iv)用表现最佳的Wavenet去噪的语音——在4.3最后定义的模型。要求参与者针对最后两个变体分别给语音质量和背景噪声抑制打分。前两个变体是作为参考的。参与者可以给出1-5分,其中1被描述为“背景音干扰严重的退化语音”,而5表示“背景音不明显的非退化语音” [10,16]。MOS质量测量是通过平均所有参与者的分数而获得的。我们还计算了t检验( H0是相等的)以研究获得的结果是否具有统计意义。表2给出了感知评估的结果,表明,相对于基于维纳滤波的方法,参与者更喜欢(t检验:p值<0.001)我们提出的方法。

5. 总结

我们提出了Wavenet的判别式适应语音降噪模型,该模型具有非因果非自回归架构。 这使我们能够减少模型的时间复杂度,这是Wavenet的主要缺点之一。 但是,消除自回归也意味着所生成信号中不再强制具有时间连续性。为了克服这一限制,我们观察到在模型的最后一层使用3x1滤波器可以保持相邻的连续性

我们提出的模型能够预测目标字段而不是单个样本——从而进一步降低了时间复杂度,同时还显着提高了模型的性能。另外,该模型的卷积性质使其在时间维度上具有灵活性。因此,它支持对可变长度的音频进行去噪,而与模型的训练方式无关。 因此,提出的模型允许单次去噪。 这种灵活性可能很有价值,因为可以在具有可变内存容量的不同硬件上进行训练和推理。

算法组件出现在我们研究的早期。这些算法组件的引入是因为Wavenet使用了softmax输出,将其转换为实值输出是移除这些组件的关键。有趣的是,请注意,直接在原始音频域中进行操作可以考虑从域知识的角度来考虑替代成本。

最初,模型难以产生静音片段。为了缓解这一问题,我们使用了纯噪声数据增强方法,该方法已被证明是有效的。 然而,该模型仍然有其局限性,即:它无法处理突然的干扰,例如城市交通中的鸣叫。

尽管我们的重点是语音降噪,但值得注意的是,该模型固有地估计了两个源:语音和背景噪声,因为可以通过从输入中减去语音估计来计算背景噪声。 这些结果与最近的工作[33]一致,表明端到端流程也开始证明对源分离任务有效。

要特别注意的是,我们的流程中没有加入语音特定约束来克服上述挑战。反而,我们要么建议对模型进行体系结构改进,要么建议采用新的数据增强。 我们提出的模型在噪声条件下和从未接触过的说话人中有效地对语音信号进行了降噪,音频样例可在线收听6。 这意味着我们提出的判别式Wavenet适应不会在显着降低其时间复杂度的同时牺牲建模能力。

此外,我们对Wavenet进行语音去噪的适应与贝叶斯变体[24]有很多不同,特别是:i)我们没有显式地操作概率分布,并且ii)我们的模型没有顺序推断。

最后,感知测试表明,与基于维纳滤波器的估计相比,我们的模型的估计更好。 这证明了可以从原始音频中学习多尺度层次表示,而不用使用幅度谱作为语音去噪任务的前端。

论文阅读:《A Wavenet For Speech Denoising》相关推荐

  1. 《基于卷积神经网络的深度迁移学习,用于燃气轮机燃烧室的故障检测》论文阅读

    目录 突出 抽象 引言 1.1动机 1.2文献综述获得的结论 1.3贡献 1.4组织 2方法 2.1燃汽轮机组故障知识共享 2.2迁移学习 2.3 基于卷积神经网络的深度迁移学习 2.4用于燃气轮机燃 ...

  2. 基于卷积神经网络和投票机制的三维模型分类与检索 2019 论文笔记

    作者:白静 计算机辅助设计与图形学学报 1.解决的问题 由于三维模型投影得到的视图是由不同视点得到,具有相对独立性,这种像素级的融合运算并没有直接的物理或者几何意义,更有可能造成图像有益信息淹没和混淆 ...

  3. TextCNN——基于卷积神经网络的文本分类学习

    1.CNN基础内容 CNN的全称是Convolutional Neural Network,是一种前馈神经网络.由一个或多个卷积层.池化层以及顶部的全连接层组成,在图像处理领域表现出色. 本文主要学习 ...

  4. 读懂深度迁移学习,看这文就够了 | 赠书

    百度前首席科学家.斯坦福大学副教授吴恩达(Andrew Ng)曾经说过:迁移学习将是继监督学习之后的下一个促使机器学习成功商业化的驱动力. 本文选自<深度学习500问:AI工程师面试宝典> ...

  5. 一种基于卷积神经网络的图像去雾研究-含matlab代码

    目录 一.绪论 二.去雾卷积网络 2.1 特征提取 2.2 多尺度映射 2.3 局部均值 2.4 非线性回归 三.实验与分析 四.Matlab代码获取 一.绪论 雾是一种常见的大气现象,空气中悬浮的水 ...

  6. 机械臂论文笔记(一)【基于卷积神经网络的二指机械手 抓取姿态生成研究 】

    基于卷积神经网络的二指机械手 抓取姿态生成研究 论文下载 摘要 第1章 绪论 1.1 抓取生成国内外研究现状 1.1.1已知物体抓取生成 1.1.2相似物体抓取生成 1.1.3 未知物体抓取生成 1. ...

  7. 毕业设计 - 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

    文章目录 1 前言 2 前言 3 数据集 3.1 良性样本 3.2 病变样本 4 开发环境 5 代码实现 5.1 实现流程 5.2 部分代码实现 5.2.1 导入库 5.2.2 图像加载 5.2.3 ...

  8. 基于卷积神经网络与迁移学习的油茶病害图像识别

    基于卷积神经网络与迁移学习的油茶病害图像识别 1.研究思路 利用深度卷积神经网络强大的特征学习和特征表达能力来自动学习油茶病害特征,并借助迁移学习方法将AlexNet模型在ImageNet图像数据集上 ...

  9. Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类)

    Python深度学习实例--基于卷积神经网络的小型数据处理(猫狗分类) 1.卷积神经网络 1.1卷积神经网络简介 1.2卷积运算 1.3 深度学习与小数据问题的相关性 2.下载数据 2.1下载原始数据 ...

  10. 基于卷积神经网络实现图片风格的迁移 1

    卷积神经网络详解 一.实验介绍 1.1 实验内容 Prisma 是最近很火的一款APP,它能够将一张普通的图像转换成各种艺术风格的图像.本课程基于卷积神经网络,使用Caffe框架,探讨图片风格迁移背后 ...

最新文章

  1. 不常见但很有用的chrome调试工具使用方法
  2. c语言把四位数1234变成4123,用4个1组成一个数-3,4四个数字可以组成数字不重复和自然数的 – 手机爱问...
  3. mysql5.7免安版配置_mysql5.7免安装版配置
  4. python——爬虫实现网页信息抓取
  5. IT网络通信大变革时代来临 2016中国极客大奖为您找到风向标
  6. 男生眼中“理想女友”工作排名,程序员排名第三,幼师倒数第一
  7. html5环形流程图,环状流程图怎么画好看?5分钟让你精通绘制技巧
  8. LINUX下载并编译javasqlite
  9. 四脚贴片晶振的引脚区分
  10. stata基于cox回归制作临床决策曲线
  11. shell基础知识及变量
  12. 阿里20周年升级价值观:新六脉神剑与它的变革时代
  13. MacBook Pro 上网很慢
  14. 11.22 点餐APP第一阶段总结
  15. 软件项目管理-第三章生存期模型
  16. allure报告中去掉allure.title中自动拼接的参数
  17. 年后找工作的你,如何写一封好的简历?
  18. 深入应用C++11:代码优化与工程级应用
  19. 关于SSL握手的错误解决
  20. python 隐含波动率_怎么计算隐含波动率?

热门文章

  1. vue-购物车小球抛物线
  2. ATP 系列无线测温集中采集触摸屏
  3. WARNING:tensorflow:`add_update` `inputs` kwarg has been deprecated.
  4. 青帮大佬杜月笙的另一面及其后代现状
  5. 告别脚本小子系列丨JAVA安全(6)——反序列化利用链(上)
  6. as,which引导的非限定性定语从句
  7. symmetric tree java_Symmetric Tree对称树
  8. 安卓11 Sdcard文件读取权限问题
  9. [Vijos]P1788 第k大
  10. 【刷题】BZOJ 2069 [POI2004]ZAW