Tiến tới những chuẩn mở trong việc xử lý giọng nói
Giới thiệu
Nhiều dự án phần mềmtừ lâu đã sử dụng các tệp tài nguyên và cấu hình flat-file (thuật ngữ
thường dùng để chỉ các ứng dụng lưu trữ dữ liệu lên các tập tin dạng văn bản) trong nhiều năm
mà không gặp các vấn đề lớn. Khic dự án phát triển và trở nên phc tạp hơn, nhu cầu tăng
thêm vsự chặt chẽ và tính tương tch càng lớn hơn. Với XML và ng dụng của XML khi sử
dụng các tiêu chuẩn cụ thể, có khả năng là bạn có thể được hưởng lợi từ: tính tương tch, tính
chc chắn và tính mở rộng giữa dự án và giữa nền tảng trong các lĩnh vực chẳng hạn như
Unicode.
Các từ viết tắt thông dụng
HTK: Hidden Markov Model Toolkit (B công cụ mô hình Markov n)
PLS: Pronunciation Lexicon Specification (Đặc t t vựng phát âm)
XML: eXtensilble Markup Language (Ngôn ngđánh dấu mở rộng)
Bằng việc chuyển đổi các tệp flat-file sang tiêu chuẩn nguồn m tch hợp, bạn cũng có thể làm
tăng tính linh hot và đ tin cậy. Từ ngữ trong việc nhận dạng ging nói là mt ví dụ hay được
sử dụng trong bài này. Dù các dự án mã ngun mcủa bn di chuyển sang XML với các tệp
tài nguyên hay không, bạn có thể sử dụng các tiêu chun XML trong công việc của mình mà
không bị mất đi các đặc tính.
Trong bài này, hãy tìm hiu cách dễ dàng di chuyển gia các định dạng phẳng và PLS. Các ví d
cho thy cách lưu trữ các t ngữ tùy chnh theo định dạng PLS và trích xuất dữ liệu vào flat-file
cần thiết.
Về đầu trang
Ví dụ: Từ ngữ
Các tngữ là các danh sách của các từ mà bn sdụng trong các công cụ nhận dạng ging nói.
Chúng chứa thông tin về cách từ đó phi được in ra hoặc được biểu diễn bằng đồ họa như thế
ophát ra như thế nào khi sử dụng các âm vị. Từ vựng thường dùng với HTK được sử
dụng rộng rãi trong các dự án điều khiển bằng ging nói (xem phn i nguyên). Liệt kê 1 là mt
đon trích của mt t vựng HTK của VoxForge.
Liệt kê 1. Đoạn trích của một t vựng HTK của VoxForge
AGENCY [AGENCY] ey jh ih n s iy
AGENDA [AGENDA]
ax jh eh n d ax
AGENT [AGENT] ey jh ih n t
AGENTS [AGENTS] ey jh ih n t s
AGER [AGER] ey g er
AGES [AGES] ey jh ih z
Thêm một khoảng tab nếu bạn muốn sao chép và dán
trong bài
Điều quan trọng là bạn lấy các từ vựng trực tiếp t nguồn. Bàiy sẽ hiển thị bng HTML, thay
thế c sự phân cách bằng khoảng trng. Nếu bạn sao chép và dán tbàiy, bạn cần phải thay
thế nhiều khoảng trống ở giữa bằng mt dấu phân cách thẻ đơn (\t) nếu không thì đoạn script sẽ
không chạy.
Tệp trong Liệt kê 1 có ba trường được phân cách bằng tab:
Nhãn mô tchung về từ đó.
Các dấu ngoặc vuông bao quanh từ khi bạn muốn nó được in hoặc được hin thị trên màn
hình (grapheme - chữ cái đặc trưng cho một âm vị).
Một chuỗi các âm vị phân cách bằng mt khoảng trống từ bArpabet (xem phn i
nguyên) mô t từ này phát âm như thế nào.
Trong ví dtrên, các phát âm từ tiếng Anh, rõ ràng được trình bày bởi các ký tự ASCII (Mã tiêu
chun Hoa kỳ dùng để trao đổi thông tin)..
Dự án Sphinx của CMU (xem phần i nguyên) lưu từ vựng (hoặc từ điển trong bi cảnh Sphinx
của CMU) theo cách tương tự. Liệt kê 2 trình bày mt đoạn trích dẫn.
Liệt kê 2. Đoạn trích từ vựng Sphinx của CMU
agency EY JH AH N S IY
agenda AH JH EH N D AH
agendas AH JH EH N D AH Z
agent EY JH AH N T
agents EY JH AH N T S
ager EY JH ER
Trong Liệt kê 2 ch hai trường: word/grapheme và biểu din âm vị của nó. Hai ví dụ trên có
mt số sự khác biệt khó nhận thấy:
Các tvà các âm v trong các trường hợp khác nhau.
Các âm v mt số khác biệt không đáng kể.
Dấu chm câu (dấu phẩy, dấu chấm than và v.v) được xử hơi khác nhau mt chút.
Bạn có thể xem toàn bộ t điển trong tệp cmu07a.dic trong phần tải về hiện tại của PocketSphinx
(xem phần Tài nguyên).
Do t vựng mô tả các cách phát âm cụ thể của các từ, nên bạn có thể cần chỉnh sửa tệp đó cho
phù hợp với mi người hoặc các phương ngữ cụ thể. Theo thời gian, bạn xây dựng vn kiến thức
trong từ vựng tùy chnh riêng của mình. Bn có thể dễ dàng chỉnh sửa flat-file bằng một trình
soạn thảo văn bản, nhưng bạn nên cẩn thận vì điều này cũng dễ gây ra li, chẳng hạn như: việc
sử dụng mt dấu phân cách khác hơn so với tiêu chuẩn dùng cho tệp, việc chèn các ký tự không
phải là ASCII, đặt các trường theo thứ t sai, việc phân loại các bản ghi không cnh xác, thiếu
các dấu ngoặc vuông cần thiết và v.v.
mt bất li khó thấy khác của c flat-file là khi bạn xây dựng tệp tùy chnh của mình, bạn
vẫn không tương tch với các dự án nhận dạng văn bản khác. Một từ vựng theo mt định dạng
XML tiêu chuẩn như PLS, nếu được cả hai dự án công nhận, thì ngay lập tức đều tương tch
trong cả hai.
Về đầu trang
Đặc tt vựng phát âm
PLSA có một định dạng cơ bn, đơn gin như trong Liệt kê 3.
Liệt kê 3. Định dạng PLS cơ bản
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
alphabet="ipa" xml:lang="en-US">
<lexeme ...>
<grapheme>...</grapheme>
<phoneme ...>...</phoneme>
</lexeme>
</lexicon>
XML mô t phần tử gốc lexicon (từ vựng) có thể chứa nhiều phần tử con lexeme (từ vị). Mỗi
phần tử con lexeme có thể chứa nhiều phần tgrapheme và nhiều phn tphoneme (âm v). Đặc
tả này cho phép bạn ghi đè lên thuc tính alphabet (bảng chữ cái) nhưng không cho phép bạn
ghi đè lên thuc tính nn ngữ xml:lang. Để lưu các t vị cho các ngôn ngữ khác nhau, chắc
chn bạn cần tách riêng các tệp từ vựng PLS. Bảng chữ cái mặc định trong từ vựng này ipa,
i đến hệ thống IPA (International Phonetic Alphabet Bảng chữ cái phiên âm quc tế) để biểu
diễn các âm thanh (xem phn i nguyên). Biểu diễn IPA về các âm vị là các ký tự Unicode
nhiều byte. Cả hai HTK và Sphinx đều sử dụng các mã ASCII thuần. Nhận xét quan trng này
được giải quyết phần sau trong bài này.
Lợi thế của việc sử dụng đặc tả PLS là ở ch nó thêm cấu trúc chặt chẽ hơn và cho phép bạn lưu
tr thêm thông tin, chẳng hạn như thành phần của tiếng nói và các bảng chcái cụ thể. Chi tiết
v thành phn của tiếng nói là quan trng trong tiếng Anh vì mt số từ có thể được viết theo
chính tgiống nhau (các t cùng chữ) li được phát âm khác nhau tùy thuộc vào vai trò ngữ pháp
của chúng. Ví dụ, đối với tperfect, nếu nó là mt tính từ thì sẽ phát âm khác với khi nó là mt
động từ vì trọng âm được đặt một vị trí khác nhau. Thông tin b sung được lưu trtrong các
thuc tính cho phép bạn trích ra c bản ghi cụ thể t toàn bộ tp, tùy theou cầu. Khi sử dụng
phương pháp này, bạn có thtìm kiếm mt bảng chữ cái cụ thể trong số nhiều phn tử phoneme.
Hãy xem từ vựng PLS như là một cơ sở dữ liệu về thông tin từ vựng mà từ đó bạn có thể trích ra
thông tin chi tiết liên quan đến công cụ ging nói mà bạn sử dụng. Liệt kê 4 là mt ví dụ về định
dạng PLS.
Liệt kê 4. Một từ theo định dạng PLS
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
alphabet="ipa" xml:lang="en">
<lexeme role="noun">
<grapheme>agency</grapheme>
<phoneme alphabet="x-htk-voxforge">ey jh ih n s iy</phoneme>
<phoneme alphabet="x-cmusphinx">EY JH AH N S IY</phoneme>
</lexeme>
</lexicon>
Ví dụ trong Liệt kê 4 ch lưu trữ mt t có hai biểu din âm vị thể. Bạn có thlc ra mt trong
scác chuỗi phoneme bằng cách sử dụng thuộc tính alphabet. Phần tử lexeme cho thấy thuộc
tính role của noun (danh từ). Trong khi việc này cung cấp nhiều thông tin, thì trong trường hợp
này nó li quá dư thừa vì từ đó chỉ được sử dụng như một danh từ, không có các kịch bản phát
âm phức tp nào.
Bằng cách các biểu diễn phoneme t hai nguồn khác nhau ở cạnh nhau, bạn có thể thấy rõ s
khác bit tinh tế. Thông tin này có thể có ích trong việc giải quyết các vấn đề nhận dạng tiếng
i.
Không phải Sphinx của CMU hay HTK có thể sử dụng trực tiếp mt từ vựng PLS, mà phần đầu
của simon (xem phần i nguyên) với bộ công cụ HTK mới có thể làm được điều đó. Nếu bạn
đang sử dụng trực tiếp HTK hoặc Sphinx, bn cần chắc chắn rằng có thể dễ dàng chuyển từ văn
bản thuần sang PLS và ngược lại mà không mất thông tin.
Các phần sau đây cho thấych sử dụng Python để chuyển từ mt flat-file sang PLS và ngược
lại. Giả sử bạn đã tùy chỉnh thông tin trong một t vựng flat-file.
Về đầu trang
Chuyển đổi sang PLS
Mã trong Liệt kê 5 sử dụng Python, nhưng bạn có thể thực hiện điều tương tự theo nhiều cách
khác. (hãy xem hướng dẫn trên developerWorks về XSLT (Extensible Stylesheet Language
Transformations - Các chuyển đổi nn ngữ bản đnh kiểu mở rộng) trong phần Tài nguyên).
Một s người muốn sử dụng các thư viện để kiểm tra tính chắc chắn của XML ở mi bước nhỏ
để biết thêm thông tin phn hi trực tiếp chỉ ra nơi có vấn đề, đặc biệt là đối với các tệp nguồn
lớn và có thể chứa các li và các xung đột. Ví dụ dưới đây để li việc kim tra vào bước cuối
cùng, hàm ý mt quy ước là các flat-file đều đúng đnh dạng.
Liệt kê 5. Chuyển đổi sang PLS
from elementtree.ElementTree import parse
import string as str
import sys
import cgi
#
# call with
# python flat2pls.py vox
# or
# python flat2pls.py spx
#
if len(sys.argv) == 2:
src = sys.argv[1]
else:
exit("wrong args")
#
outfile = "mylex"+src+".pls"
print "out is "+outfile
out = open(outfile,"w")
out.write('<?xml version="1.0" encoding="UTF-8"?>\n\
<lexicon version="1.0"\n \
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"\n\
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n \
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon\n \
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-
20071212/pls.xsd"\n\
alphabet="ipa" xml:lang="en">')
# now the lexemes
if src == "vox":
f = open("vf.lex","r")
for line in f:
line = str.strip(line)
word = str.split(line,"\t")
#gr = str.strip(word[1],"[]")
gr = cgi.escape(word[0])
out.write('\n\
<lexeme>\n\
<grapheme>'+gr+'</grapheme>\n\
<phoneme alphabet="x-htk-voxforge">'+word[2]+'</phoneme>\n\
</lexeme>')
else: # src is sphinx
f = open("cmu.dic","r")
for line in f:
line = str.strip(line)
word = str.split(line,"\t")