Thành phần ghi âm

Một phần của tài liệu Xây dựng giao tiếp tiếng nói với phần mềm kế toán và quản trị doanh (Trang 50)

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 (adsbygoogle = window.adsbygoogle || []).push({});

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" (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

$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 (adsbygoogle = window.adsbygoogle || []).push({});

%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 --> (adsbygoogle = window.adsbygoogle || []).push({});

<!-- ******************************************************** --> <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: (adsbygoogle = window.adsbygoogle || []).push({});

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; (adsbygoogle = window.adsbygoogle || []).push({});

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();

Một phần của tài liệu Xây dựng giao tiếp tiếng nói với phần mềm kế toán và quản trị doanh (Trang 50)