没有合适的资源?快使用搜索试试~ 我知道了~
ASVtorch工具包:深度神经网络说话人验证
软件X 14(2021)100697原始软件出版物ASVtorch工具包:使用深度神经网络进行说话人验证Kong Aik Leea,Ville Vestmanb,Tomi Kinnunenb,aInstitute for Infoectious Research,ABUSINESSSTAR,Singaporeb芬兰东芬兰大学计算语音组ar t i cl e i nf o文章历史记录:收到2020年2021年4月7日收到修订版,2021年保留字:说话人识别PyTorch深度学习a b st ra ct人类的声音在个体之间有很大的不同。这有助于自动说话人验证(ASV)-从他/她的声音中识别一个人在过去的十年中,由于机器学习的最新进展,特别是深度学习方法,ASV的准确性大幅提高一个不幸的缺点是ASV系统的复杂性大大增加。为了帮助非专家启动可重复的ASV开发,需要实现各种ASV管道和功能的最先进的工具包。为此,我们引入了一个新的开源工具包ASVtorch,它使用广泛使用的PyTorch机器学习框架在Python中实现版权所有2021作者。由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本v0.3用于此代码版本的代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX-D-20-00038Code Ocean compute capsule不适用(缺少存储空间)法律代码许可证MIT许可证使用Git的代码版本控制系统使用的软件代码语言、工具和服务Python 3.7、PyTorch、PyKaldi、SciPy生态系统编译要求、操作环境依赖性需要安装Kaldi工具包、ffmpeg、基于Unix的操作系统如果可用,链接到开发人员文档/手册https://gitlab.com/ville.vestman/asvtorch/-/blob/v0.3/README.md问题支持电子邮件ville. gmail.com软件元数据当前软件版本表故意留空。信息与代码元数据表没有区别。指向此版本可合法软件许可证计算平台/操作系统安装要求依赖性如果可用,链接到用户问题支持电子邮件1. 动机和意义自动说话人验证(ASV)系统[1]将一对语音话语(注册和测试话语)与*通讯作者。电子邮件地址:lee_kong_aik@i2r.a-star.edu.sg(Kong Aik Lee)、vvestman@cs.uef.fi(Ville Vestman)、tkinnu@cs.uef.fi(Tomi Kinnunen)。https://doi.org/10.1016/j.softx.2021.100697判断两个人是否是同一个人。现代ASV系统涉及三个广泛的任务:(i)从语音的短段(帧)中提取特征;(ii)形成语音的短段(帧)。每个话语的固定维向量表示(说话者嵌入);以及(iii)比较登记和测试嵌入以评估说话者相似性的程度。为了帮助非专家开发ASV系统并使研究结果可重复,许多ASV捆绑软件2352-7110/©2021作者。 由Elsevier B.V.出版。这是一篇开放获取的文章,使用CC BY许可证(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softxKong Aik Lee、Ville Vestman和Tomi Kinnunen软件X 14(2021)1006972Fig. 1. 现代说话人识别系统的一个例子,包括特征提取前端、说话人嵌入和评分后端。[2][3 ][4 ][5 ][6][7][8][10][11][12][13][14][15][16][17][18][19][ 此外,最近已经发布了专注于使用深度神经网络进行说话者建模的多个实现[6我们介绍ASVtorch-一个最新的ASV工具包,它利用了PyTorch库中可用的GPU加速[10]。ASVtorch除了各种深度学习方法之外,还提供了基于经典i-vector [11]的说话人识别的最新实现[12,13]。我们为VoxCeleb [14,15]和Speakers in the Wild(SITW)[16]数据集提供训练和评估配方,这两个数据集都被ASV研究人员广泛使用。图图 1示出了现 代 AS V 系统中 的处理流水线。三个主要组件是特征提取器、说话人嵌入提取器和评分后端。下文简要介绍了这些组成部分我们请感兴趣的读者参考[17特征提取特征提取器的功能是产生输入语音信号的有意义的、紧凑的表示。信号首先被分割成20到30 ms的重叠帧。从每帧中提取相关特征,例如ASVtorch中的Mel频率倒谱系数(MFCC)[20]。说话人嵌入是可变长度话语的固定维度表示。同一说话人的话语在嵌入空间中彼此接近。这个想法类似于自然语言处理中的词嵌入[21,22流行的例子是x-vector [12]和i-vector [11]嵌入。得分后端。给定一对登记和测试语句嵌入φe和φt,计算相似性得分。它可能是一个简单的余弦相似性,或统计后端,如概率线性判别分析(PLDA)[23,24]。通过线性判别分析(LDA)[25],嵌入和长度归一化[26]进行降维预处理也很常见。ASVtorch实现了嵌入预处理和基于PLDA的评分。2. 软件构架ASVtorch由许多Python包组成(参见图1)。(2)在本节中详细说明。图3示出了不同部件如何彼此相互作用。前端前端包包含Kaldi shell脚本的Python包装器该包包含一个功能加载器,用于将功能加载到NumPy数组,图二、 ASVtorch工具包的Python包。以计算Δ特征并执行特征的倒谱均值和方差归一化。后端后端由嵌入处理器、PLDA和分数归一化组成。嵌入处理器可以用来对说话人嵌入进行中心化、归一化和长度归一化,这是通常的做法。网络该网络包包含所有与深度学习相关的功能,包括用于说话人嵌入提取的许多架构、DNN的训练循环以及许多自定义神经网络组件。它还包含两个数据加载器;一个用于在DNN训练期间加载短期特征,另一个用于加载全长段的特征以执行验证和嵌入提取。向量i-vector包实现了i-vector流水线。这包括GMM帧对齐的快速计算和i向量提取器的训练,两者都利用了[27]中详述的它还包含必要的功能,Kong Aik Lee、Ville Vestman和Tomi Kinnunen软件X 14(2021)1006973Baum–Welch statistics data loaders needed in frame alignmentcomputation, i-vector extraction and model设置不同实验的超参数在设置包管理的配置文件中定义。这允许方便的参数优化,而无需修改实验之间的代码。配置文件具有自定义格式,允许从其他实验继承设置。这最大限度地减少了在不同实验之间复制粘贴设置的需要Misc此包包含各种函数和类的工具包。这些实用程序中最值得注意的是指定输出文件夹的文件和文件夹结构的实用程序。话语这个软件包包含表示话语(录音)和话语列表的类。话语对象包含话语和说话者标识符以及指向磁盘的指针,以存储特征和帧对齐。此外,话语对象包含VAD标签,当话语对象被构造时,VAD标签被立即加载到RAM 这减少了稍后期间的磁盘使用,允许基于话语持续时间(在VAD之后)快速过滤数据集中的话语。评价评估包包含用于对试验列表进行评分和计算性能指标的函数 , 其 中 包 括 等 错 误 率 ( EER ) 和 最 小 检 测 成 本 函 数(minDCF)[17]。该软件包还包含一个绘制检测误差权衡(DET)曲线的类[17]。食谱/*recipes包的子包包含主要脚本和配置,用于运行针对特定评估的特定ASV系统。这些食谱在第4节中详细介绍。子包detplot包含如何使用评估包绘制DET曲线的示例3. 软件功能3.1. 数据加载器如图 3、不同的操作要求不同的声学特性的装载机。所有数据加载器的共同之处在于,它们在多个CPU内核上并行操作,而GPU同时使用加载的数据来执行主要计算工作。本小节描述每个数据加载器的功能。DNN训练的数据加载器在一个小批量内裁剪训练话语,以在将小批量馈送到网络之前执行相同的持续时间。虽然小批内的持续时间是固定的,但它在小批之间可能会有所不同一个epoch的训练迷你批处理创建如下:1. 对于每个训练说话人,通过随机选择片段的开始位置,选择U个话语并将其裁剪成固定持续时间的片段2. 使用裁剪的话语,创建M个话语的小批量由于随机抽样,没有两个时期使用完全相同的数据。为了加快嵌入提取与GPU,我们设计了单独的数据加载器,组织登记和测试utterances到minibatches。持续时间不变的要求通过将具有相似持续时间的话语裁剪成最短话语的长度而将它们分组到一个小批量中。基于I-vector的系统还利用两种不同类型的数据加载器。第一个加载声学特征向量在固定的帧计数批量用于计算帧对齐相对于UBM组件。第二个数据加载器加载声学特征和帧对齐,并将它们转换为用于i向量提取的Baum-Welch统计数据。3.2. DNN培训在ASVtorch 中,以多种方式监控定期报告训练和此外,ASVtorch报告了除裁剪训练片段外的全持续时间损失和准确性。这允许监控由持续时间变化引起的潜在问题上述度量通常不足以可靠地确定扬声器嵌入的质量,因为损失和准确性是从网络的输出层计算的,而嵌入是从前面的层之一提取的。因此,ASVtorch在每第N个时期之后运行具有PLDA后端的ASV系统的按比例缩小版本,以监测EER和minDCF度量方面的进展3.3. 用于DNN训练的在 ASVtorch 中 , DNN 的 参 数 使 用 小 批 量 随 机 梯 度 下 降(SGD)算法进行优化在SGD中,对网络参数的更新的幅度由学习速率参数控制在实践中,以高学习率开始训练并随着训练的进行而降低学习率这允许网络在开始时快速收敛,同时在训练的最后阶段为了减少手动调整学习率调度的需要,我们使用了基于训练损失的学习率调度器调度器的操作如下:如果两个连续时期之间的训练损失的当学习率连续两次减半时,训练停止。3.4. 神经说话人嵌入传统的x向量提取器是由三个功能块组成的DNN:帧处理器采用多层时延神经网络(TDNN)实现[28]。时间池化层,用于根据编码器产生的帧级特征向量计算聚合测量。输出层的话语分类,其中输入被分类为说话者类别。其中一个层被设计为瓶颈层,其输出(af-称为仿射投影,并且在非线性之前)是所谓的x向量说话者嵌入。通过优化多类交叉熵损失,训练神经网络对大量说话人进行分类。···Kong Aik Lee、Ville Vestman和Tomi Kinnunen软件X 14(2021)1006974拉瓜La=1∑at,(1)=中国阿瓜特中国拉瓜不中国LL不图3.第三章。ASVtorch 中i-vector和DNN嵌入系统的 计 算管 道 。作者不知道早期ASV研究中报告的这种分析。具体地说,我们感兴趣的是梯度的反向传播,不哪里t=1见图4。一个三层时延神经网络(TDNN)堆栈产生一个广泛的时间背景。第一层构成具有1 × 5滤波器和膨胀因子1的1-D卷积(即,无扩张)。第二层和第三层被实现为分别具有2和3的膨胀因子的1 × 3滤波器的1-D卷积。最后一层的有效时间上下文是7× 2+ 1= 15帧。3.5. 1D-CNN作为时延神经网络将音频特征馈送到DNN中的两种常见选择是(a)2-D频谱图,或(b)2-D特征图。在这两种选择中,一维卷积更常用于说话人识别。原因是这个概念类似于将特征向量序列作为时间序列处理的方式。再加上扩张,神经元at=g(Wft+bt)( 2)是在第t个时间步的变换特征向量。这里,W、b和ft是权重矩阵、偏置向量,并且是前馈层的输入,之后是非线性激活函数g。这可能是一个整流线性单元(ReLU),泄漏ReLU或其他一些激活函数。设TPL为时间池化输出处的梯度,层,其中表示用于优化网络的损失函数(通常是多类交叉熵损失)通过求平均操作将梯度向后扩展实质上将梯度分成T个相等部分,使得∂1∂阿 瓜特=T·a ,t=1 , 2 , ... 、 T.(三)由于使用相同的权重集合W来处理特征对于t1,2,. . .,T,则所有T个时间步长处的梯度被求和,如下所示T T网络可以使用相同数量的权重进行扩展的当移动到更深的网络中时,时间上下文变得更宽。更深层的单元是间接连接的L=∑t=1t=1(四)更广泛的输入区域,如图所示。 四、这种神经这种网络被称为时延神经网络(TDNN)[28]。广泛应用于ASVtorch。3.6. 时间池层说话人嵌入使用特征的时间池来形成固定大小的表示。这是通过跨所有时间步长的变换特征的等权重平均(或池化)来实现的。一个基本的问题是确保梯度通过时间池化层正确地反向传播从(3)和(4)中,我们可以看到梯度反向的净效应通过时间池化层传播的是将梯度涂抹到帧,然后求和以更新权重矩阵和偏置向量。从(4)中还可以清楚地看出,加权平均可以用于更多地关注被认为对说话人识别任务更重要的我们建议感兴趣的读者参考[29,30]以了解更多细节。4. 说明性实例如图2、ASVtorch带有两个现成的管道(或配方)来开发广泛采用的ASV系统。Kong Aik Lee、Ville Vestman和Tomi Kinnunen软件X 14(2021)1006975图五. 在VoxCeleb-E(清洁)[ 31 ]和SITW核心-核心试验列表上评估的x向量、神经i向量和i向量系统的检测误差权衡曲线。[14]第15话:“在一个人的世界里,两种评估配方都包含i向量、x向量和神经i向量变体。最后一个是在[13]中引入的,以结合判别嵌入和生成嵌入的思想。用于VoxCeleb评价的VoxCeleb1和VoxCeleb2数据集由[14]和[15]的作者从YouTube收集。VoxCeleb1由来自1251个说话者的超过15万个话语组成,VoxCeleb2由来自6112个说话者的超过110万个话语组成。平均话语持续时间约为8秒。在VoxCeleb库中,我们使用VoxCeleb2数据集训练ASV系统,而VoxCeleb1用于测试。为了训练,源自同一YouTube视频的话语被连接在一起。测试使用[14]和[15]中介绍的三个试验列表VoxCeleb 1-O-原始VoxCeleb 1试验列表由来自40位演讲者的37720次试验组成。VoxCeleb 1-E-一个试验列表,包括来自1251个VoxCeleb 1扬声器的581480个试验。VoxCeleb 1-H-VoxCeleb 1-E试验列表的更硬版本,包括552536个相同性别和相同国籍的试验。此外,还显示了[31]中介绍的上述列表的清理版本的结果。SITW的管道与VoxCeleb食谱非常相似。不同的是,SITW食谱使用VoxCeleb1和VoxCeleb2进行训练。计算两个试验列表的结果:SITW核心-核心-试验列表,包括721 788项试验。每句话只包含一个说话者的讲话SITW核心-多- A试验列表,包含2 010 683项试验。测试声音包含来自一个或多个说话者的语音由于配方仍在持续开发中,我们不会报告配方的确切结果,因为预期其会随时间而改变。目前的结果可以从ASVtorch的代码库图图5显示了撰写本文时不同ASV系统在不同评估下的DET图。使用ASVtorch工具包中的功能绘制DET图。5. 影响在过去的几十年中,最先进的ASV系统的复杂性不断增加。这种增加的复杂性涉及到制作这种系统所需的专业知识水平、开发(和评估)系统所需的语音数据的数量和种类以及模型参数的数量制作可用的ASV系统曾经是音频处理专家的特殊活动。这通常涉及跨编程语言或计算机环境组合和接口不同的脚本和工具;以及“艺术”的一部分(如在“最先进的技术”中)是关于意识到隐藏的实现细节(在发布中并不总是透明的),以及花费大量的时间来设计和清理文件列表。ASV-torch提供了旨在降低非专家(特别是来自其他学科和行业的非专家)快速启动构建ASV系统的障碍的功能和方法。虽然深度学习花了相对较长的时间才在ASV中超越经典建模方法,但深度说话人嵌入现在被认为是最先进的,并且正在受到许多研究小组的积极研究。在提供最先进的组件的同时,ASVtorch还实现了经典方法的加速变体,如i-vector。这使得新的和现有的算法在同一平台上进行系统的比较,并与我们的目标,以促进可重复的研究是一致的。在示例中,我们展示了如何使用ASVtorch来训练、测试和评估说话人验证系统。用户可以按原样使用该工具包,在当前功能的基础上进行修改,甚至可以构建商业ASV系统。6. 结论我们介绍了ASVtorch的自动说话人验证(ASV)工具包,这些功能已经过精心制作、微调,并在大规模ASV任务中进行了测试。构建一个完整的ASV管道始终是一项重大任务,因为它涉及大量的领域知识。我们的目标是使ASVtorch工具包可供广大受众使用,特别是来自其他领域和行业的受众,并鼓励可重复的ASV研究。在提供完整的ASV管道的同时,该工具包可以按照类似于库的设计独立使用。它允许一种灵活,强大的方式来尝试不同的ASV方法。此外,我们相信工具包中提供的各种功能适用于其他音频,语音和时间序列处理任务,尽管其有效性还有待测试。竞合利益作者声明,他们没有已知的竞争性财务利益或个人关系,可能会影响本文报告的工作致谢这项工作得到了芬兰科学院(项目#309629 )和东芬兰大学(UEF)科学、技术和计算博士项目(SCITECO)的部分支持。UEF的作者还得到了NVIDIA公司的支持,捐赠了Titan V GPU。引用[1]Reynolds DA,Quatieri TF,Dunn RB.使用自适应高斯混合模型的说话人确认。数字信号处理2000;10(1):19-41. 网址://dx.doi.org/10.1006/dspr.1999.0361,URL:http://www.sciencedirect.com/science/article/pii/S1051200499903615.[2]放大图片作者:J. ALIZE,一个免费的说话人识别工具包。In:Proceedings.(ICASSP'05)。2005年IEEE声学、语音与信号处理国 际 会 议 。1,IEEE;2005,p.I-737.[3]Povey D , Ghoshal A, Boulianne G, Burget L , Glembek O , Goel N ,Hanne-mann M,Motlicek P,Qian Y,Schwarz P,et al. The kaldi speechrecognitiontoolkit. IEEE 2011 年 自动 语 音识 别 和理 解 研讨 会。 IEEE SignalProcessing Society; 2011.·····Kong Aik Lee、Ville Vestman和Tomi Kinnunen软件X 14(2021)1006976[4] Anjos A,El-Shaanal L,Wallace R,Günther M,McCool C,Marcel S.鲍勃:为研究人员提供的免费信号处理和机器学习工具箱。 2012年,第20届ACM国际多媒体会议论文集。p. 1449-52.[5] 李嘉诚,李嘉诚. python中的一个可扩展的说话人识别工具包。2016年IEEE声学、语音和信号处理国际会议(ICASSP)IEEE; 2016,p.5095-9[6] Zeinali H,Burget L,Rohdin J,Stafylakis T,Ceramiky JH.如何在通用工具包中改进扬声器嵌入提取器。在:IEEE国际会议上的声学,语音和信号处理( ICASSP ) 。 IEEE; 2019 , 第 6141-5 页 https://github.com/hsn-zeinali/x-vector-kaldi-tf[7] Liu Y , He L , Liu J. 用 于 说 话 人 确 认 的 大 幅 度 softmax损 失 。In : Proc.INTERSPEECH. 2019年,网址:https://github.com/mycrazycracy/tf-kaldi-扬声器。[8] ASV子工具2020. https://github.com/Snowdar/asv-subtools网站。[9] Chung JS,Huh J,Mun S,Lee M,Heo HS,Choe S,Ham C,Jung S,Lee B-J , Han I.为 说 话 人 识 别的 度 量 学 习 辩 护 。2020 年 ,arXiv 预 印 本arXiv:2003.11982。https://github.com/clovaai/voxceleb_trainer.[10]Paszke A,Gross S,Massa F,Lerer A,Bradbury J,Chanan G,KilleenT,Lin Z,Gimelshein N,Antiga L,et al. Pytorch:An imperativestyle,high-performance deep learning library.在:神经信息处理系统的进展;2019。p. 8024-35[11]Dehak N,Kenny PJ,Dehak R,Dumouchel P,Ouellet P.用于说话人验证的前端因素分析。IEEE Trans Audio,Speech Lang Process2010。[12]Snyder D,Garcia-Romero D,Sell G,Povey D,Khudanpur S. X-vectors:用于说话人识别的鲁棒DNN嵌入。In:Proc. ICASSP; 2018.p. 5329-33[13]作者:J. J. 神经i向量 在:Proc. Odyssey 2020扬声器和语言识别研讨会。2020年,p.六十七-74.http://dx.doi.org/10.21437/Odyssey.2020-10,URL:http://dx.doi.org/10。21437/Odyssey.2020-10.[14]作者:A. Voxceleb:一个大规模的说话人识别数据集。In:Proc. Interspeech;2017. p. 2616-20[15]Chung JS,Nagrani A,Zisserman A. Voxceleb2:深度说话人识别。In:Proc.Interspeech2018.2018年,第1086-90页。http://dx.doi.org/10.21437/Interspeech.2018-1929,URL:http://dx.doi.org/10.21437/Interspeech.2018-1929。[16]McLaren M,Ferrer L,Castan D,Lawson A.在野生扬声器(SITW)说话人识别数据库。In:Proc. Interspeech; 2016,p. 818-22[17]作者:Jiang H.文本无关说话人识别综述:从特征到超向量。Speech Commun2010;52(1):12[18]放大图片作者:Hansen JHL,Hasan T.机器和人类的说话人识别:教程回顾。IEEE Signal Process Mag 2015;32(6):74[19]放大图片作者:Lee KA,Sadjadi O,Li H,Reynolds D. 20年来,说话人识别评估-我们还在那里吗?计算机语言Lang2020;61:101058.[20] Davis S,Mermelstein P. Comparison of parametric representations formonosyllantic word recognition in continuously spoken sentences. IEEEtransacoust语音信号处理1980;28(4):357-66.http://dx.doi.org/10.1109/TASSP.1980.1163420。[21]Mikolov T,Sutskever I,Chen K,Corrado GS,Dean J.单词和短语的分布表示及其组合性。在:神经信息处理系统的进展。2013年,第3111-9[22]Bengio Y,Ducharme R,Vincent P.神经概率语言模型。在:神经信息处理系统的进展。1999年,p.932-8[23]约菲·S概率线性判别分析2006年,第九届欧洲计算机视觉会议[24]SJD王子,JH长老概率线性判别分析在恒等式推理中的应用。在:IEEE第11届计算机视觉国际会议,ICCV 2007,巴西里约热内卢,2007年10月 14日至20日p. 1-8号。[25]主教CM。模式识别与机器学习(信息科学与统计学)Berlin,Heidelberg:Springer-Verlag.[26]Garcia-Romero D,Espy-Wilson CY.向量长度归一化分析扬声器识别系统. 于:Proc.Interspeech; 2011.[27]李嘉诚,李伟杰,李伟杰,李伟杰. gpu加速释放i-vectors未被利用的潜力。In:Proc.Interspeech2019.2019年,第351-5页。http://dx.doi.org/10.21437/Interspeech.2019-1955,URL:http://dx.doi.org/10.21437/Interspeech.2019-1955.[28]Peddinti V,Povey D,Khudanpur S.一个时间延迟神经网络架构,用于长时间上下文的有效建模。In:Proc. Interspeech; 2015. p. 3214-8[29]放大图片作者:Koshinaka T,Shinoda K.用于深度说话人嵌入的注意统计池。输入:程序Interspeech; 2018.p. 2252-6[30]Zhu Y , Ko T , Snyder D , Mak B , Povey D. Self-Attentive SpeakerEmbeddingsforText-IndependentSpeakerVerification.In : Proc.Interspeech; 2018.第3573-7页。[31]谢W,纳格拉尼A,钟JS,齐瑟曼A.用于野外说话人识别的话语级聚合。ICASSP 2019-2019 IEEE 声 学 , 语 音 和 信 号 处 理 国 际 会 议 ( ICASSP ) 。IEEE;2019,p. 5791-5
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- OptiX传输试题与SDH基础知识
- C++Builder函数详解与应用
- Linux shell (bash) 文件与字符串比较运算符详解
- Adam Gawne-Cain解读英文版WKT格式与常见投影标准
- dos命令详解:基础操作与网络测试必备
- Windows 蓝屏代码解析与处理指南
- PSoC CY8C24533在电动自行车控制器设计中的应用
- PHP整合FCKeditor网页编辑器教程
- Java Swing计算器源码示例:初学者入门教程
- Eclipse平台上的可视化开发:使用VEP与SWT
- 软件工程CASE工具实践指南
- AIX LVM详解:网络存储架构与管理
- 递归算法解析:文件系统、XML与树图
- 使用Struts2与MySQL构建Web登录验证教程
- PHP5 CLI模式:用PHP编写Shell脚本教程
- MyBatis与Spring完美整合:1.0.0-RC3详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功