守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 25876|回复: 2

[音频分析] 语音特征参数MFCC提取过程详解

[复制链接]
本站高手
本站高手  发表于 2015-9-10 12:49:17 |阅读模式

     折腾了好几天,看了很多资料,终于把语音特征参数MFCC搞明白了,闲话少说,进入正题。

一、MFCC概述


               在语音识别(Speech Recognition)和话者识别(Speaker Recognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients,简称MFCC)。根据人耳听觉机理的研究发现,人耳对不同频率的声波有不同的听觉敏感度。从200Hz到5000Hz的语音信号对语音的清晰度影响对大。两个响度不等的声音作用于人耳时,则响度较高的频率成分的存在会影响到对响度较低的频率成分的感受,使其变得不易察觉,这种现象称为掩蔽效应。由于频率较低的声音在内耳蜗基底膜上行波传递的距离大于频率较高的声音,故一般来说,低音容易掩蔽高音,而高音掩蔽低音较困难。在低频处的声音掩蔽的临界带宽较高频要小。所以,人们从低频到高频这一段频带内按临界带宽的大小由密到疏安排一组带通滤波器,对输入信号进行滤波。将每个带通滤波器输出的信号能量作为信号的基本特征,对此特征经过进一步处理后就可以作为语音的输入特征。由于这种特征不依赖于信号的性质,对输入信号不做任何的假设和限制,又利用了听觉模型的研究成果。因此,这种参数比基于声道模型的LPCC相比具有更好的鲁邦性,更符合人耳的听觉特性,而且当信噪比降低时仍然具有较好的识别性能。

梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients,简称MFCC)是在Mel标度频率域提取出来的倒谱参数,Mel标度描述了人耳频率的非线性特性,它与频率的关系可用下式近似表示:

式中f为频率,单位为Hz。下图展示了Mel频率与线性频率的关系:


图1 Mel频率与线性频率的关系




二、语音特征参数MFCC提取过程

      基本步骤:



图2 MFCC参数提取基本流程

1.预加重

预加重处理其实是将语音信号通过一个高通滤波器:

(2)

式中μ的值介于0.9-1.0之间,我们通常取0.97。预加重的目的是提升高频部分,使信号的频谱变得平坦,保持在低频到高频的整个频带中,能用同样的信噪比求频谱。同时,也是为了消除发生过程中声带和嘴唇的效应,来补偿语音信号受到发音系统所抑制的高频部分,也为了突出高频的共振峰。

2.分帧

先将N个采样点集合成一个观测单位,称为帧。通常情况下N的值为256或512,涵盖的时间约为20~30ms左右。为了避免相邻两帧的变化过大,因此会让两相邻帧之间有一段重叠区域,此重叠区域包含了M个取样点,通常M的值约为N的1/2或1/3。通常语音识别所采用语音信号的采样频率为8KHz或16KHz,以8KHz来说,若帧长度为256个采样点,则对应的时间长度是256/8000×1000=32ms。

3.加窗(Hamming Window)

将每一帧乘以汉明窗,以增加帧左端和右端的连续性。假设分帧后的信号为S(n), n=0,1…,N-1, N为帧的大小,那么乘上汉明窗后,W(n)形式如下:

(3)

不同的a值会产生不同的汉明窗,一般情况下a取0.46

4.快速傅里叶变换

由于信号在时域上的变换通常很难看出信号的特性,所以通常将它转换为频域上的能量分布来观察,不同的能量分布,就能代表不同语音的特性。所以在乘上汉明窗后,每帧还必须再经过快速傅里叶变换以得到在频谱上的能量分布。对分帧加窗后的各帧信号进行快速傅里叶变换得到各帧的频谱。并对语音信号的频谱取模平方得到语音信号的功率谱。设语音信号的DFT为:


(4)

           式中x(n)为输入的语音信号,N表示傅里叶变换的点数。

           5. 三角带通滤波器

           将能量谱通过一组Mel尺度的三角形滤波器组,定义一个有M个滤波器的滤波器组(滤波器的个数和临界            带的个数相近),采用的滤波器为三角滤波器,中心频率为f(m),m=1,2,...,M。M通常取22-26。各                f(m)之间的间隔随着m值的减小而缩小,随着m值的增大而增宽,如图所示:



图3 Mel频率滤波器组

           

三角滤波器的频率响应定义为:

(5)


              式中


三角带通滤波器有两个主要目的:

对频谱进行平滑化,并消除谐波的作用,突显原先语音的共振峰。(因此一段语音的音调或音高,是不会呈现在 MFCC 参数内,换句话说,以 MFCC 为特征的语音辨识系统,并不会受到输入语音的音调不同而有所影响) 此外,还可以降低运算量。

6.计算每个滤波器组输出的对数能量为:

(6)

7.经离散余弦变换(DCT)得到MFCC系数:


(7)

                

将上述的对数能量带入离散余弦变换,求出L阶的Mel-scale Cepstrum参数。L阶指MFCC系数阶数,通常取12-16。这里M是三角滤波器个数。

8.对数能量

此外,一帧的音量(即能量),也是语音的重要特征,而且非常容易计算。因此,通常再加上一帧的对数能量(定义:一帧内信号的平方和,再取以10为底的对数值,再乘以10)使得每一帧基本的语音特征就多了一维,包括一个对数能量和剩下的倒频谱参数。

注:若要加入其它语音特征以测试识别率,也可以在此阶段加入,这些常用的其它语音特征包含音高、过零率以及共振峰等。

9.动态差分参数的提取(包括一阶差分和二阶差分)

标准的倒谱参数MFCC只反映了语音参数的静态特性,语音的动态特性可以用这些静态特征的差分谱来描述。实验证明:把动、静态特征结合起来才能有效提高系统的识别性能。差分参数的计算可以采用下面的公式:

(8)

式中,dt表示第t个一阶差分,Ct表示第t个倒谱系数,Q表示倒谱系数的阶数,K表示一阶导数的时间差,可取1或2。将上式的结果再代入就可以得到二阶差分的参数。

总结:

因此,MFCC的全部组成其实是由:

N维MFCC参数(N/3 MFCC系数+ N/3 一阶差分参数+ N/3 二阶差分参数)+帧能量(此项可根据需求替换)

MATLAB实现


[x fs]=wavread('8.wav');
bank=melbankm(24,256,fs,0,0.4,'t');%Mel滤波器的阶数为24,fft变换的长度为256,采样频率为16000Hz
%归一化mel滤波器组系数
bank=full(bank);
bank=bank/max(bank(:));
for k=1:12 %归一化mel滤波器组系数
n=0:23;
dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));
end
w=1+6*sin(pi*[1:12]./12);%归一化倒谱提升窗口
w=w/max(w);%预加重滤波器
xx=double(x);
xx=filter([1-0.9375],1,xx);%语音信号分帧
xx=enframe(xx,256,80);%对x 256点分为一帧
%计算每帧的MFCC参数
for i=1:size(xx,1)
y=xx(i,:);
s=y'.*hamming(256);
t=abs(fft(s));%fft快速傅立叶变换
t=t.^2;
c1=dctcoef*log(bank*t(1:129));
c2=c1.*w';
m(i,:)=c2';
end
%求取一阶差分系数
dtm=zeros(size(m));
for i=3:size(m,1)-2
dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);
end
dtm=dtm/3;
%求取二阶差分系数
dtmm=zeros(size(dtm));
for i=3:size(dtm,1)-2
dtmm(i,:)=-2*dtm(i-2,:)-dtm(i-1,:)+dtm(i+1,:)+2*dtm(i+2,:);
end
dtmm=dtmm/3;
%合并mfcc参数和一阶差分mfcc参数
ccc=[m dtm dtmm];
%去除首尾两帧,因为这两帧的一阶差分参数为0
ccc=ccc(3:size(m,1)-2,:);
ccc
% subplot(2,1,1)
% ccc_1=ccc(:,1);
% plot(ccc_1);title('MFCC');ylabel('幅值');
% [h,w]=size(ccc);
% A=size(ccc);
% subplot(212)
% plot([1,w],A);
% xlabel('维数');
% ylabel('幅值');
% title('维数与幅值的关系')

    HTK实现:

运行:
HCopy config 8.wav 8.mfcc
其中,涉及mfcc的参数为:
TARGETKIND=MFCC_E_D_A
-目标是MFCC文件,以及energy(E), delta(D),delta-delta(A)
TARGETRATE=100000
-窗间隔为10ms
WINDOWSIZE=250000
-窗长为25ms
注:HTK中时间单位为100ns
ZMEANSOURCE=T
-将来源文件取zero mean,即去掉DC值
USEHAMMING=T
-使用hamming window
PREEMCOEF=0.97
-预加重系数0.97
NUMCHANS=31
-在MEL刻度下等分成31个频带
USEPOWER=F
-不使用c(0)参数
以上即是语音特征参数MFCC的提取过程详解,希望能够帮助到大家!



本文来自:http://my.oschina.net/jamesju/blog/193343

回复

使用道具 举报

本站高手
本站高手  发表于 2015-9-12 10:16:38
语音特征参数MFCC计算的详细过程


           注:老早之前就在看语音信号处理方面的知识,每当过了很久都会忘记,由于之前对语音特征MFCC提取的流程还是非常清楚的,但是对于一些细节以及一些原理一些的东西还是不是很明白,通过这次的总结,我终于明白的其中的技术细节以及设计方法,包括滤波器的设计,以及参数的具体意义,希望这个总结能给自己增加更多的印象,课本上好像对各个三角滤波器的设计没有过多的讲解,也没讲流程,希望这里的总结能有所帮助。

一、MFCC计算总体流程

1.信号的预处理,包括预加重(Preemphasis),分帧(Frame Blocking),加窗(Windowing)。假设语音信号的采样频率fs=8KHz.由于语音信号在10-30ms认为是稳定的,则可设置帧长为80~240点。帧移可以设置为帧长的1/2.

2.对每一帧进行FFT变换,求频谱,进而求得幅度谱。

3.对幅度谱加Mel滤波器组(Mel滤波器组设计问题)。

4.对所有的滤波器输出做对数运算(Logarlithm),再进一步做离散余弦变换DCT可得MFCC。

流程图如下所示:

二、实际频率与Mel频率的转换

Mel频率与实际频率的具体关系如下:

 

人耳的听觉特性与Mel频率的增长一致。与实际频率在1000Hz以下呈现线性分布,1000Hz以上呈现对数增长。

Mel频率轴上配置K个通道的三角形滤波器组,K的个数由信号的截止频率决定。

设计的过程如下:

假设语音信号的采样频率,帧长N=256,滤波器个数K=22

由此可得语音信号的最大频率为:

根据下面的公式:

 

可以求得出最大的Mel频率为:

由于在Mel刻度范围内,各个三角滤波器的中心频率是相等间隔的线性分布。由此,可以计算两个相邻三角滤波器的中心频率的间距为:

因此,各三角形滤波器在mel刻度上的中心频率可以表示为:

由上面的中心频率可以计算出对应的线性刻度上的频率。如下图所示:

下面采用Matlab设计Mel三角形滤波器如下:

//获取Mel三角滤波器的参数

fs为采样频率,filterNum为三角滤波器的个数

maxMelFreq = freq2mel(fs/2); %将线性频率转化为mel频率,得到最大的Mel频率

sideWidth=maxMelFreq/(filterNum+1);%求频带宽带,即Mel滤波器宽度

index=0:filterNum-1;%滤波器的中心

filterBankPrm=floor(mel2freq([index;index+1;index+2]*sideWidth)/fs*frameSize)+1;

filterBankPrm(end, end)= frameSize/2;

 得到如下的三角形滤波器,横坐标对应于FFT中的点的下标:

 注:这里选择的帧长为256点,然后FFT的点数也为256,由于是对称的,所以只取前面一半的点计算频谱。然后加入到三角滤波器中。

每一个三角形滤波器的中心频率c(l) 在Mel频率轴上等间隔分布。设o(l),c(l),h(l) 分别是第l 个三角形滤波器的下限,中心,和上限频率,则相邻三角形滤波器之间的下限,中心,上限频率的关系如下:c(l)=h(l-1)=o(l+1)

根据语音信号幅度谱求每个三角形滤波器的输出。

对所有的滤波器输出做对数运算,再进一步做离散余弦变换(DCT)即可得到MFCC

由上公式可知,MFCC特征参数的长度与滤波器的个数无关。只与DCT有关。

% === 对幅度谱进行三角滤波过程

function tbfCoef = triBandFilter(fftMag, P, filterBankParam)

fstart=filterBankParam(1,:);                %fftMag一帧数据的幅度谱

fcenter=filterBankParam(2,:);%滤波器的中心点,每列代表一个滤波器的中心频率

fstop=filterBankParam(3,:);

% Triangular bandpass filter.

for i=1:P %滤波器个数

   for j = fstart(i):fcenter(i), %第i个滤波器起始频谱点和中心频谱点的输出

      filtmag(j) = (j-fstart(i))/(fcenter(i)-fstart(i));

   end

   for j = fcenter(i)+1:fstop(i),

      filtmag(j) = 1-(j-fcenter(i))/(fstop(i)-fcenter(i));

   end

   tbfCoef(i) = sum(fftMag(fstart(i):fstop(i)).*filtmag(fstart(i):fstop(i))'); %第i个滤波器的输出

end

tbfCoef=log(eps+tbfCoef.^2); %求得每个滤波器的对数输出,有多少个滤波器就有多少个输出,对应为每一帧

 

 

 

 

 

本文来自:http://blog.csdn.net/xiaoding133/article/details/8106672

回复 支持 反对

使用道具 举报

本站高手
本站高手  发表于 2015-9-10 15:04:13


语音信号处理之(四)梅尔频率倒谱系数(MFCC)

zouxy09@qq.com

http://blog.csdn.net/zouxy09

 

       这学期有《语音信号处理》这门课,快考试了,所以也要了解了解相关的知识点。呵呵,平时没怎么听课,现在只能抱佛脚了。顺便也总结总结,好让自己的知识架构清晰点,也和大家分享下。下面总结的是第四个知识点:MFCC。因为花的时间不多,所以可能会有不少说的不妥的地方,还望大家指正。谢谢。

 

      在任意一个Automatic speech recognition 系统中,第一步就是提取特征。换句话说,我们需要把音频信号中具有辨识性的成分提取出来,然后把其他的乱七八糟的信息扔掉,例如背景噪声啊,情绪啊等等。

      搞清语音是怎么产生的对于我们理解语音有很大帮助。人通过声道产生声音,声道的shape(形状?)决定了发出怎样的声音。声道的shape包括舌头,牙齿等。如果我们可以准确的知道这个形状,那么我们就可以对产生的音素phoneme进行准确的描述。声道的形状在语音短时功率谱的包络中显示出来。而MFCCs就是一种准确描述这个包络的一种特征。

       MFCCs(Mel Frequency Cepstral Coefficents)是一种在自动语音和说话人识别中广泛使用的特征。它是在1980年由Davis和Mermelstein搞出来的。从那时起。在语音识别领域,MFCCs在人工特征方面可谓是鹤立鸡群,一枝独秀,从未被超越啊(至于说Deep Learning的特征学习那是后话了)。

       好,到这里,我们提到了一个很重要的关键词:声道的形状,然后知道它很重要,还知道它可以在语音短时功率谱的包络中显示出来。哎,那什么是功率谱?什么是包络?什么是MFCCs?它为什么有效?如何得到?下面咱们慢慢道来。

 

一、声谱图(Spectrogram

         我们处理的是语音信号,那么如何去描述它很重要。因为不同的描述方式放映它不同的信息。那怎样的描述方式才利于我们观测,利于我们理解呢?这里我们先来了解一个叫声谱图的东西。

       这里,这段语音被分为很多帧,每帧语音都对应于一个频谱(通过短时FFT计算),频谱表示频率与能量的关系。在实际使用中,频谱图有三种,即线性振幅谱、对数振幅谱、自功率谱(对数振幅谱中各谱线的振幅都作了对数计算,所以其纵坐标的单位是dB(分贝)。这个变换的目的是使那些振幅较低的成分相对高振幅成分得以拉高,以便观察掩盖在低幅噪声中的周期信号)。

  

       我们先将其中一帧语音的频谱通过坐标表示出来,如上图左。现在我们将左边的频谱旋转90度。得到中间的图。然后把这些幅度映射到一个灰度级表示(也可以理解为将连续的幅度量化为256个量化值?),0表示黑,255表示白色。幅度值越大,相应的区域越黑。这样就得到了最右边的图。那为什么要这样呢?为的是增加时间这个维度,这样就可以显示一段语音而不是一帧语音的频谱,而且可以直观的看到静态和动态的信息。优点稍后呈上。

         这样我们会得到一个随着时间变化的频谱图,这个就是描述语音信号的spectrogram声谱图。

      下图是一段语音的声谱图,很黑的地方就是频谱图中的峰值(共振峰formants)。

      那我们为什么要在声谱图中表示语音呢?

      首先,音素(Phones)的属性可以更好的在这里面观察出来。另外,通过观察共振峰和它们的转变可以更好的识别声音。隐马尔科夫模型(Hidden Markov Models)就是隐含地对声谱图进行建模以达到好的识别性能。还有一个作用就是它可以直观的评估TTS系统(text to speech)的好坏,直接对比合成的语音和自然的语音声谱图的匹配度即可。

 

二、倒谱分析(Cepstrum Analysis

       下面是一个语音的频谱图。峰值就表示语音的主要频率成分,我们把这些峰值称为共振峰(formants),而共振峰就是携带了声音的辨识属性(就是个人身份证一样)。所以它特别重要。用它就可以识别不同的声音。

        既然它那么重要,那我们就是需要把它提取出来!我们要提取的不仅仅是共振峰的位置,还得提取它们转变的过程。所以我们提取的是频谱的包络(Spectral Envelope)。这包络就是一条连接这些共振峰点的平滑曲线。

      我们可以这么理解,将原始的频谱由两部分组成:包络和频谱的细节。这里用到的是对数频谱,所以单位是dB。那现在我们需要把这两部分分离开,这样我们就可以得到包络了。

      那怎么把他们分离开呢?也就是,怎么在给定log X[k]的基础上,求得log H[k]  log E[k]以满足log X[k] = log H[k] + log E[k]呢?

      为了达到这个目标,我们需要Play a Mathematical Trick。这个Trick是什么呢?就是对频谱做FFT。在频谱上做傅里叶变换就相当于逆傅里叶变换Inverse FFT (IFFT)。需要注意的一点是,我们是在频谱的对数域上面处理的,这也属于Trick的一部分。这时候,在对数频谱上面做IFFT就相当于在一个伪频率(pseudo-frequency)坐标轴上面描述信号。

         由上面这个图我们可以看到,包络是主要是低频成分(这时候需要转变思维,这时候的横轴就不要看成是频率了,咱们可以看成时间),我们把它看成是一个每秒4个周期的正弦信号。这样我们在伪坐标轴上面的4Hz的地方给它一个峰值。而频谱的细节部分主要是高频。我们把它看成是一个每秒100个周期的正弦信号。这样我们在伪坐标轴上面的100Hz的地方给它一个峰值。

         把它俩叠加起来就是原来的频谱信号了。

      在实际中咱们已经知道log X[k],所以我们可以得到了x[k]。那么由图可以知道,h[k]x[k]的低频部分,那么我们将x[k]通过一个低通滤波器就可以得到h[k]了!没错,到这里咱们就可以将它们分离开了,得到了我们想要的h[k],也就是频谱的包络。

       x[k]实际上就是倒谱Cepstrum(这个是一个新造出来的词,把频谱的单词spectrum的前面四个字母顺序倒过来就是倒谱的单词了)。而我们所关心的h[k]就是倒谱的低频部分。h[k]描述了频谱的包络,它在语音识别中被广泛用于描述特征。

      那现在总结下倒谱分析,它实际上是这样一个过程:

1)将原语音信号经过傅里叶变换得到频谱:X[k]=H[k]E[k]

只考虑幅度就是:|X[k] |=|H[k]||E[k] |

2)我们在两边取对数:log||X[k] ||= log ||H[k] ||+ log ||E[k] ||

3)再在两边取逆傅里叶变换得到:x[k]=h[k]+e[k]

       这实际上有个专业的名字叫做同态信号处理。它的目的是将非线性问题转化为线性问题的处理方法。对应上面,原来的语音信号实际上是一个卷性信号(声道相当于一个线性时不变系统,声音的产生可以理解为一个激励通过这个系统),第一步通过卷积将其变成了乘性信号(时域的卷积相当于频域的乘积)。第二步通过取对数将乘性信号转化为加性信号,第三步进行逆变换,使其恢复为卷性信号。这时候,虽然前后均是时域序列,但它们所处的离散时域显然不同,所以后者称为倒谱频域。

      总结下,倒谱(cepstrum)就是一种信号的傅里叶变换经对数运算后再进行傅里叶反变换得到的谱。它的计算过程如下:

 

三、Mel频率分析(Mel-Frequency Analysis 

         好了,到这里,我们先看看我们刚才做了什么?给我们一段语音,我们可以得到了它的频谱包络(连接所有共振峰值点的平滑曲线)了。但是,对于人类听觉感知的实验表明,人类听觉的感知只聚焦在某些特定的区域,而不是整个频谱包络。

         Mel频率分析就是基于人类听觉感知实验的。实验观测发现人耳就像一个滤波器组一样,它只关注某些特定的频率分量(人的听觉对频率是有选择性的)。也就说,它只让某些频率的信号通过,而压根就直接无视它不想感知的某些频率信号。但是这些滤波器在频率坐标轴上却不是统一分布的,在低频区域有很多的滤波器,他们分布比较密集,但在高频区域,滤波器的数目就变得比较少,分布很稀疏。

       人的听觉系统是一个特殊的非线性系统,它响应不同频率信号的灵敏度是不同的。在语音特征的提取上,人类听觉系统做得非常好,它不仅能提取出语义信息而且能提取出说话人的个人特征,这些都是现有的语音识别系统所望尘莫及的。如果在语音识别系统中能模拟人类听觉感知处理特点,就有可能提高语音的识别率。

        梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)考虑到了人类的听觉特征,先将线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。

        将普通频率转化到Mel频率的公式是:
 
      由下图可以看到,它可以将不统一的频率转化为统一的频率,也就是统一的滤波器组。

      在Mel频域内,人对音调的感知度为线性关系。举例来说,如果两段语音的Mel频率相差两倍,则人耳听起来两者的音调也相差两倍。

 

四、Mel频率倒谱系数(Mel-Frequency Cepstral Coefficients 

       我们将频谱通过一组Mel滤波器就得到Mel频谱。公式表述就是:log X[k] = log (Mel-Spectrum)。这时候我们在log X[k]上进行倒谱分析:

1)取对数:log X[k] = log H[k] + log E[k]

2)进行逆变换:x[k] = h[k] + e[k]

      在Mel频谱上面获得的倒谱系数h[k]就称为Mel频率倒谱系数,简称MFCC

         现在咱们来总结下提取MFCC特征的过程:(具体的数学过程网上太多了,这里就不想贴了)

1)先对语音进行预加重、分帧和加窗;

2)对每一个短时分析窗,通过FFT得到对应的频谱;

3)将上面的频谱通过Mel滤波器组得到Mel频谱;

4)在Mel频谱上面进行倒谱分析(取对数,做逆变换,实际逆变换一般是通过DCT离散余弦变换来实现,取DCT后的第2个到第13个系数作为MFCC系数),获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征;

       这时候,语音就可以通过一系列的倒谱向量来描述了,每个向量就是每帧的MFCC特征向量。

     这样就可以通过这些倒谱向量对语音分类器进行训练和识别了。

 

五、参考文献

[1]这里面还有一个比较好的教程:

http://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/

[2]本文主要参考:cmu的教程:

 http://www.speech.cs.cmu.edu/15-492/slides/03_mfcc.pdf

[3] C library for computing Mel Frequency Cepstral Coefficients (MFCC)

http://code.google.com/p/libmfcc/





本文来自:http://blog.csdn.net/zouxy09/article/details/9156785/

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

站长推荐上一条 /4 下一条

QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

GMT+8, 2024-4-18 18:42 , Processed in 0.140489 second(s), 37 queries .

守望者AIR

守望者AIR技术交流社区

本站成立于 2014年12月31日

快速回复 返回顶部 返回列表