Hình 4.9: Sơ đồ khối hàm Framming Windowing
Ngõ ra của chương trình là các frame âm thanh đư được cửa sổ hóa. Tín hiệu sẽ được chuyển sang giai đoạn phân tích phổ FFT.
4.4.1.3 FFT
Hàm biến đổi Fourier nhanh FFT 256 điểm, sử dụng sơ đồcánh bướm Butterfly 8 tầng, mỗi tầng gồm 2 giai đoạn:
- Tính toán hệ số Twiddle: for ( j= 0; j<n2; j++) { a = j*e;
c = (float) cos(a); s = (float) sin(a); s = (float) sin(a);
- Thực hiện Butterfly cho 256 mẫu : for (i=j; i<n; i+= n1) { l = i+n2;
xt = input_data->data[row_index][i].real - input_data->data[row_index][l].real;
input_data->data[row_index][i].real = input_data->data[row_index][i].real+input_data->data[row_index][l].real;
yt = input_data->data[row_index][i].imag - input_data->data[row_index][l].imag;
input_data->data[row_index][i].imag = input_data->data[row_index][i].imag+input_data->data[row_index][l].imag;
input_data->data[row_index][l].real = c*xt + s*yt;
input_data->data[row_index][l].imag = c*yt - s*yt;
}
Sau đó chuỗi dữ liệu được tiến hành đảo bit:
for ( i=0; i<n-1; i++) {
if (i<j) {
xt = input_data->data[row_index][j].real;
input_data->data[row_index][j].real = input_data- >data[row_index][i].real;
62
input_data->data[row_index][i].real = xt; yt = input_data->data[row_index][j].imag;
input_data->data[row_index][j].imag = input_data- >data[row_index][i].imag;
input_data->data[row_index][i].imag = yt; }
}
Dữ liệu ngõ ra la ma trận 100x256 biểu diễn phổ tín hiệu âm thanh ở miền tần số. Dữ liệu này bao gồm phần thực và phần ảo của biến đổi FFT.
4.4.1.4 Power spectrum
Tín hiệu sau khi biển đổi FFT sẽ được lấy phổ công suất thông qua hàm power_spectrum. Hàm power_spectrum sẽ lấy tổng bình phương phần thực và phần ảo của phổ tín hiệu.
input_data->data[i][j].real = ((input_data->data[i][j].real)*(input_data- >data[i][j].real))+ ((input_data->data[i][j].imag)*(input_data-
>data[i][j].imag));
Phổ công suất thu được sẽ là giá trị thực được lưu lại dưới dạng ma trận 100x256. Dữ liệu lưu được dưới dạng float 32bit.
63
4.4.1.5 Mel frequency spectrum
Chương trình mel_freq_spectrum sẽ tính toán phổ tần số Mel của tín hiệu. Ngõ vào sẽ là địa chỉ của cấu trúc có dữ liệu sau khi tính toán công suất phổ tín hiệu và địa chỉ cấu trúc đểlưu trữ phổ tần số Mel.
Phổ tần sốMel được tính bằng cách nhân phổ tín hiệu với các bộ lọc tam giác được thiết kế theo thang tần số Mel. Nếu „f‟ là tần số Hz, tần số Mel của f được tính bởi công thức: B(f)=2595 log(1+f/700) mel (4.1)
Và nếu „m‟ là tần số Mel, tần sốHz được tính bởi công thức ngược lại B-1(m)=700 10(m/1125)– 700 Hz (4.2)
Để xây dựng được các bộ lọc băng ta cần xác định điểm biên để xác định hàm truyền của các bộ lọc tam giác theo công thức:
f(m) = N B^-1(B(fl)+m(1/21 B(fh) – 1/21 B(fl)))/fs (4.3) Với fs là tần số lấy mẫu, trong luận văn này fs = 8Khz
fh là tần số cắt dưới, với tần số lấy mẫu 8Khz ta có fh = fs/2 = 4Khz fl là tần số cắt trên, với tần số lấy mẫu 8Khz ta có fl = fs/256 =31.25Hz. N là tổng số mẫu, trong luận văn này giá trị này bằng 256
m là số thứ tự của các bộ lọc, trong luận văn này 0<m<21
Sau khi tính toán điểm biên hàm truyền của các bộ lọc tam giác được tính toán như sau :
H_m(k) = 0 ; nếu k<f(m-1)
= (k-f(m-1))/(f(m) – f(m-1)); nếu f(m-1)<= k <=f(m) = (f(m+1)-k)/(f(m+1)-f(m)); nếu f(m) <=k<=f(m+1) (4.4)
= 0; nếu k > f(m+1)
Với m ký hiệu là số thứ tự của bộ lọc và f(m) ký hiệu điểm biên và k ký hiệu số thứ tự mẫu. Hàm truyền được tính toán như trên cho các bộ lọc dạng tam giác.
(Có thể tham khảo cách tính này trong tài liệu Improved Text-independent Speaker Identification using fused MFCC&IMFCC feature sets based on Gaussian Filter – Sandipan Chakroborty và Goutam Saha).
64
Trong chương trình các điểm biên của bộ lọc băng sẽ được tính toán trước để giảm khối lượng tính toán của chương trình. Các giá trị này được lưu trong file filter_edge.h float H[Number_Of_Filters+2] = { 0.0,2.349535731,4.945514224,7.813784877,10.98290838, 14.48444125,18.35324982,22.62785770,27.35082918, 32.56919306,38.33491098,44.70539514,51.74407917, 59.52105066,68.11374874,77.60773478,88.09754483, 99.68763091,112.4934010,126.6423682,142.2754203,0.0 };
Lúc này dữ liệu sau khi qua các bộ lọc tam giác thang tần số Mel sẽ là ma trận 100x20 với số cột là số của bộ lọc được sử dụng. Trong luận văn này tổi sử dụng 20 bộ lọc tam giác thang tần sô Mel. Như trong các tài liệu tham khảo đính kèm, ở đây ta có thể sử dụng các loại bộ lọc khác như bộ lọc Gaussian để tính toán các hệ số cepstral tần số Mel.
Như hình dưới, dữ liệu sau khi tính toán sẽ được lưu trong biến coeff là một ma trận 100 hàng 20 cột, mỗi phần tử là một số dạng float 32bit biểu thị năng lượng phổ công suất ứng với bộ lọc tương ứng.
65
Hình 4.11: Dữ liệu sau khi được tính toán qua cac bộ lọc tam giác thang tần sô Mel. 4.4.1.6 Log energy
Tín hiệu sau đó được lấy log năng lượng thông qua hàm log_energy :
for ( i=0; i<row_length; i++) { /* Thuc hien tren tat ca frame (100 frame)) */
for ( j=0; j<Number_Of_Filters; j++ ) { /* Thuc hien tren tat ca bo loc (20 bo loc)*/
co_eff->data[i][j] = (float) log((double) co_eff->data[i][j]); /* Tinh toan log cua he so */
}
}
66
4.4.1.7 Biến đổi Cosine rời rạc DCT:
DCT có chức năng tương tự như IFFT, nhưng hiệu quả hơn do sử dụng số thực. Có nhiều công thức tính DCT, có thể tham khảo thêm tại địa chỉ http://en.wikipedia.org/wiki/Discrete_Cosine_Transform. Công thức thường dùng nhất ởđây là công thức dưới đây.
p P K p k S C K k nk np log cos 0.5 , 1,2,..., 1 ' (4.5) Với K là số bộ lọc ' nk
S là phổ công suất tín hiệu theo thang tần số Mel n là số thứ tự frame
P là số hệ số cepstrum cần sử dụng cho huấn luyện và nhận dạng p là số thứ tự hệ số cepstrum
Kết quả sau bước này, ta có tín hiệu được gọi là Acoustic vector, mang đặc trưng của giọng nói thu được. Hình dạng Acoustic vector của 1 frame như sau:
67
Hình 4. 13: Acoustic vector của 20 frame liên tiếp.
Đến đây, ta đư thu được đặc trưng của tiếng nói thu được, là một chuỗi các acoustic vector của các frame liên tiếp nhau. Các acoustic vector này sẽđược dùng để huấn luyện và nhận dạng giọng nói.
Như đư trình bày trong phần lý thuyết, ta chỉ cần lấy các hệ số đầu tiên trong các acoustic vector, trong luận văn này tôi lấy 12 hệ số.
Hình dưới mô tả dữ liệu biến đổi cosine rời rạc được lưu trữ trong biến mfcc_ct dưới dạng ma trận 100x20, mỗi phần tử là số float 32bit.
68
Hình 4.14 : Dữ liệu sau khi tính toán biến đổi Cosine rời rạc 4.4.1.8 Lượng tử vector VQ:
Bước cuối cùng và cũng là bước quan trọng không thể thiếu trong chương trình là thực hiện phân nhóm xây dựng tập mẫu bằng phương pháp lượng tử vector VQ.
Hàm vector_quantization tạo tập huấn luyện Codebook cho mỗi từ cần huấn luyện. Ngõ vào là địa chỉ cấu trúc dữ liệu mfcc_ct chứa dữ liệu đư biến đổi
69
cosine rời rac, ngõ ra là địa chỉ cấu trúc dữ liệu cb chứa dữ liệu Codebook của từ cần huấn luyện.
Trong luận văn này tôi sử dụng Codebook cho mỗi từ cần nhận dạng với kích thước 32 vector chứa các hệ số MFCC. Thuật toán tạo chùm được sử dụng trong chương trình là thuật toán LBG được tóm tắt như sau:
1. Khởi tạo 1 vector codebook, là trung tâm của tất cả các acoustic vector thu nhận được từ phần trước. Trong chương trình giá trị này được tính toán như giá trị trung bình của tất cả các frame để sử dụng làm codeword đầu tiên của codebook.
2. Nhân đôi kích thước của codebook bằng cách chia đôi codebook hiện hành y n theo quy tắc sau:
y +n = y n ( 1 + ε ) y -n = y n ( 1 - ε )
Với các n = 1 … (kích thước của codebook).
ε: hệ số chia. Trong luận văn này ε = 0.001.
3. Nearest Neighbor Search: với các vector huấn luyện, ởđây là acoustic vector, tìm các codeworld trong codebook hiện thời gần với nó nhất ( theo khoảng cách Euclid ), xắp xếp các vector này vào trong các cell tương ứng.
for(i=0;i<row_length;++i){ j=0;
dist2=0.0;
for(k=0;k<Number_Of_Filters;++k) {
dist2+=(data->data[i][k]- yy->codebook[j][k])*(data- >data[i][k]-yy->codebook[j][k]);
/*Tong binh phuong sai so cua frame dang xet voi codeword 1*/
} index=0; index=0;
for(j=1;j<mtemp;++j){
//tim gia tri meo nho nhat cua frame dang xet voi codebook luu trong dist2 dist1=0.0;
for(k=0;k<Number_Of_Filters;++k)
dist1+=(data->data[i][k]-yy->codebook[j][k])*(data->data[i][k]- yy->codebook[j][k]);
if(dist1 < dist2){
dist2=dist1; //Cap nhat gia tri meo nho nhat index=j;
//luu chi so codeword phu hop nhat voi frame dang xet }
}
++bin[index];
70
for(k=0;k<Number_Of_Filters;++k) codebk[index][k]+=data->data[i][k]; //cong don cac frame gan giong nhat
totd1=totd1+dist2;
//cong don gia tri meo nho nhat cua cac frame doi voi codebook } /* ket thuc khi i>=row_length */
4. Centroid Update: cập nhật codeworld trong mỗi cell ởbước 3, dùng centroid của mỗi acoustic vector tương ứng với cell đó, thông thường nhất là dùng trung bình cộng các acoustic vector của cell đó.
for(j=0;j<mtemp;++j){ //cap nhat lai codebook if(bin[j] > 0) {
for(k=0;k<Number_Of_Filters;++k){ codebk[j][k]/=(float) bin[j]; yy->codebook[j][k]=codebk[j][k]; }
} } }
5. Lặp lại bước 3 & 4 cho đến khi khoảng cách trung bình nhỏhơn ngưỡng cho trước. Trong luận văn này ngưỡng được thiết lập bằng độ giảm của tổng bình phương sai số của lần cập nhật codebook sau so với lần cập nhật codebook trước nhỏhơn 1000 lần.
6. Lặp lại bước 2, 3 & 4 cho đến khi kích thước của codebook đến giá trị mong muốn.
71
Hình 4.15: Sơ đồ khối giải thuật của thuật toán LBG sử dụng trong chương trình. Hình dưới mô tả dữ liệu codebook của từ cần huấn luyện thu được sau khi tính toán. Dữ liệu này gồm một ma trận có chiều 32x20, mỗi phần tử là số float 32bit. Hay nói cách khác tập dữ liệu là một codebook bao gồm 32 codeword và đặc trưng cho từ cần huấn luyện.
72
Hình 4.16: Dữ liệu codebook của từ cần huấn luyện sau khi tính toán
Dữ liệu lúc này là codebook có kích thước 16x12 sẽđược chèn thêm các hệ sốnăng lượng đư tính từ trước và các hệ số delta , delta_delta để được Codebook có kích thước 16x39. Để tính hệ số delta dt, dùng các vectơ hệ số dừng từ Ctn đến Ctn , với Ctlà vectơ bao gồm log năng lượng và 12 hệ số cepstral của frame thứ n
N n N n t n t n t n c c n d 1 2 1 2 ) (
73
Dữ liệu này sau đó sẽđược lưu lại dưới dạng file .DAT để có thể sử dụng cho quá trình nhận dạng.
fptr = fopen("train_vect.dat","w");
fprintf(fptr, "{");
for (i=0;i < size_cbook;i++ ){
fprintf(fptr, "{");
for ( j = 0; j < Number_Of_Filters ; j++) { if ( j == (Number_Of_Filters-1) ) {
fprintf(fptr, "%f},\n ",cb.codebook[i][j]); } else {
fprintf(fptr, "%f, ",cb.codebook[i][j]); } } } fprintf(fptr,"};"); fclose(fptr); } 4.4.2 Nhận dạng
Trong chương trình nhận dạng speaker_recognition, quá trình xử lý tín hiệu âm thanh thu được diễn ra tương tựnhư quá trình huấn luyện. Gồm quá trình trích đặc trưng tín hiệu, trong đó các hệ sốMFCC được tách ra cho mỗi từ cần nhận dạng. Các hệ số này được lưu trữ dưới dạng ma trận 100x20, mỗi phần tử là số float 32bit. Quá trình nhận dạng dựa vào khoảng cach (sai số) Euclidean.
Tính toán khoảng cách Euclidean cũng tương tự như quá trình tạo chùm, phân nhóm trong thuật toán LBG áp dụng trong phần huấn luyện. Việc tính toán được thực hiện trên các vector trích đặc trưng của tín hiệu âm thanh cần nhận dạng với 10 codebook tương ứng với 10 từđư huấn luyện. Kết quả là từđược nhận dạng với vector huấn luyện của từ nào có khoảng cách Euclidean nhỏ nhất.
for ( i=0; i<Number_Of_Speakers; i++ ) { /* Tong so tu duoc luu */ distance = 0.0;
/* Khoi tao sai so bang 0 */
for ( j=0; j<Number_Of_Coefficients; j++ ) { /* So he so duoc luu cua vector huan luyen*/
/* Tinh toan sai so Euclidean */
distance = distance + ((mfcc_vector[j]- training_vector[i][j])*(mfcc_vector[j]-training_vector[i][j]));
}
/* Nhan dang tu noi voi sai so nho nhat */
if ( distance < ref_distance ) { /* Kiem tra neu sai so nho hon sai so truoc do */
speaker = i+1;