HTK & MATLAB for MAP Adaptaion
สิงหาคม 15, 2018, 07:43:54 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: HTK & MATLAB for MAP Adaptaion  (อ่าน 5375 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« เมื่อ: มิถุนายน 26, 2010, 07:40:03 pm »

HTK & MATLAB for MAP Adaptaion
เห็นว่าหัวข้อนี้ว่างมานานแสนนาน วันนี้เลยขอเขียนบทความแบบที่ทั้งคนอ่านและคนเขียนเองอ่านแล้วก็ยังไม่รู้เรื่อง!!
HTK (Hidden Markov Model Toolkit) เป็น Library หรือ Tool ที่พัฒนามาใช้ในงาน Speech Recognition ซึ่งหลายคนยกความสามารถให้เจ้า HTK เป็น Tool อันดับ 1 ในวงการ Speech Recognition ไปแล้ว
เมื่อพูดถึง HMM ((Hidden Markov Model) คงเป็นที่รู้จักกันเป็นอย่างดีในกลุ่มคนที่ศึกษาเรื่องระบบรู้จำ และแน่นอน HTK ออกแบบมาเพื่อการนี้ แต่เพื่อเป็นการเริ่มต้นที่ไม่ซับซ้อนจนเกินไปนัก ผมจะขอพูดถึงการใช้ HTK มาทำการปรับเปลี่ยน GMM (Gaussian Mixture Model) แบบ 1 Mixer โดยใช้ MATLAB เป็นตัวช่วยอีกแรง เพราะงานโดยทั่วๆ ไป MATLAB จะใช้งานง่าย และหลายคนคุ้นเคยกันเป็นอย่างดีแล้ว ในตอนนี้ MATLAB ยังไม่มีบทบาทอะไรมากนึก แต่เป็นตัวช่วยที่ดีทีเดียว โดยเฉพาะในตอนต่อๆไป (ถ้าผมมีเวลาว่างมาเขียนต่อ)

ในที่นี้สมมุติว่าผมมี GMM ของสัญญาณอะไรบางอย่างอยู่ เช่นสัญญาณเสียงพูดของนาย A แต่ Model ตัวนี้ยังไม่ดีมากนัก ความต้องการคือต้องการปรับปรุง Model นี้ให้เป็นตัวแทนของนาน A ได้มากขึ้น จึงจำเป็นต้องเอาสัญญาณเสียงของนาย A มาทำการปรับปรุง Model ของนาย A ให้มีความเป็นนาย A มาขึ้น สรุปคือต้องการทำให้ Model ดีขึ้นนั่นเอง (บอกแล้ว ว่าจะงง ทั้งคนอ่านและคนเขียน)
ขอเริ่มเลยแล้วกันนะครับ ไม่ขอกล่าวถึงที่มาที่ไป มีอะไรสงสัยค่อยถามตอบกันภายหลัง


เริ่มจาก สร้างรูปแบบของ GMM (HMM 1 State) ตามรูปแบบของ HTK ในที่นี้ใช้ Feature แบบ MFCC (Mel Frequency Cepstrum Coefficient) และมี Vector Size เท่ากับ 36 จะได้รูปแบบ Model ตั้งต้นดังนี้
Code:
 ~o <VecSize> 36 <MFCC> <StreamInfo> 1 36
<BeginHMM>
  <NumStates> 3
  <State> 2 <NumMixes> 1
  <Stream> 1
  <Mixture> 1 1.0000
    <Mean> 36
       0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
    <Variance> 36
       1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  1.0  
  <TransP> 3
     0.0   1.0   0.0
     0.0   0.6   0.4
     0.0   0.0   0.0
<EndHMM>

ต่อมาสร้างโฟลเดอร์ใหม่ชื่อ './out' โดยใช้ MATLAB เป็นตัวจัดการให้ดังนี้
Code:
out_dir = './out';
if( ~exist(out_dir, 'dir'))
    mkdir(out_dir);
end
จริงๆ แล้วจะใช้ความสามารถของ Windows เพื่อสร้างโฟลเดอร์ใหม่ก็ได้ แต่ที่ใช้ MATLAB ก็เพื่อจะปูทางไว้สำหรับระบบที่มีความซับซ้อนเพิ่มในในตอนต่อๆ ไป

ต่อไปทำการคำนวณค่า Global Mean & Variance ของ Feature ในที่นี้ Feature เป็นไฟล์ชื่อ 'xaaf.mfcc' เช่นเดิม เขียนโปรแกรมด้วย MATLAB เพื่อเรียก HCompV ของ HTK จะได้โปรแกรมดังนี้
Code:
system('HCompV -A -D -T 1 -f 0.001 -m -M ./out ./hmm ./xaaf.mfcc');
คำสั่งนี้จะทำให้ได้ไฟล์ใหม่ออกมาสองตัวอยู่ในโฟลเดอร์ ./out ไฟล์ดังกล่างชื่อ 'hmm' และ 'vFloors' ตามลำดับ
ลองเปิดดูจะเห็น:


hmm
Code:
~o
<STREAMINFO> 1 36
<VECSIZE> 36<NULLD><MFCC><DIAGC>
~h "hmm"
<BEGINHMM>
<NUMSTATES> 3
<STATE> 2
<MEAN> 36
 -5.330238e-003 1.581298e-003 -2.418144e-003 3.506306e-004 2.090746e-003 3.264680e-003 3.222598e-003 4.480761e-003 4.947196e-003 -5.097931e-004 -2.924314e-003 1.882873e-003 1.905401e-003 -4.325304e-003 6.292055e-004 1.465474e-003 -4.267580e-004 2.860336e-003 -1.095498e-005 3.260514e-003 -2.049243e-003 -1.365851e-003 -4.206038e-005 5.706672e-003 6.629142e-004 5.505272e-004 4.287171e-004 5.630443e-004 3.398878e-004 3.559515e-004 4.090413e-003 -1.152592e-003 1.080974e-003 5.243285e-003 2.853032e-003 1.116544e-004
<VARIANCE> 36
 4.026267e-001 5.692723e-001 5.709917e-001 4.682910e-001 4.755434e-001 4.881811e-001 4.702121e-001 4.084023e-001 4.385227e-001 4.028116e-001 4.310036e-001 3.911793e-001 6.198381e-001 6.553389e-001 6.620067e-001 6.160821e-001 5.296057e-001 5.682985e-001 5.593707e-001 5.320806e-001 5.078435e-001 5.133364e-001 5.116755e-001 4.971376e-001 5.628825e-001 5.905018e-001 6.147466e-001 5.698634e-001 5.145645e-001 5.431175e-001 5.408581e-001 5.091358e-001 4.988042e-001 5.063443e-001 5.029449e-001 4.960520e-001
<GCONST> 4.234404e+001
<TRANSP> 3
 0.000000e+000 1.000000e+000 0.000000e+000
 0.000000e+000 6.000000e-001 4.000000e-001
 0.000000e+000 0.000000e+000 0.000000e+000
<ENDHMM>

vFloors
Code:
~v varFloor1
<Variance> 36
 4.026267e-004 5.692723e-004 5.709917e-004 4.682911e-004 4.755434e-004 4.881812e-004 4.702121e-004 4.084024e-004 4.385227e-004 4.028116e-004 4.310036e-004 3.911793e-004 6.198381e-004 6.553390e-004 6.620067e-004 6.160822e-004 5.296058e-004 5.682986e-004 5.593707e-004 5.320806e-004 5.078435e-004 5.133364e-004 5.116755e-004 4.971377e-004 5.628826e-004 5.905019e-004 6.147466e-004 5.698635e-004 5.145645e-004 5.431175e-004 5.408582e-004 5.091358e-004 4.988041e-004 5.063443e-004 5.029449e-004 4.960520e-004


พื่อให้สามารถนำ hmm และ vFloors ไปใช้ในการทำ MAP Adaptation ได้ง่ายๆ ต่อไป จะทำการรวม hmm และ vFloors เข้าด้วยกันตามรูปแบบที่ได้กำหนดไว้ใน HTK ยังคงใช้ MATLAB เป็นตัวทำหน้าที่นี้ โปรแกรมส่วนนี้ว่ากันด้วยการจักดารกับ text file ธรรมดา
Code:
fv = 'out/vFloors';     % vFloors name
fh = 'out/hmm';         % hmm name
fn = 'out/newMacro';    % newMacro name

fptr_fn = fopen(fn, 'w');
fptr_fv = fopen(fv);
fptr_fh = fopen(fh);

%--- Write 3 lines of hmm file to newMacro
for i=1:3
    s = fgetl(fptr_fh);
    fprintf(fptr_fn, '%s\n', s);
end

%--- Write all lins (3 lines) of vFloors to newMacro
while 1
    s = fgetl(fptr_fv);
    if ~ischar(s),break; end
    fprintf(fptr_fn, '%s\n', s);
end

%--- Write all lins hmm to newMacro
while 1
    s = fgetl(fptr_fh);
    if ~ischar(s),break; end
    fprintf(fptr_fn, '%s\n', s);
end

fclose(fptr_fh);
fclose(fptr_fv);
fclose(fptr_fn);

ผลที่ได้คือการนำ hmm และ vFloors มารวมเป็นไฟล์เดียวกันแล้ว save เป็นไฟล์ใหม่ชื่อ newMacro และ save อยู่ในโฟลเดอร์ ./out รายละเอียดเป็นดังนี้

Code:
~o
<STREAMINFO> 1 36
<VECSIZE> 36<NULLD><MFCC><DIAGC>
~v varFloor1
<Variance> 36
 4.026267e-004 5.692723e-004 5.709917e-004 4.682911e-004 4.755434e-004 4.881812e-004 4.702121e-004 4.084024e-004 4.385227e-004 4.028116e-004 4.310036e-004 3.911793e-004 6.198381e-004 6.553390e-004 6.620067e-004 6.160822e-004 5.296058e-004 5.682986e-004 5.593707e-004 5.320806e-004 5.078435e-004 5.133364e-004 5.116755e-004 4.971377e-004 5.628826e-004 5.905019e-004 6.147466e-004 5.698635e-004 5.145645e-004 5.431175e-004 5.408582e-004 5.091358e-004 4.988041e-004 5.063443e-004 5.029449e-004 4.960520e-004
~h "hmm"
<BEGINHMM>
<NUMSTATES> 3
<STATE> 2
<MEAN> 36
 -5.330238e-003 1.581298e-003 -2.418144e-003 3.506306e-004 2.090746e-003 3.264680e-003 3.222598e-003 4.480761e-003 4.947196e-003 -5.097931e-004 -2.924314e-003 1.882873e-003 1.905401e-003 -4.325304e-003 6.292055e-004 1.465474e-003 -4.267580e-004 2.860336e-003 -1.095498e-005 3.260514e-003 -2.049243e-003 -1.365851e-003 -4.206038e-005 5.706672e-003 6.629142e-004 5.505272e-004 4.287171e-004 5.630443e-004 3.398878e-004 3.559515e-004 4.090413e-003 -1.152592e-003 1.080974e-003 5.243285e-003 2.853032e-003 1.116544e-004
<VARIANCE> 36
 4.026267e-001 5.692723e-001 5.709917e-001 4.682910e-001 4.755434e-001 4.881811e-001 4.702121e-001 4.084023e-001 4.385227e-001 4.028116e-001 4.310036e-001 3.911793e-001 6.198381e-001 6.553389e-001 6.620067e-001 6.160821e-001 5.296057e-001 5.682985e-001 5.593707e-001 5.320806e-001 5.078435e-001 5.133364e-001 5.116755e-001 4.971376e-001 5.628825e-001 5.905018e-001 6.147466e-001 5.698634e-001 5.145645e-001 5.431175e-001 5.408581e-001 5.091358e-001 4.988042e-001 5.063443e-001 5.029449e-001 4.960520e-001
<GCONST> 4.234404e+001
<TRANSP> 3
 0.000000e+000 1.000000e+000 0.000000e+000
 0.000000e+000 6.000000e-001 4.000000e-001
 0.000000e+000 0.000000e+000 0.000000e+000
<ENDHMM>

สุดท้ายคือการทำ MAP
Code:
system('HERest -T 1 -A -D -I ./gmm.mlf -H ./out/newMacro -M out1 -u mp ./hmmlist ./xaag.mfcc');
โดยทั่วไปขั้นตอนนี่จะทำซ้ำไปจนกว่าจะมี Error น้อยๆ ในทางปฎิบัติจะทำซ้ำกันประมาฯ 3-10 ครั้งถือว่าเพียงพอ
จะได้โมเดลใหม่ขึ้นมา
Code:
~o
<STREAMINFO> 1 36
<VECSIZE> 36<NULLD><MFCC><DIAGC>
~v "varFloor1"
<VARIANCE> 36
 4.026267e-004 5.692723e-004 5.709917e-004 4.682911e-004 4.755434e-004 4.881812e-004 4.702121e-004 4.084024e-004 4.385227e-004 4.028116e-004 4.310036e-004 3.911793e-004 6.198381e-004 6.553390e-004 6.620067e-004 6.160822e-004 5.296058e-004 5.682986e-004 5.593707e-004 5.320806e-004 5.078435e-004 5.133364e-004 5.116755e-004 4.971377e-004 5.628826e-004 5.905019e-004 6.147466e-004 5.698635e-004 5.145645e-004 5.431175e-004 5.408582e-004 5.091358e-004 4.988041e-004 5.063443e-004 5.029449e-004 4.960520e-004
~h "hmm"
<BEGINHMM>
<NUMSTATES> 3
<STATE> 2
<MEAN> 36
 -4.355524e-004 1.463175e-003 1.382951e-003 -3.825639e-004 7.996631e-004 -1.251449e-003 -1.539200e-003 -1.066792e-004 1.141252e-003 1.242759e-003 6.394124e-005 -4.958967e-005 -5.287239e-004 -2.110279e-004 -1.015473e-003 8.834190e-004 3.735593e-004 3.495744e-004 -5.348949e-004 3.120338e-005 -4.560361e-004 -1.431172e-003 8.658826e-004 -6.813096e-004 -4.893670e-004 -8.035931e-005 -2.933017e-004 1.485045e-003 3.803502e-004 1.234256e-003 9.253621e-004 1.159658e-004 -5.486779e-004 -3.303665e-004 3.042367e-004 5.904084e-004
<VARIANCE> 36
 4.026267e-001 5.692723e-001 5.709917e-001 4.682910e-001 4.755434e-001 4.881811e-001 4.702121e-001 4.084023e-001 4.385227e-001 4.028116e-001 4.310036e-001 3.911793e-001 6.198381e-001 6.553389e-001 6.620067e-001 6.160821e-001 5.296057e-001 5.682985e-001 5.593707e-001 5.320806e-001 5.078435e-001 5.133364e-001 5.116755e-001 4.971376e-001 5.628825e-001 5.905018e-001 6.147466e-001 5.698634e-001 5.145645e-001 5.431175e-001 5.408581e-001 5.091358e-001 4.988042e-001 5.063443e-001 5.029449e-001 4.960520e-001
<GCONST> 4.234404e+001
<TRANSP> 3
 0.000000e+000 1.000000e+000 0.000000e+000
 0.000000e+000 6.000000e-001 4.000000e-001
 0.000000e+000 0.000000e+000 0.000000e+000
<ENDHMM>
ตอนนี้ก็ได้โมเดลใหม่ที่ดีขึ้นแล้วอย่างง่ายดาย


ใครที่อ่านสิ่งที่ผมเขียนไปแล้วเข้าใจเกินครึ่ง ผมมั่นใจว่าคุณจะเข้าใจด้วยว่า "หลายอย่างไม่สามารถอธิบายเป็นคำพูดและตัวอักษรได้"
เง้อ... เขียนบทความแนวนี้ อึดอัดครับ (-.-)" เอาเป็นว่ามีอะไรก็ถามได้นะครับจะพยายามตอบ

บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: