分享

语音识别实际问题:(八)小语种语音识别

 520jefferson 2020-08-14

世界上存在近7000种语言 [1],其中绝大部分是小语种,使用人数超过1亿人的也就10余种(见图 8.1)。在我国,汉语的使用人口最多,占总人口的90%以上,余下的70多种语言绝大部分是小语种,使用人数少,语音和语言资源有限。一般认为小语种是除联合国六种通用语言(汉语,英语,法语,俄语,西班牙语和阿拉伯语)以外的所有语言。本章将讨论小语种识别的若干关键技术。

值得说明的是,小语种和方言有所不同。小语种本质上是一门独立的语言,有独立且完备的发音体系、书写方式及语法现象。对于方言(Dialect)的界定则不像小语种那么清晰,一般认为是因地理差异形成的较大规模的语言变体,包括发音和用词等方面的改变。比方言再低一个层次的语言变化称为口音(Accent)。口音只包含发音上的改变,这种改变既可能是因为地域原因,也可能来源于外语习得时遗留的母语影响。我们所讨论的小语种识别技术同样可用于改进对方言和口音的识别。

目前,小语种识别受到越来越多关注。著名的Babel项目给自己设定的目标即是“在一周内就为一种新语言构造一个语音识别系统”。该项目于2011年启动,参与单位包括CMU、UC Berkeley ICSI实验室、IBM Watson研究中心、BBN公司等著名机构。Babel项目不仅取得了丰硕的科研成果,同时对研究者开放了超过20种语言的数据包,有力促进了小语种研究。M2ASR项目是由国家基金委支持的重点研究项目,目的是研究面向少数民族语言的多语种识别方法,特别是对数据稀缺的少数民族语言的识别方法。该项目于2017年启动,参与单位包括清华大学、西北民族大学和新疆大学。目前,该项目已经输出大量研究成果,向学术界公开了维、哈、藏、蒙等少数民族语音数据资源超过800小时(http://m2asr.)
图 8.1: 世界语言分布图。图片来自https://www./statistics。

8.1  小语种语音识别面临的主要困难

  • 资源普遍稀缺。几乎所有小语种都存在资源稀缺问题。资源稀缺性表现在语音数据、文本数据、音素集、发音词典等各个方面。即使是资源相对丰富的几个语言(如维吾尔语),数据资源的总量也很小,而且分散在各个研究机构,缺少统一的标准和规范,且很少公开.

  • 语言的复杂性和各异性较强。资源的稀缺使得为每种语言单独建模几乎不可能,因而只能借助语言之间的共性,通过共享建模来提高性能。然而,人类语言极为复杂,不同语言在语音和语法层次有很大差异。这种复杂性和各异性使得不同语言共享建模变得困难。

  • 多语言融合为识别系统带来挑战。不同语言的互相融合,特别是英语和汉语等主流语言对其它语言的渗透是大势所趋。然而,语言融合会显著降低小语种识别的性能。其一,外来语带来的新词增大了音素空间和词表空间,增加了解码时的混淆度;其二,加入外来语需要对词表和语言模型等进行动态更新,给当前的静态解码方法带来挑战;第三,外来语在语言模型中一般不具有足够的代表性,如何将这些新词有效加入到识别系统中并不容易。

  • 多元化带来建模上的困难。很多小语种在发音和书写上都相对多元化,如地方口音的差异,口语用法与书面语用法的差异,不同教育水平的人群对主流语言的接受差异,不同年龄人群对网络语、社会媒体用语等新词汇的接受差异。更有的语言基本没有标准化的发音和语法,使用语言随人群不同具有很强的随意性。这些多元化与随意性给语音识别系统带来极大挑战,特别是在数据资源稀缺的大前提下,这一挑战显得尤为严峻。

基于上述困难,小语种语音识别的基本思路是分拆与复用。所谓分拆,是将语音信号中的信息分解为共性和特性两部分并分别处理。所谓复用,是指对分拆出的共性部分通过“共享”或“借用”的方式实现更好的建模。这里的共享方式是指收集多种语言的共性资源训练出大家可用的公共模型;借用方式是指利用主流语言的丰富资源学习出基础模型,再基于该基础模型训练小语种模型。一般认为,语言的差异主要体现在词法和语法的不同,在发音上的差异相对较小。因此,我们通常将语音信息拆分成声学层和语言层两部分,对声学层信息进行多语言共享或借用学习,对语言层信息单独建模。
8.2  基于音素共享的小语种语音识别
传统基于GMM-HMM的语音识别系统多采用音素共享和映射的方法实现小语种识别。音素共享最早被用于解决多语种混合解码问题。例如,Cohen等 [2] 应用这一方法将英语与法语的音素进行合并(见图 8.2),从而实现英语和法语两种语言的混合识别。

Schultz等人 [3, 4]基于国际音标(International Phonetic Alphabet, IPA)将不同语言统一到一个通用音素集上,并基于该音素集构造多语言GMM-HMM模型,训练时利用多语言数据进行联合训练,如图 8.3所示。在Global Phone数据库上的实验结果表明,音素共享和多语言数据训练可以为小语种提供更好的初始模型,经过少量数据做自适应训练后,可取得比单独训练更好的识别性能。Lin等人 [5] 的工作同样基于共享音素的多语言建模,只不过实验基于通用音素集(Universal Phone Set, UPS)。UPS和IPA基本上是对应的,不同之处是UPS包含了一些组合音,如鼻化元音等。

另一种音素共享方法基于数据驱动。假设有语言A和B,首先为这两种语言单独建立语音识别器,之后对这些语言的所有或部分数据利用A和B两个语言的识别器分别解码,得到基于两种语言的识别结果。基于这些识别结果,可以统计这些语言之间的音素混淆矩阵,从而得到这些语言之间的映射。这里的混淆矩阵是指一种语言中的某个音素被映射为另一种语言中的某个音素的概率。所有这些概率将组成一个N ×M的矩阵T,其中M和N分别是两种语言的音素集大小,,即语言A中的第i个音素映射到语言 B中的第j个音素的概率。在实际建模时,通常对两种语言的识别结果做帧级别的强制对齐,再统计不同语言各个音素之间的对应帧数,即可统计出混淆矩阵中对应的概率。Sim等[6]基于这一思路实现了一个用俄语模型来识别捷克语的跨语言识别系统,首先基于数据驱动建立俄语到捷克语的音素映射,然后利用俄语模型对捷克语进行识别,最后再把得到的俄语音素串转换成捷克语音素串。

Schultz [3]等人对比研究了基于IPA的音素映射方法和基于数据驱动的音素映射方法。他们首先基于IPA对七种语言建立一个多语言识别系统,之后基于IPA或数据驱动建立一个七种语言音素集到瑞典语音素集的映射,最后基于该映射对瑞典语进行识别。这一识别可以直接利用七种语言的识别系统,并将识别结果依音素映射表转换为瑞典语输出;也可以用七种语言的模型做初始化,并用少量瑞典语数据做自适应训练。图 8.4给出了基于IPA和数据驱动得到的映射表,表中每一行为一个瑞典音素。在数据驱动方式中,选择混淆度最大的七种语言音素作为映射结果。

图 8.2: 基于知识的英语-法语音素共享与映射。图片来自 [2]。

图 8.3: 国际音标(International Phonetic Alphabet, IPA)对应表 2018修订版 。

8.4:基于[3]

音素共享也可以用于DNN识别系统中。例如,Das等人 [7]基于IPA建立了英语和土耳其语联合音素集,基于这一音素集,可以训练多语言GMM-HMM和多语言DNN-HMM 系统。不论哪种模型,音素共享方法都可以显著提高小语种(土尔其语)的识别性能。

8.2.1       基于特征共享的小语种识别

人类语言在语音层具有共性,因此可以利用多语言或主流语言的数据资源训练语音特征提取器,直接用于小语种数据做特征提取并构造声学模型。这一特征共享方案既可用于GMM-HMM系统,也可用于DNN-HMM系统。

常用的可共享特征包括瓶颈(Bottle Neck, BN)特征[8, 9]和后验概率特征[10, 11]。如图 8.5所示,首先构造一个MLP/DNN音素分类器,该分类器的中间层输出具有显著的发音区分性。一般中间层比其它层具有较少的节点数,因此称为瓶颈层,相应的输出称为瓶颈特征。同时,该分类器的输出为输入语音帧对应的音素后验概率,同样具有明显的发音区分性,称为后验概率特征。

Tuske等人 [12]用多语言数据训练一个多语言DNN模型(图 8.6),通过提取瓶颈特征用于小语种语音识别。该特征在GMM-HMM和DNN-HMM系统中都取得了较好较果。类似的方法也用在Thomas [13]和 Knill [14]等人的工作中。

Stolcke等人 [15]研究了基于后验概率特征的跨语言识别。他们发现一个用英语训练的音素区分网络得到的后验概率特征可以直接用于汉语和阿拉伯语等语音识别任务中。Toth等人 [16]的工作也发现,基于英语训练的MLP可直接对匈牙利语数据提取后验概率特征并用于声学模型建模。

图 8.5: 瓶颈特征和后验概率特征。

图 8.6: 用于BN特征提取的多语言DNN模型。

8.3    基于参数共享的小语种识别

在基于DNN的语音识别系统中,DNN用来逐层学习语音信号中的区分性信息并最终输出在音素(或senones)上的后验概率。基于人类语音的共性,可以想象该DNN模型在前几层都在学习和语言无关的特征,只有在最后几层,语言信息才开始变得明确。因此,我们可以通过共享DNN的前几层参数来克服小语种建模的数据稀缺问题。和特征共享方式不同,参数共享主要用于DNN-HMM系统中的DNN模型训练。这一共享通常有两种方式:多任务学习和迁移学习。

多任务学习(Multi-task Learning)是指通过共享同一个网络或网络的一部分对多个任务进行同时学习。基于这一学习方式,参与共享的网络在参数更新时可利用多个任务的误差信息,从而实现不同任务之间的信息共享。应用到小语种识别上,可以将包括小语种在内的多个语言作为不同任务,这些任务共享DNN特征提取层,输出层则互相独立[17, 18,19]。图 8.7给出了一个多语言共享的DNN模型结构。

图 8.7: 基于多任务学习的深度神经网络。图片来自 [17]。

Chen 等人 [20]将多任务学习方法应用到小语种识别中。他们采用的模型如图 8.8 所示。该模型除了将多个小语种识别作为独立任务外,还引入了一个通用音素识别任务,即将所有语言的音素集统一为一个通用音素集,在训练时不仅计算在特定语言音素集上的误差,而且计算在通用音素集上的误差。作者利用南非的3个小语种数据进行研究,每种语言数据量为3-8小时。实验证明,多任务学习可有效提高小语种的识别性能。

图 8.8: 基于多任务学习的深度神经网络,其中每个语言上的识别作为一个独立任务,外加一个在通用音素集上的识别任务。图片来自 [20]。

迁移学习 (Transfer learning) [21]是另一种常用的小语种建模方法。该方法首先利用多语言数据或主流语言数据建立一个DNN模型,基于该模型对小语种模型进行初始化,再利用少量小语种数据进行针对性训练。如图 8.9所示,我们有大量汉语数据,但日语数据稀缺。迁移学习首先训练一个汉语DNN模型,再基于该模型初始化日语DNN模型。由于汉语和日语音素集不同,我们仅能迁移底层的部分网络(图中为第一层),其余网络参数需要随机初始化。日语DNN初始化完成后,可利用少量日语数据做进一步训练。

图 8.9: 基于迁移学习的小语种建模。首先利用汉语数据训练一个DNN模型,取其第一层参数复制到日语DNN模型中,再利用少量日语数据做针对性训练。

8.3.1       基于半监督学习的小语种识别方法

小语种识别的主要困难在于语音数据的稀缺。在很多时候,稀缺的并不是语音数据本身,而是语音的文本标注。如果可以利用大量未标注数据,则小语种识别的困难有望得到很大缓解。基于这一思想,Shi等人 [22]提出一种称为MaR(Map and Relabel)的半监督学习方法。该方法分为Map和Relable两个步骤。在Map步中,作者首先利用汉语训练一个大规模DNN,其输出为Senone(对应共享的tri-phone)。基于迁移学习的思路,将该汉语DNN去掉最后一个线性层后作为维语DNN的特征提取网络,并加入一个随机初始化的线性层,用来预测维语的音素(图 8.10)。因为音素量要远小于Senone,这一随机初始化的线性层可通过少量标注数据进行学习。学习完毕后,即得到一个维语DNN。在Relabel步,基于该维语DNN 对未标注的维语数据进行识别,得到这些数据的伪标注。这些伪标注的数据可以用来对维语进行DNN建模。实验结果表明,基于该方法,利用10个小时的数据即可获得传统方法用100小时数据得到的识别率。

图 8.10: MaR方法中的Map步。左图为一个基于Senone的汉语音DNN,右图为基于音素的维语DNN。维语DNN的特征提取层由汉语DNN复制得到。

8.4    其它小语种识别方法
8.4.1       Grapheme 建模

很多小语种的语音学和语言学研究还不充分,缺少完整的发音词典。对这些语言可以基于Grapheme建模。所谓Grapheme,是指组成单词的字母。这些字母有可能对应多个发音(如英语里的k,在katskip里发音不同),或字母组合对应一个发音(如英语里的thph)。基于Grapheme的语音识别系统可以省去构造发音词典的麻烦 [23]。Le等人[24]以越南语为例研究了基于Graphame在小语种上的建模问题,Chen 等人 [20]将Grapheme作为辅助任务来训练多任务DNN,提高了小语种识别性能。

8.4.2       网络结构与训练方法

因为数据量小,小语种建模容易产生过训练问题。Miao等人 [25]发现在DNN训练中引入Dropout操作可有效防止DNN的过训练。同时,利用Maxout激活函数可进一步提高小语种建模的性能。作者认为这是因为Maxout激活函数可以学习到语音信号中的稀疏特征,从而提高对噪音等干扰因素的抵抗力。图 8.11给出了Droput操作和Maxout激活函数对DNN识别性能的影响。

图 8.11: 基于Dropout和MaxOut激活函数的小语种语音识别。左图为低资源建模,右图为较大数据建模。可以看到,在低资源建模情况下, Dropout和Maxout激活函数对DNN模型有更大帮助。图片来自 [25]。

8.4.2       网络结构与训练方法

数据增强 (Data Augmentation)是一种增加DNN模型鲁棒性的常见做法 [26, 27, 28]。所谓数据增强,是指人为往训练数据中混入各种噪声和干扰,以提高数据的覆盖度。对小语种识别,基本训练数据量很小,这时语音增强就显得非常重要。例如,Ragni等人 [29]基于Babel数据研究了语音增强在阿萨姆和祖鲁语上的效果,发现基于声道长度变换的语音增强可提高小语种语音识别的性能。

8.5    小语种语音识别实践

8.5.1       音频数据采集

在前文中,我们已经提到了小语种语音识别面临的首要问题是数据资源稀缺性,这主要是因为小语种的适用人群与流通范围相对较小,且很多小语种分布的地区信息化尚不完备,导致对语音数据的收集和整理成本偏高,且质量难以控制。因此,在有限的条件下收集最有价值的语音数据就显得至关重要。什么样的数据是有价值的数据呢?首先要保证音素的覆盖度,包括单个音素和上下文相关音素的覆盖度。满足了发音覆盖度,还需要考虑说话人的覆盖度,包括性别、年龄、口音等。除此之外,还需要增加信道、噪声,混响,音量、语速等发音特性上的覆盖度。这些特性虽然可以用数据增强方法模拟,但真实场景
下的数据对提高识别率更有价值。

8.5.2       文本数据采集

相对于语音数据,文本数据的采集比较容易,一般用网络爬虫即可不间断地获取。文本数据主要用于构建语言模型,因此需要考虑的主要是对领域的匹配度。例如,如果我们的任务是识别口语对话,那么收集论坛的评论就比收集新闻网页有价值的多。文本的领域匹配度可以用候选文本在一个领域相关语言模型上的混淆度(Perplexity, PPL )来衡量,PPL越低,说明该文本与目标领域的匹配度越高。例如,可以选取一些和领域相关的文本作为种子训练一个n-gram模型,在数据采集时计算每句话在该模型上的PPL并保留PPL相对较低的句子。SRILM工具包 [30]提供了计算PPL的接口,可直接调用。

8.5.3       文本正规化

处理小语种的语音标注或语言模型文本时,一般会将其转换成拉丁字母形式,以方便计算机处理和非母语研究者进行检查。一些小语种的拼写方式很不规范,需要在处理时特别注意。以维语为例,该语言的拼写和发音是一一对应的,而不同地区对同一个单词的发音可能很不相同,直接导致拼写上的各异性。这种拼写上的各异性给语言模型建模带来很大困难,需要在建模前将各异化的拼写归一到标准拼写。

对非母语研究来说,在对某种小语种建模之前可以多了解一下该语言的特性,以选择最合理的建模方法。这些特性包括:该语种是否存在元音和谐律,元音和谐律是否会为文本处理带来歧义,如何处理外来词,如何处理网络用语,如何进行字词分割(例如,大部分阿拉伯文以空格分割,而藏语则有特定的分隔符)等等。这些经验可以让研究者少走弯路。

8.5.4       发音词典设计
 

合理的发音词典可降低声学模型和语言模型的建模难度。对小语种语音识别来说,设计发音词典最重要的是选择合理的发音单元和语言模型单元,而这一选择与语言本身的特性直接相关。以汉语为例,发音单元一般可选音素或声韵母,语言模型单元一般选词。对维语而言,因为发音与拼写对应,发音单元选择Grapheme 即可。同时,因为维语是粘着语,以词干为基础,可以加入若干后缀形成新词。这意味着维语的词汇量极大,且新词产生率较高。这时以词为单位建立语言模型就不合适,一般可选择词素(Morpheme)为建模单元 [31]。

8.6    小结

本章主要讨论了小语种语音识别的建模方法。不论是传统方法还是基于深度学习的方法,共享是提高小语种识别性能的基本思想。这一共享可以在音素、特征和模型参数三个层次体现。音素共享目的是在不同语言的发音单元间建立映射关系,从而可以用其它语言的语音数据对目标语言的音素进行训练。这一方法简单有效,但这种离散单元之间的映射忽略了不同语言在发音上的细节差异,常会带来性能损失。特征共享和参数共享本质上都是复用基于神经网络的特征提取单元,而这一复用的基本假设是不同语言在发音上的相似性。得益于DNN对复杂场景的特征学习能力,这两种共享方案在当前大数据学习时代取得了很大成功,显著提高了小语种语音识别的性能。除了基础的共享方法外,我们还讨论了小语种建模中的若干技巧,包括对未标注数据的利用、模型结构选择与训练方法、数据采集方案、词典设计方案等。

总体来说,近年来小语种语音识别取得了长足进展,特别是基于DNN的特征共享和参数共享方法极大提高了小语种的声学建模能力。目前制约小语种识别性能进一步提高的主因可能是发音词典、语言模型这些和语言本身特性相关的部分。另外,外来语、地域口音等语言现象在小语种里表现得更为普遍,需要设计合理的模型方法进行针对性处理。 

References

[1]Victoria Fromkin, Robert Rodman, and Nina Hyams. An introduction to language. 2018.

[2]P Cohen et al. “Towards a universal speech recognizer for multiple languages”. In: IEEE 1997 Workshop on Automatic Speech Recognition and Understanding Proceedings. 1997, pages 591–598.

[3]Tanja Schultz and Alex Waibel. “Experiments on cross-language acoustic modeling”. In:Seventh European Conference on Speech Communication and Technology. 2001.

[4]Tanja Schultz and Alex Waibel. “Polyphone decision tree specialization for language adap- tation”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2000, pages 1707–1710.

[5]Hui Lin et al. “A study on multilingual acoustic modeling for large vocabulary ASR”.   In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2009, pages 4333–4336.

[6]Khe Chai Sim and Haizhou Li. “Robust phone set mapping using decision tree clustering for cross-lingual phone recognition”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2008, pages 4309–4312.

[7]Amit Das and Mark Hasegawa-Johnson. “Cross-lingual transfer learning during supervised training in low resource scenarios”. In: Sixteenth Annual Conference of the International Speech Communication Association. 2015.

[8]Dong Yu and Michael L Seltzer. “Improved bottleneck features using pretrained deep neu- ral networks”. In: Twelfth annual conference of the international speech communication association. 2011.

[9]Karel Vesel et al. “The language-independent bottleneck features”. In: IEEE 2012 Spoken Language Technology Workshop. 2012, pages 336–341.

[10]Andreas Stolcke et al. “Cross-domain and cross-language portability of acoustic features es- timated by multilayer perceptrons”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2006, pages I–I.

[11]Mireia Diez et al. “On the use of phone log-likelihood ratios as features in spoken language recognition”. In: IEEE 2012 Spoken Language Technology Workshop. 2012, pages 274–279.

[12]Zoltán Tüske et al. “Investigation on cross-and multilingual MLP features under matched and mismatched acoustical conditions”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2013, pages 7349–7353.

[13]Samuel Thomas et al. “Deep neural network features and semi-supervised training for low resource speech recognition”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2013, pages 6704–6708.

[14]Katherine Knill et al. “Language independent and unsupervised acoustic models for speech recognition and keyword spotting”. In: (2014).

[15]Andreas Stolcke et al. “Cross-domain and cross-language portability of acoustic features es- timated by multilayer perceptrons”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2006, pages I–I.

[16]László Tóth et al. “Cross-lingual Portability of MLP-Based Tandem Features–A Case Study for English and Hungarian”. In: (2008).

[17]Jui-Ting Huang et al. “Cross-language knowledge transfer using multilingual deep neural network with shared hidden layers”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2013, pages 7304–7308.

[18]Georg Heigold et al. “Multilingual acoustic models using distributed deep neural networks”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2013, pages 8619–8623.

[19]Arnab Ghoshal, Pawel Swietojanski, and Steve Renals. “Multilingual training of deep neu- ral networks”. In: IEEE International Conference on Acoustics, Speech and Signal Process- ing. 2013, pages 7319–7323.

[20]Dongpeng Chen and Brian Kan-Wing Mak. “Multitask learning of deep neural networks for low-resource speech recognition”. In: IEEE Transactions on Audio, Speech, and Language Processing (2015), pages 1172–1183.

[21]Dong Wang and Thomas Fang Zheng. “Transfer learning for speech and language process- ing”. In: Asia-Pacific Signal and Information Processing Association Annual Summit and Conference. 2015, pages 1225–1237.

[22]Ying Shi et al. “Map and Relabel: Towards Almost-Zero Resource Speech Recognition”. In: Asia-Pacific Signal and Information Processing Association Annual Summit and Conference. 2018, pages 591–595.

[23]Mirjam Killer, Sebastian Stuker, and Tanja Schultz. “Grapheme based speech recognition”. In: Eighth European Conference on Speech Communication and Technology. 2003.

[24]Viet-Bac Le and Laurent Besacier. “Automatic speech recognition for under-resourced lan- guages: application to Vietnamese language”. In: IEEE Transactions on Audio, Speech, and Language Processing (2009), pages 1471–1482.

[25]Yajie Miao, Florian Metze, and Shourabh Rawat. “Deep maxout networks for low-resource speech recognition”. In: IEEE 2013 Workshop on Automatic Speech Recognition and Under- standing. 2013, pages 398–403.

[26]Shi Yin et al. “Noisy training for deep neural networks in speech recognition”. In: EURASIP Journal on Audio, Speech, and Music Processing (2015), pages 1–14.

[27]Tom Ko et al. “Audio augmentation for speech recognition”. In: Sixteenth Annual Confer- ence of the International Speech Communication Association. 2015.

[28]Tom Ko et al. “A study on data augmentation of reverberant speech for robust speech recog- nition”. In: IEEE International Conference on Acoustics, Speech and Signal Processing. 2017, pages 5220–5224.

[29]Anton Ragni et al. “Data augmentation for low resource languages”. In: (2014).

[30]Andreas Stolcke. “SRILM-an extensible language modeling toolkit”. In: Seventh interna- tional conference on spoken language processing. 2002.

[31]Mijit Ablimit, Tatsuya Kawahara, and Askar Hamdulla. “Lexicon optimization based on discriminative learning for automatic speech recognition of agglutinative language”. In: Speech communication (2014), pages 78–87.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多