語音識別系統(tǒng)實驗報告資料_第1頁
語音識別系統(tǒng)實驗報告資料_第2頁
語音識別系統(tǒng)實驗報告資料_第3頁
語音識別系統(tǒng)實驗報告資料_第4頁
語音識別系統(tǒng)實驗報告資料_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、語音識別系統(tǒng)實驗報告專業(yè)班級:信息安全學(xué)號:姓名: TOC o 1-5 h z 一、設(shè)計任務(wù)及要求,1二、語音識別的簡單介紹語者識別的概念,2特征參數(shù)的提取,3用矢量量化聚類法生成碼本,3VQ 的說話人識別,4三、算法程序分析函數(shù)關(guān)系,.4代碼說明,5函數(shù) mfcc,5函數(shù) disteu ,5函數(shù) vqlbg ,.6函數(shù)test ,6函數(shù)testDB ,7函數(shù) train ,8函數(shù) melfb ,8四、演示分析,.9五、心得體會,.1112附: GUI程序代碼,12設(shè)計任務(wù)及要求實現(xiàn)語音識別功能。語音識別的簡單介紹基于VQ的說話人識別系統(tǒng),矢量量化起著雙重作用。在訓(xùn)練階段,把每一個說話者所提取

2、的特征參數(shù)進行分類,產(chǎn)生不同碼字所組成的碼本。在識別 ( 匹配 )階段, 我們用VQ方法計算平均失真測度( 本系統(tǒng)在計算距離d 時, 采用歐氏距離測度) ,從而判斷說話人是誰。語音識別系統(tǒng)結(jié)構(gòu)框圖如圖1 所示 。圖 1 語音識別系統(tǒng)結(jié)構(gòu)框圖語者識別的概念語者識別就是根據(jù)說話人的語音信號來判別說話人的身份。語音是人的自然屬性之一,由于說話人發(fā)音器官的生理差異以及后天形成的行為差異,每個人的語音都帶有強烈的個人色彩,這就使得通過分析語音信號來識別說話人成為可能。用語音來鑒別說話人的身份有著許多獨特的優(yōu)點,如語音是人的固有的特征,不會丟失或遺忘;語音信號的采集方便,系統(tǒng)設(shè)備成本低;利用電話網(wǎng)絡(luò)還可實

3、現(xiàn)遠程客戶服務(wù)等。因此,近幾年來,說話人識別越來越多的受到人們的重視。與其他生物識別技術(shù)如指紋識別、手形識別等相比較,說話人識別不僅使用方便,而且屬于非接觸性,容易被用戶接受,并且在已有的各種生物特征識別技術(shù)中,是唯一可以用作遠程驗證的識別技術(shù)。因此,說話人識別的應(yīng)用前景非常廣泛:今天, 說話人識別技術(shù)已經(jīng)關(guān)系到多學(xué)科的研究領(lǐng)域,不同領(lǐng)域中的進步都對說話人識別的發(fā)展做出了貢獻。說話人識別技術(shù)是集聲學(xué)、語言學(xué)、計算機、信息處理和人工智能等諸多領(lǐng)域的一項綜合技術(shù),應(yīng)用需求將十分廣闊。在吃力語音信號的時候如何提取信號中關(guān)鍵的成分尤為重要。語音信號的特征參數(shù)的好壞直接導(dǎo)致了辨別的準(zhǔn)確性。特征參數(shù)的提取

4、對于特征參數(shù)的選取,我們使用mfcc 的方法來提取。MFCC參數(shù)是基于人的聽覺特性利用人聽覺的屏蔽效應(yīng),在Mel 標(biāo)度頻率域提取出來的倒譜特征參數(shù)。MFCC參數(shù)的提取過程如下:對輸入的語音信號進行分幀、加窗,然后作離散傅立葉變換,獲得頻譜 分布信息。設(shè)語音信號的DFT為:N 1j 2 nkXa(k)x(n)e N ,0 k N 1( 1)n1其中式中x(n) 為輸入的語音信號,N表示傅立葉變換的點數(shù)。再求頻譜幅度的平方,得到能量譜。將能量譜通過一組Mel 尺度的三角形濾波器組。我們定義一個有M個濾波器的濾波器組(濾波器的個數(shù)和臨界帶的個數(shù)相近),采用的濾波器為三角濾波器,中心頻率為f(m),m

5、=1,2,3, , M本系統(tǒng)取M=100。計算每個濾波器組輸出的對數(shù)能量。N12S(m) ln( | Xa(k) |2 H m (k), ( 2)0mM1其中 H m (k) 為三角濾波器的頻率響應(yīng)。經(jīng)過離散弦變換(DCT)得到MFC系數(shù)。CM1C(n) S ( m)cos( n(m 0.5/ m),(3) m00nN1MFCC系數(shù)個數(shù)通常取20 30, 常常不用0 階倒譜系數(shù),因為它反映的是頻譜能量,故在一般識別系統(tǒng)中,將稱為能量系數(shù),并不作為倒譜系數(shù),本系統(tǒng)選取 20 階倒譜系數(shù)。用矢量量化聚類法生成碼本我們將每個待識的說話人看作是一個信源,用一個碼本來表征。碼本是從該說話人的訓(xùn)練序列中提

6、取的MFCC特征矢量聚類而生成。只要訓(xùn)練的序列足夠長,可認為這個碼本有效地包含了說話人的個人特征,而與講話的內(nèi)容無關(guān)。本系統(tǒng)采用基于分裂的LBG的算法設(shè)計VQ碼本,Xk(k 1,2, ,K)為訓(xùn)練序列, B為碼本。具體實現(xiàn)過程如下: TOC o 1-5 h z 取提取出來的所有幀的特征矢量的型心( 均值 ) 作為第一個碼字矢量B1。將當(dāng)前的碼本Bm根據(jù)以下規(guī)則分裂,形成2m個碼字。4)BmBm 4)BmBm (1)其中m從1 變化到當(dāng)前的碼本的碼字數(shù),3. 其中m從1 變化到當(dāng)前的碼本的碼字數(shù),3. 根據(jù)得到的碼本把所有的訓(xùn)練序列兩個公式計算訓(xùn)練矢量量化失真量的總和( 特征矢量) 進行分類,然

7、后按照下面Dn以及相對失真(n為迭代次數(shù),初始n=0, D 1 =,B為當(dāng)前的碼書),若相對失真小于某一閾值 ,迭代結(jié)束,當(dāng)前的碼書就是設(shè)計好的2m個碼字的碼書,轉(zhuǎn)。否則,轉(zhuǎn)下一步。量化失真量和:5)65)6)D(n) mind(Xk,B)k1相對失真:D(n 1) Dn| Dn | TOC o 1-5 h z 重新計算各個區(qū)域的新型心,得到新的碼書,轉(zhuǎn)3。重復(fù),和步,直到形成有M個碼字的碼書(M 是所要求的碼字數(shù)) ,其中D0=10000。2.4 VQ 的說話人識別設(shè)是未知的說話人的特征矢量X1, , XT, 共有 T幀是訓(xùn)練階段形成的碼書,表示碼書第m個碼字,每一個碼書有M個碼字。 再計算

8、測試者的平均量化失真D,并設(shè)置一個閾值,若D小于此閾值,則是原訓(xùn)練者,反之則認為不是原訓(xùn)練者。D 1/Tmind(xj ,Bm) ( 7)j1mM算法程序分析在具體的實現(xiàn)過程當(dāng)中,采用了 matlab 軟件來幫助完成這個項目。在 matlab中主要由采集,分析,特征提取,比對幾個重要部分。以下為在實際的操作中,具體用到得函數(shù)關(guān)系和作用一一列舉在下面。函數(shù)關(guān)系主要有兩類函數(shù)文件Train.m 和 Test.m在 Train.m 調(diào)用 Vqlbg.m 獲取訓(xùn)練錄音的vq 碼本, 而 Vqlbg.m 調(diào)用 mfcc.m獲取單個錄音的mel 倒譜系數(shù),接著 mfcc.m 調(diào)用 Melfb.m- 將能量

9、譜通過一組Mel 尺度的三角形濾波器組。在 Test.m 函數(shù)文件中調(diào)用Disteu.m 計算訓(xùn)練錄音(提供vq 碼本)與測試錄音(提供mfcc) mel 倒譜系數(shù)的距離,即判斷兩聲音是否為同一錄音者提供。Disteu.m 調(diào)用 mfcc.m 獲取單個錄音的mel 倒譜系數(shù)。mfcc.m 調(diào)用 Melfb.m-將能量譜通過一組Mel 尺度的三角形濾波器組。具體代碼說明函數(shù) mffc:function r = mfcc(s, fs)m = 100;n = 256;l = length(s);nbFrame = floor(l - n) / m) + 1; %沿 - 方向取整for i = 1:n

10、for j = 1:nbFrameM(i, j) = s(j - 1) * m) + i); %對矩陣M賦值endendh = hamming(n); % 加 hamming 窗,以增加音框左端和右端的連續(xù)性M2 = diag(h) * M;for i = 1:nbFrameframe(:,i) = fft(M2(:, i); %對信號進行快速傅里葉變換FFTendt = n / 2;tmax = l / fs;m = melfb(20, n, fs); %將上述線性頻譜通過Mel 頻率濾波器組得到Mel 頻譜 , 下面在將其轉(zhuǎn)化成對數(shù)頻譜n2 = 1 + floor(n / 2);z = m

11、 * abs(frame(1:n2, :).2;r = dct(log(z); % 將上述對數(shù)頻譜,經(jīng)過離散余弦變換(DCT)變換到倒譜域,即可得到Mel 倒譜系數(shù)(MFCC參數(shù))函數(shù) disteu- 計算測試者和模板碼本的距離function d = disteu(x, y)M, N = size(x); %音頻x 賦值給【M, N】M2, P = size(y); %音頻y 賦值給【M2, P】if (M = M2)error( 不匹配! ) % 兩個音頻時間長度不相等endd = zeros(N, P);if (N P)% 在兩個音頻時間長度相等的前提下copies = zeros(1,

12、P);for n = 1:Nd(n,:) = sum(x(:, n+copies) - y) .2, 1);endelsecopies = zeros(1,N);for p = 1:Pd(:,p) = sum(x - y(:, p+copies) .2, 1); end% 成對歐氏距離的兩個矩陣的列之間的距離endd = d.0.5;函數(shù) vqlbg- 該函數(shù)利用矢量量化提取了音頻的vq 碼本function r = vqlbg(d,k)e = .01;r = mean(d, 2);dpr = 10000;for i = 1:log2(k)r = r*(1+e), r*(1-e);while

13、(1 = 1)z = disteu(d, r);m,ind = min(z, , 2);t = 0;for j = 1:2ir(:, j) = mean(d(:, find(ind = j), 2);x = disteu(d(:, find(ind = j), r(:, j); for q = 1:length(x)t = t + x(q); endendif (dpr - t)/t) e) break;elsedpr = t; endendend函數(shù) testfunction finalmsg = test(testdir, n, code)for k = 1:n% read test so

14、und file of each speakerfile = sprintf(%ss%d.wav, testdir, k);s, fs = wavread(file);v = mfcc(s, fs);v = mfcc(s, fs);%distmin = 4;%d = disteu(v, code1); %得到測試人語音的mel 倒譜系數(shù)閾值設(shè)置處就判斷一次,因為模板里面只有一個文件計算得到模板和要判斷的聲音之間的dist = sum(min(d,2) / size(d,1); %變換得到一個距離的量%測試閾值數(shù)量級變換得到一個距離的量msgc = sprintf( 與模板語音信號的差值為:%1

15、0f , dist);disp(msgc);% 此人匹配if dist distminmsg = sprintf(第 %d位說話者與模板語音信號不匹配, 不符合要求 !n, k);finalmsg= 此位說話者不符合要求!;%界面顯示語句,可隨意設(shè)定disp(msg);endend函數(shù) testDB這個函數(shù)實際上是對數(shù)據(jù)庫一個查詢, 根據(jù)測試者的聲音, 找相應(yīng)的文件, 并且給出是誰的提示function testmsg = testDB(testdir, n, code) nameList=1,2,3,4,5,6,7,8,9 ;% 這個是我們要識別的9個數(shù)for k = 1:n%數(shù)據(jù)庫中每一個

16、說話人的特征file = sprintf(%ss%d.wav, testdir, k);%找出文件的路徑s, fs = wavread(file);對找到的文件取mfcc變換v = mfcc(s, fs); distmin 對找到的文件取mfcc變換k1 = 0;for l = 1:length(code)d = disteu(v, codel);dist = sum(min(d,2) / size(d,1);if dist distmindistmin = distmin = dist;%這里和 test 函數(shù)里面一樣但多了一個具體語者的識別k1 = l;endendmsg=nameList

17、k1msgbox(msg);end函數(shù) train- 該函數(shù)就是對音頻進行訓(xùn)練,也就是提取特征參數(shù)function code = train(traindir, n)k = 16;% number of centroids requiredfor i = 1:n%對數(shù)據(jù)庫中的代碼形成碼本file = sprintf(%ss%d.wav, traindir, i);disp(file);s, fs = wavread(file);v = mfcc(s, fs); %計算 MFCCs 提取特征特征,返回值是Mel 倒譜系數(shù),是一個log 的 dct 得到的codei = vqlbg(v, k);%

18、codei = vqlbg(v, k);%話人的VQ碼本end函數(shù) melfb- 確定矩陣的濾波器function m = melfb(p, n, fs)f0 = 700 / fs;fn2 = floor(n/2);lr = log(1 + 0.5/f0) / (p+1);% convert to fft bin numbers with 0 for DC term bl = n * (f0 * (exp(0 1 p p+1 * lr) - 1);直接轉(zhuǎn)換為FFT的數(shù)字模型b1 = floor(bl(1) + 1;b2 = ceil(bl(2);b3 = floor(bl(3);b4 = mi

19、n(fn2, ceil(bl(4) - 1;pf = log(1 + (b1:b4)/n/f0) / lr;fp = floor(pf);pm = pf - fp;r = fp(b2:b4) 1+fp(1:b3);c = b2:b4 1:b3 + 1;v = 2 * 1-pm(b2:b4) pm(1:b3);m = sparse(r, c, v, p, 1+fn2)演示分析我們的功能分為兩部分: 對已經(jīng)保存的9 個數(shù)字的語音進行辨別和實時的判斷說話人說的是否為一個數(shù). 在前者的實驗過程中, 先把 9 個數(shù)字的聲音保存成 wav的格式, 放在一個文件夾中, 作為一個檢測的數(shù)據(jù)庫. 然后對檢測者實

20、行識別 , 系統(tǒng)給出提示是哪個數(shù)字.在第二個功能中, 實時的錄取一段說話人的聲音作為模板, 提取 mfcc 特征參數(shù) , 隨后緊接著進行遇著識別, 也就是讓其他人再說相同的話, 看是否是原說話者.實驗過程及具體功能如下:先打開 Matlab 使 Current Directory 為錄音及程序所所在的文件夾再打開文件“enter .m”,點run 運行,打開enter 界面,點擊“進入”按鈕進入系統(tǒng)。(注:文件包未封裝完畢,目前只能通過此方式打開運行。) (如下圖 figure1 )figure1在對數(shù)據(jù)庫中已有的語者進行識別模塊選擇載入語音庫語音個數(shù);點擊語音庫錄制模版進行已存語音信息的提取

21、;點擊錄音 -test 進行現(xiàn)場錄音;點擊語者判斷進行判斷數(shù)字,并顯示出來。在實時語者識別模塊點擊實時錄制模板上的“錄音 -train ”按鈕 , 是把新語者的聲音以wav格式存放在”實時模板”文件夾中 , 接著點擊“實時錄制模板”,把新的模板提取特征值。隨后點擊實時語者識別模板上的“錄音 -train ”按鈕 , 是把語者的聲音以wav格式存放在”測試”文件夾中, 再點擊 “實時語者識別”, 在對測得的聲音提取特征值的同時,和實時模板進行比對,然后得出是否是實時模板中的語者。另外面板上的播放按鈕都是播放相對應(yīng)左邊錄取的聲音。想要測量多次,只要接著錄音,自動保存,然后程序比對音頻就可以。退出只

22、要點擊菜單File/Exit ,退出程序。程序運行截圖:( fig.2 )運行后系統(tǒng)界面心得體會實驗表明,該系統(tǒng)能較好地進行語音的識別,同時, 基于矢量量化技術(shù)() 的語音識別系統(tǒng)具有分類準(zhǔn)確,存儲數(shù)據(jù)少,實時響應(yīng)速度快等綜合性能好的特點矢量量化技術(shù)在語音識別的應(yīng)用方面,尤其是在孤立詞語音識別系統(tǒng)中得到很好的應(yīng)用,特別是有限狀態(tài)矢量量化技術(shù),對于語音識別更為有效。通過這次課程設(shè)計,我對語音識別有了更加形象化的認識,也強化了MATLAB的應(yīng)用,對將來的學(xué)習(xí)奠定了基礎(chǔ)。附: GUI程序代碼function pushbutton1_Callback(hObject, eventdata, handl

23、es) % hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)Channel_Str=get(handles.popupmenu3,String );Channel_Number=str2double(Channel_Strget(handles.popupmenu3,Value ); global moodle;

24、moodle = train( 模版 ,Channel_Number)%? y? ? ?DD?% - Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles) % hObject handle to pushbutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handglobal data1; global moodle ; tes

25、t( 測試 ,1,moodle)%? ? 2a% function Open_Callback(hObject, eventdata, handles)% hObject handle to Open (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) filename,pathname=uigetfile( )file=get(handles.edits,filename

26、,pathname) y,f,b=wavread(file);% function Exit_Callback(hObject, eventdata, handles)% hObject handle to Exit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA) exit% function About_Callback(hObject, eventdata, hand

27、les)% hObject handle to About (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA) H= 語者識別 helpdlg(H, help text ) % function File_Callback(hObject, eventdata, handles)% hObject handle to File (see GCBO)% eventdata re

28、served - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% function Edit_Callback(hObject, eventdata, handles)% hObject handle to Edit (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles a

29、nd user data (see GUIDATA)% function Help_Callback(hObject, eventdata, handles)% hObject handle to Help (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% - Executes on button press in pushbutton7.function pushbut

30、ton7_Callback(hObject, eventdata, handles)% hObject handle to pushbutton7 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)msg= 請速度錄音?msgbox(msg)clearglobal data1;%global dataDN1;AI = analoginput( winsound );chan

31、= addchannel(AI,1:2);duration = 3;%1 second acquisitionset(AI, SampleRate ,8000)ActualRate = get(AI,SampleRate );set(AI, SamplesPerTrigger ,duration*ActualRate)set(AI, TriggerType , Manual )blocksize = get(AI,SamplesPerTrigger );Fs = ActualRate;start(AI)trigger(AI)data1,time,abstime,events = getdata

32、(AI);fname=sprintf( E:Matlab 語音識別系統(tǒng)實時模版s1.wav)%dataDN1=wden(data1,heursure,s,one,5,sym8);denoisewavwrite(data1,fname)msgbox(fname)% - Executes on button press in pushbutton8.function pushbutton8_Callback(hObject, eventdata, handles)% hObject handle to pushbutton8 (see GCBO)% eventdata reserved - to

33、be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global data1;%global dataDN1;sound(data1)%sound(dataDN1)axes(handles.axes1) %set to plot at axes1plot(data1);%plot(dataDN1);xlabel( 訓(xùn)練采樣序列 ),ylabel( 信號幅 );%xlabel(? 2 ? DD),ylabel(sym8D?2 ? ?o?D?o?);g

34、rid on ;clear% - Executes on button press in pushbutton9.function pushbutton9_Callback(hObject, eventdata, handles)% hObject handle to pushbutton9 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)msg= 請速度錄音?msgbox

35、(msg)clearglobal data2;%global dataDN2;AI = analoginput( winsound );chan = addchannel(AI,1:2);duration = 3;%1 second acquisitionset(AI, SampleRate ,8000)ActualRate = get(AI,SampleRate );set(AI, SamplesPerTrigger ,duration*ActualRate)set(AI, TriggerType , Manual )blocksize = get(AI,SamplesPerTrigger

36、);Fs = ActualRate;start(AI)trigger(AI)data2,time,abstime,events = getdata(AI);fname=sprintf( E:Matlab 語音識別系統(tǒng)測試 s1.wav)%dataDN1=wden(data1,heursure,s,one,5,sym8);denoisewavwrite(data2,fname)msgbox(fname)% - Executes on button press in pushbutton10.function pushbutton10_Callback(hObject, eventdata, ha

37、ndles)% hObject handle to pushbutton10 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global data2;%global dataDN2;sound(data2)%sound(dataDN2)axes(handles.axes2) %set to plot at axes1plot(data2);%plot(dataDN2);x

38、label( 測試采樣序列 ),ylabel( 信號幅 );%xlabel(2a ?2 ? DD),ylabel(sym8D?2 ? ?o?D?o?);%grid on ;clear% - Executes on button press in pushbutton11.function pushbutton11_Callback(hObject, eventdata, handles)% hObject handle to pushbutton11 (see GCBO)% eventdata reserved - to be defined in a future version of MA

39、TLAB% handles structure with handles and user data (see GUIDATA) global moodle ;testDB( 測試 ,1,moodle)% - Executes on button press in pushbutton12.function pushbutton12_Callback(hObject, eventdata, handles)% hObject handle to pushbutton12 (see GCBO)% eventdata reserved - to be defined in a future ver

40、sion of MATLAB% handles structure with handles and user data (see GUIDATA)global moodle;moodle = train( 實時模板 ,1)% - Executes on selection change in popupmenu3.function popupmenu3_Callback(hObject, eventdata, handles)% hObject handle to popupmenu3 (see GCBO)% eventdata reserved - to be defined in a f

41、uture version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: contents = get(hObject,String)returns popupmenu3 contents ascell array% contentsget(hObject,Value) returns selected item frompopupmenu3str=get(handles.popupmenu3,String );val=str2num(strget(handles.popupmenu3,Value );switch valend% - Executes during object creation, aft

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論