Danh sách các thành viên ghi âm
Bảng 11 Danh sách thành viên ghi âm
STT Họ và tên Giới tính Địa chỉ
1. Nguyễn Thị Ánh Nữ Đông Hưng, Thái Bình
2. Phí Trung Đức Nam Đông Hưng, Thái Bình
3. Nguyễn Văn Đức Nam Hải Hậu, Nam Định
4. Trần Hoàng Giang Nam Hải Hậu, Nam Định
5. Phạm Xuân Hào Nam Xuân Trường, Nam Định
6. Nguyễn Thế Hưng Nam Xuân Trường, Nam Định
7. Phí Văn Hưng Nam Đông Hưng, Thái Bình
8. Tống Ngọc Huy Nam Đông Hưng, Thái Bình
9. Phạm Văn Khánh Nam Đông Hưng, Thái Bình
10. Phạm Văn Lịch Nam Xuân Trường, Nam Định
11. Phí Thị Thùy Linh Nữ Đông Hưng, Thái Bình 12. Nguyễn Thị Minh Thu Nữ Hải Hậu, Nam Định
13. Nguyễn Thị Thu Nữ Hải Hậu, Nam Định
14. Nguyễn Thị Vân Anh Nữ Hưng Hà, Thái Bình 15. Phạm Thị Hoài Thương Nữ Xuân Trường, Nam Định
16. Đinh Thái Sơn Nam Xuân Trường, Nam Định
17. Phạm Thị Thu Hiền Nữ Xuân Trường, Nam Định
18. Phạm Văn Hoàng Nam Thanh Hóa
19. Nguyễn Thị Thơm Nữ Xuân Trường, Nam Định 20. Nguyễn Thị Trang Nữ Kỳ Anh, Hà Tĩnh
21. Phạm Tuấn Anh Nam Thanh Hóa
Tổng cộng Nam 11
Nữ 9
4.4.3. Phƣơng pháp ghi âm
Mỗi thành viên tham gia ghi âm thực hiện các bước sau đây:
- Thành viên tham gia ghi âm đọc liên tục 30 từ cần nhận dạng, mỗi từ cách nhau một khoảng lặng phục vụ cho việc cắt file ghi âm dễ dàng sau này. - Mỗi lần ghi âm lưu thành mỗi file wave khác nhau
- Các file ghi âm có định dạng Mono, 16 bit, tần số 44100 Hz. Chúng ta có thể cấu hình Cool Edit Pro 2.0 như hình dưới đây:
51
Hình 22 Cấu hình file ghi âm
Với mỗi thành viên tham gia ghi âm, ta có mội kết quả tương tự như dưới đây:
Hình 23 Kết quả ghi âm Cool Edit Pro
4.4.4. Kết quả ghi âm
52
Bảng 12 Kết quả ghi âm
STT Họ và tên Giới tính Tuổi Số lần ghi âm
1. Nguyễn Thị Ánh Nữ 19 30
2. Phí Trung Đức Nam 21 30
3. Nguyễn Văn Đức Nam 21 30
4. Trần Hoàng Giang Nam 26 30
5. Phạm Xuân Hào Nam 26 30
6. Nguyễn Thế Hưng Nam 24 30
7. Phí Văn Hưng Nam 20 30
8. Tống Ngọc Huy Nam 20 30
9. Phạm Văn Khánh Nam 21 30
10. Phạm Văn Lịch Nam 24 30
11. Phí Thị Thùy Linh Nữ 24 30
12. Nguyễn Thị Minh Thu Nữ 26 30
13. Nguyễn Thị Thu Nữ 21 30
14. Nguyễn Thị Vân Anh Nữ 24 30
15. Phạm Thị Hoài Thương Nữ 24 30
16. Đinh Thái Sơn Nam 29 30
17. Phạm Thị Thu Hiền Nữ 28 30
18. Phạm Văn Hoàng Nam 21 30
19. Nguyễn Thị Thơm Nữ 21 30
20. Nguyễn Thị Trang Nữ 21 30
21. Phạm Tuấn Anh Nam 21 30
Tổng cộng 456
4.4.5. Cắt file ghi âm thành
Để có thể đưa vào huấn luyện, các file ghi âm 30 từ liên tục cần được tác ra thành các file chứa các từ liên tục. Công cụ Cool Edit Pro 2.0 tiếp tục được sử dụng để làm công việc này. Ví dụ dưới đây thể hiện dạng sóng của từ “Hóa đơn” được cắt ra từ file wav đọc liên tiếp 30 từ:
53
Hình 24 Dạng sóng của từ "Hóa Đơn"
Mỗi file ghi âm sẽ được tách thành 30 từ tương ứng với tên file được đặt như hình dưới đây nhằm phục vụ quá trình huấn luyện sau này được dễ dàng:
54
Với mỗi người tham gia ghi âm, sua khi cắt 30 file ghi âm ta thu được các thư mục chứa file ghi âm với cấu trúc như sau nhằm tạo thuận lợi cho quá trình quản lý và huấn luyện mô hình âm học sau này:
Hình 26 Cấu trúc thư mục sau khi cắt 30 file sau ghi âm của một thành viên
4.5. Huấn luyện mô hình âm học
Để có thể huẩn luyện mô hình âm học, ta cần các công cụ sau - Python 2.7.5
- Active Perl - SphinxTrain
Cấu trúc file để xây dựng cơ sở dữ liệu cho việc nhận dạng tiếng nói có dạng như sau: Etc – Thư mục cấu hình
- Lenh.dic - Phonetic dictionary - Lenh.phone - Phoneset file
- Lenh.lm.DMP – Mô hình ngôn ngữ - Lenh.filler – Danh sách tạp âm
- Lenh _train.fileids – Danh sách các file huấn luyện
- Lenh _train.transcription – Danh sách các câu dành cho huấn luyện - Lenh _test.fileids – Danh sách các file cho kiểm thử
55 Wav- Thư mục chứa file ghi âm
- Người nói _1
o file_1.wav - Recording of speech utterance - người nói_2
o file_2.wav
Trước khi bắt đầu huấn luyện, ta cần xây dựng một cơ sở dữ liệu như trên. - Từ điển âm học được sinh ra tại mục 4.3: Lenh.dic
- File Phoneset: là tập các âm xuất hiện trong từ điển âm học và âm SIL. Để đơn giản hóa quá trình tạo lập file phoneset, tôi đã xây dựng chương trình hxgenphone nhằm xây dựng file phoneset từ một từ điển âm học có sẵn. Ta thực hiện lệnh sau để xây dựng phoneset:
Hxgenphone Lenh.dic Lenh.phone
Kết quả ta thu được file phoneset có nội dung như sau:
Bảng 13 File Phoneset A B C D E G H I K L M N O P Q R S SIL T U V X Y
56
- Mô hình ngôn ngữ được xây dựng tại mục 4.2 ta thu được file Lenh.gram và Lenh.lm.DMP
- File tạp âm: Lenh.filler chứa các âm không phải là ngôn ngữ như tiếng thở, tiếng cười…, Lệnh.filler nội dung như sau:
Bảng 14 File tạp âm
<s> SIL </s> SIL <sil> SIL
Để nhanh chóng sinh ra file tạp âm chúng ta sử dụng lệnh
hxgenfiller Lenh.filler
- Các file transcription được sinh ra nhờ các lệnh sau:
hxgentranscription Lenh.txt Users.txt Lenh_train.transcription hxgentranscription Lenh.txt TestUsers.txt Lenh _test.transcription hxgenfileids Lenh.txt Users.txt Lenh _train.fileids
hxgenfileids Lenh.txt TestUsers.txt Lenh _test.fileids
Trong đó các chương trình hxgentranscription, hxgenfileids được xây dựng bởi tác giả nhằm đơn giản hóa cách thức xây dựng transcription và file id. Các chương trình này được xây dựng sử dụng ngôn ngữ lập trình C# và .NET Framework 3.5. Do đó để thực thi, môi trường phải hỗ trợ các nền tảng này. .NET Framework có thể dễ dàng cài đặt trên hệ điều hành Windows. Trên môi trường Linux, ví dụ Ubuntu, để có thể thực thi các chương trình này, các gói thư viện MONO cần phải được cài đặt trước.
File Users.txt liệt kê danh sách các thư mục chứa file wave tham gia huấn luyện, Users.txt có nội dung tương tự như sau:
57
Hình 27 Nội dung file Users.txt
File TestUsers.txt liệt kê danh sách các thư mục tham gia quá trình giải mã, TestUsers.txt có nội dung như sau:
Hình 28 Nội dung file TestUsers.txt
58 - Khởi tạo cấu hình huấn luyện (Windows)
python ../sphinxtrain/scripts/sphinxtrain -t Lenh setup
Sau khi lệnh trên được thực hiện thành công, thư mục etc sẽ được khởi tạo cùng với file cấu hình các tham số huấn luyện: sphinx_train.cfg. Các thông số quan trọng trong file cấu hình có thể được thay đổi để phù hợp với yêu cầu của chương trình.
Tham số định dạng file ghi âm:
Với mô hình đang xây dựng, chúng ta sử dụng định dạng wav
Bảng 15 Tham số định dạng file ghi âm
# Audio waveform and feature file information
$CFG_WAVFILES_DIR = "$CFG_BASE_DIR/wav"; $CFG_WAVFILE_EXTENSION = 'wav';
$CFG_WAVFILE_TYPE = 'mswav'; # one of nist, mswav, raw $CFG_FEATFILES_DIR = "$CFG_BASE_DIR/feat";
$CFG_FEATFILE_EXTENSION = 'mfc'; $CFG_VECTOR_LENGTH = 13;
Tham số cấu hình file: đường dẫn đến các file filler, transcription, fileids, mô hình ngôn ngữ…
Bảng 16 Tham số cấu hình file
# Variables used in main training of models
$CFG_DICTIONARY = "$CFG_LIST_DIR/$CFG_DB_NAME.dic"; $CFG_RAWPHONEFILE = "$CFG_LIST_DIR/$CFG_DB_NAME.phone"; $CFG_FILLERDICT = "$CFG_LIST_DIR/$CFG_DB_NAME.filler"; $CFG_LISTOFFILES = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.fileids"; $CFG_TRANSCRIPTFILE = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.transcription" Tham số kiểu mô hình và tham số mô hình:
Mô hình chúng ta đang huấn luyện là mô hình liên tục, do đó cấu hình được lựa chọn là .cont
Bảng 17 Tham số kiểu mô hình và tham số mô hình
59
$CFG_HMM_TYPE = '.cont.'; # Sphinx 4, PocketSphinx #$CFG_HMM_TYPE = '.semi.'; # PocketSphinx
#$CFG_HMM_TYPE = '.ptm.'; # PocketSphinx (larger data sets) Tham số đặc trưng âm thanh:
Bảng 18 Tham số đặc trưng âm thanh
# Feature extraction parameters
$CFG_WAVFILE_SRATE = 16000.0;
$CFG_NUM_FILT = 40; # For wideband speech it's 40, for telephone 8khz reasonable value is 31
$CFG_LO_FILT = 200; # For telephone 8kHz speech value is 200 $CFG_HI_FILT = 3500; # For telephone 8kHz speech value is 3500 Các tham số cho quá trình huấn luyện:
Bảng 19 Tham số quá trình huấn luyện
# Variables used in main training of models
$CFG_DICTIONARY = "$CFG_LIST_DIR/$CFG_DB_NAME.dic"; $CFG_RAWPHONEFILE = "$CFG_LIST_DIR/$CFG_DB_NAME.phone"; $CFG_FILLERDICT = "$CFG_LIST_DIR/$CFG_DB_NAME.filler"; $CFG_LISTOFFILES = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.fileids"; $CFG_TRANSCRIPTFILE = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.transcription"; $CFG_FEATPARAMS = "$CFG_LIST_DIR/feat.params"; Cấu hình tham số giải mã:
Bảng 20 Tham số giải mã
# Variables used in main training of models
$CFG_DICTIONARY = "$CFG_LIST_DIR/$CFG_DB_NAME.dic"; $DEC_CFG_DICTIONARY = "$CFG_BASE_DIR/etc/$CFG_DB_NAME.dic"; $DEC_CFG_FILLERDICT = "$CFG_BASE_DIR/etc/$CFG_DB_NAME.filler"; $DEC_CFG_LISTOFFILES = "$CFG_BASE_DIR/etc/${CFG_DB_NAME}_test.fileids"; $DEC_CFG_TRANSCRIPTFILE = "$CFG_BASE_DIR/etc/${CFG_DB_NAME}_test.transcription"; $DEC_CFG_RESULT_DIR = "$CFG_BASE_DIR/result";
60
- Huấn luyện: sau khi cài đặt các tham số phù hợp, ta tiến hành huấn luyện
python ../sphinxtrain/scripts/sphinxtrain run
Hình 29 Huấn luyện
Kết quả huấn luyện được lưu trong thư mục model_params/Lenh.cd_cont_200 với nội dung như sau:
Hình 30 Kết quả huấn luyện
Chúng ta có thể thực nhiện nhanh các bước trên băng cách thực hiện lần lượt các script được viết sẵn: clear.bat, gen_predata.bat, train.bat
61 Sơ đồ khối và nội dung file clear.bat
Bảng 21 Nội dung file clear.bat
set project=Lenh set base=Z:\Dropbox\LuanVan\HuanLuyen\ set tools=%base%SphinxTools\ set sphinxtrain=%base%\SphinxTrain\ set hxutils=%base%\HxUtils\ del %project%.arpa del %project%.dic del %project%.filler del %project%.html del %project%.idngram del %project%.lm.DMP del %project%.phone del %project%.vocab del %project%_test.fileids del %project%_test.transcription Bắt đầu
Thiết lập biến môi trường
Xóa dữ liệu huấn luyện cũ
Kết thúc
62 del %project%_train.fileids del %project%_train.fileids del %project%_train.transcription rmdir /Q /S bwaccumdir rmdir /Q /S etc rmdir /Q /S feat rmdir /Q /S logdir rmdir /Q /S model_architecture rmdir /Q /S model_parameters rmdir /Q /S qmanager rmdir /Q /S result rmdir /Q /S trees
63 Bắt đầu
Thiết lập biến môi trường
Xóa dữ liệu huấn luyện cũ
Sinh dữ liệu từ vựng
Sinh dữ liệu ngữ pháp
Sinh các file transcription & cấu
hình
Kết thúc
64 Bảng 22 File gen_predata.bat set project=Lenh set base=Z:\Dropbox\LuanVan\HuanLuyen\ set tools=%base%SphinxTools\ set sphinxtrain=%base%\SphinxTrain\ set hxutils=%base%\HxUtils\ del %project%.arpa del %project%.dic del %project%.filler del %project%.html del %project%.idngram del %project%.lm.DMP del %project%.phone del %project%.vocab del %project%_test.fileids del %project%_test.transcription del %project%_train.fileids del %project%_train.fileids del %project%_train.transcription rmdir /Q /S bwaccumdir rmdir /Q /S etc rmdir /Q /S feat rmdir /Q /S logdir rmdir /Q /S model_architecture rmdir /Q /S model_parameters rmdir /Q /S qmanager rmdir /Q /S result rmdir /Q /S trees
%tools%text2wfreq < %project%.txt | %tools%wfreq2vocab > %project%.vocab %tools%text2idngram -vocab %project%.vocab -idngram %project%.idngram < %project%.txt
%tools%idngram2lm -vocab_type 0 -idngram %project%.idngram -vocab %project%.vocab -arpa %project%.arpa
%tools%sphinx_lm_convert -i %project%.arpa -o %project%.lm.DMP %hxutils%hxgendic %project%.vocab %project%.dic
%hxutils%hxgenphone %project%.dic %project%.phone %hxutils%hxgentranscription %project%.txt Users.txt %project%_train.transcription
%hxutils%hxgentranscription %project%.txt TestUsers.txt %project%_test.transcription
%hxutils%hxgenfileids %project%.txt Users.txt %project%_train.fileids %hxutils%hxgenfileids %project%.txt TestUsers.txt %project%_test.fileids %hxutils%hxgenfiller %project%.filler
65
python %sphinxtrain%scripts\sphinxtrain -t %project% setup
Sơ đồ khối và nội dung file train.bat
Bảng 23 File train.bat set project=Lenh set base=Z:\Dropbox\LuanVan\HuanLuyen\ set tools=%base%SphinxTools\ set sphinxtrain=%base%\SphinxTrain\ set hxutils=%base%\HxUtils\
copy %project%.dic etc\%project%.dic copy %project%.filler etc
Bắt đầu
Thiết lập biến môi trường
Sao chép các file dữ liệu cần thiết
Huấn luyện
Kết thúc
66
copy %project%.lm.DMP etc copy %project%.phone etc copy %project%_test.fileids etc
copy %project%_test.transcription etc copy %project%_train.fileids etc
copy %project%_train.transcription etc python %sphinxtrain%scripts\sphinxtrain run pause
4.6. Tích hợp nhận dạng tiếng nói vào phần mềm
Sau khi thực hiện quá trình huấn luyện ở trên ta thu được các file cần thiết để tích hợp khả năng nhận dạng tiếng nói cho phần mềm như sau:
- Mô hình ngôn ngữ: erp.gram - Từ điển phát âm Lenh.dic
- File tạp âm: Lenh.noise (hoặc Lenh.filler)
- Các file đặc trưng của ngôn ngữ thu được từ quá trình huấn luyện mô hình âm học: o feat.params o mdef o means o mixture_weights o transition_matrices o variances
Cấu hình các tham số đầu vào cho Sphinx 4 như đã trình bày trong phần giới thiệu về Sphinx4: FrontEnd, Recognizer, Search, Linguist…
Một số tham số cần quan tâm khi liên quan trực tiếp tới các dữ liệu huấn luyện thu được trước đây. Trong chương trình đang xây dựng, các dữ liệu được đặt trực tiếp trong file mã nguồn Java, do đó tham chiếu viết theo cú pháp: resource/url. Thực tế, các dữ liệu này có thể tách riêng thành tài nguyên ngoài giúp dễ dàng cập nhật.
67
Bảng 24 Cấu hình ngôn ngữ
<!-- The Grammar configuration -->
<!-- ******************************************************** --> <component name="jsgfGrammar"
type="edu.cmu.sphinx.jsgf.JSGFGrammar">
<property name="dictionary" value="dictionary"/> <property name="grammarLocation"
value="resource:/speech/database/"/>
<property name="grammarName" value="erp"/> <property name="logMath" value="logMath"/> </component>
- Cấu hình từ điển
Bảng 25 Cấu hình từ điển
<!-- ******************************************************** --> <!-- The Dictionary configuration -->
<!-- ******************************************************** --> <component name="dictionary" type="edu.cmu.sphinx.linguist.dictionary.FastDictionary"> <property name="dictionaryPath" value="resource:/speech/database/Lenh.dic"/> <property name="fillerPath" value="resource:/speech/database/Lenh.noise"/>
<property name="addSilEndingPronunciation" value="false"/> <property name="allowMissingWords" value="false"/>
<property name="unitManager" value="unitManager"/> </component>
- Cấu hình mô hình âm học
Bảng 26 Cấu hình mô hình âm học
<!-- ******************************************************** --> <!-- The acoustic model configuration -->
<!-- ******************************************************** --> <component name="wsj"
type="edu.cmu.sphinx.linguist.acoustic.tiedstate.TiedStateAcousticModel"> <property name="loader" value="wsjLoader"/>
68 </component>
<component name="wsjLoader"
type="edu.cmu.sphinx.linguist.acoustic.tiedstate.Sphinx3Loader"> <property name="logMath" value="logMath"/>
<property name="unitManager" value="unitManager"/>
<property name="location" value="resource:/speech/database"/> </component>
Để người dùng có thể kích hoạt chức năng nhận dạng tiếng nói, FAB – EIS được tích hợp thêm một menu tương tác sử dụng đoạn code sau:
- Sơ đồ khối:
Bắt đầu
Sinh đối tượng ICON
Sinh đối tượng MenuEntry với ICON tạo sẵn
Đăng ký xử lý sự kiện cho đối tượng MenuEntry
Kết thúc
69 - Mã nguồn:
Bảng 27 Mã nguồn menu kích hoạt nhận dạng tiếng nói
Icon speechIcon = new ImageIcon(MainFrameControl.class
.getResource("/images/common/microphone.png")); amEntrySpeech = new RibbonApplicationMenuEntryPrimary(new
IconWrapperResizableIcon(speechIcon), "Kích hoạt nhận dạng tiếng nói", new ActionListener() {
public void actionPerformed(ActionEvent e) {
speechClicked(); }
}, CommandButtonKind.ACTION_ONLY);
Chức năng nhận dạng tiêng nói được thực hiện qua nhiều bước khác nhau: - Bước 1: Bắt đầu - Người dùng kích hoạt chức năng nhận dạng - Bước 2: Khởi tạo các biến xử lý cấu hình nhận dạng
- Bước 3: Khởi tạo Microphone
- Bước 4: Nhận dữ liệu từ Microphone và trích chọn đặc trưng - Bước 5: Nhận dạng dữ liệu tiếng nói
- Bước 6: Thiết lập kết quả nhận dạng tương ứng vào phần mềm kế toán và quản trị doanh nghiệp
- Bước 7: Kiểm tra điều kiện nếu người dùng dừng chức năng nhận dạng thì chuyển sang bước 8, nếu không quay trở lại bước 4
70 Sơ đồ khối
Bắt đầu
Khởi tạo đối tượng xử lý cấu hình nhận dạng
Khởi tạo Microphone
Nhận dữ liệu từ Microphone
Kết thúc Nhận dạng tiếng nói
Thiết lập kết quả nhận dạng vào các điều khiển trên màn
hình nhập liệu Người dùng tắt chức năng nhận dạng - +
71 Mã nguồn
Bảng 28 Mã nguồn nhận dạng tiếng nói
ConfigurationManager cm;
cm = new ConfigurationManager(
MainFrameView.class.getResource(speechConfigFile)); recognizer = (Recognizer) cm.lookup("recognizer"); recognizer.allocate();
// start the microphone or exit if the programm if this is not possible Microphone microphone = (Microphone) cm.lookup("microphone"); if (!microphone.startRecording()) {
System.out.println("Cannot start microphone."); recognizer.deallocate();
}
while (speechEnabled) {
System.out.println("Start speaking. Press Ctrl-C to quit.\n"); Result result;
synchronized (recognizer) {
result = recognizer.recognize(); }
if (result != null) {
String resultText = result.getBestFinalResultNoFiller(); System.out.println("You said: " + resultText + '\n'); try { FunctionTreeNode node = SpeechMapping.getNode(resultText); if (node != null) { processFunctionSelected(node); } else { String number = SpeechMapping.getNumber(resultText); if (!"".equalsIgnoreCase(number)) { Component component = KeyboardFocusManager .getCurrentKeyboardFocusManager() .getFocusOwner();