Nhiều dự án phần mềm có từ 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. Khi các dự án phát triển và trở nên phức tạp hơn, nhu cầu tăng thêm về sự chặt chẽ và tính tương thích 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...
Tiến tới chuẩn mở việc xử lý giọng nói Giới thiệu Nhiều dự án phần mềm có từ lâu sử dụng tệp tài nguyên cấu hình flat-file (thuật ngữ thường dùng để ứng dụng lưu trữ liệu lên tập tin dạng văn bản) nhiều năm mà không gặp vấn đề lớn Khi dự án phát triển trở nên phức tạp hơn, nhu cầu tăng thêm chặt chẽ tính tương thích lớn Với XML ứng dụng XML sử dụng tiêu chuẩn cụ thể, có khả bạn hưởng lợi từ: tính tương thích, tính chắn tính mở rộng dự án tảng lĩnh vực chẳng hạn 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 tệp flat-file sang tiêu chuẩn nguồn mở thích hợp, bạn làm tăng tính linh hoạt độ tin cậy Từ ngữ việc nhận dạng giọng nói ví dụ hay sử dụng Dù dự án mã nguồn mở bạn có di chuyển sang XML với tệp tài ngun hay khơng, bạn sử dụng tiêu chuẩn XML công việc mà khơng bị đặc tính Trong này, tìm hiểu cách dễ dàng di chuyển định dạng phẳng PLS Các ví dụ cho thấy cách lưu trữ từ ngữ tùy chỉnh theo định dạng PLS trích xuất liệu vào flat-file cần thiết Về đầu trang Ví dụ: Từ ngữ Các từ ngữ danh sách từ mà bạn sử dụng công cụ nhận dạng giọng nói Chúng chứa thơng tin cách từ phải in biểu diễn đồ họa phát sử dụng âm vị Từ vựng thường dùng với HTK sử dụng rộng rãi dự án điều khiển giọng nói (xem phần Tài nguyên) Liệt kê đoạn trích từ vựng HTK VoxForge Liệt kê Đoạn trích từ vựng HTK VoxForge AGENCY AGENDA AGENT AGENTS AGER [AGENCY] ey [AGENDA] ax [AGENT] ey jh ih n [AGENTS] ey [AGER] ey g er jh ih n s iy jh eh n d ax t jh ih n t s AGES [AGES] ey jh ih z Thêm khoảng tab bạn muốn chép dán mã Điều quan trọng bạn lấy từ vựng trực tiếp từ nguồn Bài hiển thị HTML, thay phân cách khoảng trống Nếu bạn chép dán từ này, bạn cần phải thay nhiều khoảng trống dấu phân cách thẻ đơn (\t) khơng đoạn script khơng chạy Tệp Liệt kê có ba trường phân cách tab: Nhãn mô tả chung từ Các dấu ngoặc vng bao quanh từ bạn muốn in hiển thị hình (grapheme - chữ đặc trưng cho âm vị) Một chuỗi âm vị có phân cách khoảng trống từ Arpabet (xem phần Tài nguyên) mô tả từ phát âm Trong ví dụ trên, phát âm từ tiếng Anh, rõ ràng trình bày ký tự ASCII (Mã tiêu chuẩn Hoa kỳ dùng để trao đổi thông tin) Dự án Sphinx CMU (xem phần Tài nguyên) lưu từ vựng (hoặc từ điển bối cảnh Sphinx CMU) theo cách tương tự Liệt kê trình bày đoạn trích dẫn Liệt kê Đoạn trích từ vựng Sphinx CMU agency agenda agendas agent agents ager EY AH AH EY EY EY JH JH JH JH JH JH AH EH EH AH AH ER N N N N N S D D T T IY AH AH Z S Trong Liệt kê có hai trường: word/grapheme biểu diễn âm vị Hai ví dụ có số khác biệt khó nhận thấy: Các từ âm vị trường hợp khác Các âm vị có số khác biệt khơng đáng kể Dấu chấm câu (dấu phẩy, dấu chấm than v.v) xử lý khác chút Bạn xem toàn từ điển tệp cmu07a.dic phần tải PocketSphinx (xem phần Tài nguyên) Do từ vựng mô tả cách phát âm cụ thể từ, nên bạn cần chỉnh sửa tệp cho phù hợp với người phương ngữ cụ thể Theo thời gian, bạn xây dựng vốn kiến thức từ vựng tùy chỉnh riêng Bạn dễ dàng chỉnh sửa flat-file trình soạn thảo văn bản, bạn nên cẩn thận điều dễ gây lỗi, chẳng hạn như: việc sử dụng dấu phân cách khác so với tiêu chuẩn dùng cho tệp, việc chèn ký tự ASCII, đặt trường theo thứ tự sai, việc phân loại ghi khơng xác, thiếu dấu ngoặc vng cần thiết v.v Có bất lợi khó thấy khác flat-file bạn xây dựng tệp tùy chỉnh mình, bạn khơng tương thích với dự án nhận dạng văn khác Một từ vựng theo định dạng XML tiêu chuẩn PLS, hai dự án cơng nhận, tương thích hai Về đầu trang Đặc tả từ vựng phát âm PLSA có định dạng bản, đơn giản Liệt kê Liệt kê Định dạng PLS XML mô tả phần tử gốc lexicon (từ vựng) chứa nhiều phần tử lexeme (từ vị) Mỗi phần tử lexeme chứa nhiều phần tử grapheme nhiều phần tử phoneme (âm vị) Đặc tả cho phép bạn ghi đè lên thuộc tính alphabet (bảng chữ cái) khơng cho phép bạn ghi đè lên thuộc tính ngôn ngữ xml:lang Để lưu từ vị cho ngôn ngữ khác nhau, chắn bạn cần tách riêng tệp từ vựng PLS Bảng chữ mặc định từ vựng ipa, nói đến hệ thống IPA (International Phonetic Alphabet – Bảng chữ phiên âm quốc tế) để biểu diễn âm (xem phần Tài nguyên) Biểu diễn IPA âm vị ký tự Unicode nhiều byte Cả hai HTK Sphinx sử dụng mã ASCII Nhận xét quan trọng giải phần sau Lợi việc sử dụng đặc tả PLS chỗ thêm cấu trúc chặt chẽ cho phép bạn lưu trữ thêm thông tin, chẳng hạn thành phần tiếng nói bảng chữ cụ thể Chi tiết thành phần tiếng nói quan trọng tiếng Anh số từ viết theo tả giống (các từ chữ) lại phát âm khác tùy thuộc vào vai trò ngữ pháp chúng Ví dụ, từ perfect, tính từ phát âm khác với động từ trọng âm đặt vị trí khác Thơng tin bổ sung lưu trữ thuộc tính cho phép bạn trích ghi cụ thể từ tồn tệp, tùy theo yêu cầu Khi sử dụng phương pháp này, bạn tìm kiếm bảng chữ cụ thể số nhiều phần tử phoneme Hãy xem từ vựng PLS sở liệu thơng tin từ vựng mà từ bạn trích thơng tin chi tiết liên quan đến cơng cụ giọng nói mà bạn sử dụng Liệt kê ví dụ định dạng PLS Liệt kê Một từ theo định dạng PLS agency ey jh ih n s iy EY JH AH N S IY Ví dụ Liệt kê lưu trữ từ có hai biểu diễn âm vị Bạn lọc số chuỗi phoneme cách sử dụng thuộc tính alphabet Phần tử lexeme cho thấy thuộc tính role noun (danh từ) Trong việc cung cấp nhiều thơng tin, trường hợp lại q dư thừa từ sử dụng danh từ, khơng có kịch phát âm phức tạp Bằng cách biểu diễn phoneme từ hai nguồn khác cạnh nhau, bạn thấy rõ khác biệt tinh tế Thơng tin có ích việc giải vấn đề nhận dạng tiếng nói Khơng phải Sphinx CMU hay HTK sử dụng trực tiếp từ vựng PLS, mà phần đầu simon (xem phần Tài nguyên) với công cụ HTK làm điều Nếu bạn sử dụng trực tiếp HTK Sphinx, bạn cần chắn dễ dàng chuyển từ văn sang PLS ngược lại mà không thông tin Các phần sau cho thấy cách sử dụng Python để chuyển từ flat-file sang PLS ngược lại Giả sử bạn tùy chỉnh thông tin từ vựng flat-file Về đầu trang Chuyển đổi sang PLS Mã Liệt kê sử dụng Python, bạn thực điều tương tự theo nhiều cách khác (hãy xem hướng dẫn developerWorks XSLT (Extensible Stylesheet Language Transformations - Các chuyển đổi ngôn ngữ định kiểu mở rộng) phần Tài nguyên) Một số người muốn sử dụng thư viện để kiểm tra tính chắn XML bước nhỏ để biết thêm thông tin phản hồi trực tiếp nơi có vấn đề, đặc biệt tệp nguồn lớn chứa lỗi xung đột Ví dụ để lại việc kiểm tra vào bước cuối cùng, hàm ý quy ước flat-file định dạng Liệt kê 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('\n\ ') # 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\ \n\ '+gr+'\n\ '+word[2]+'\n\ ') else: # src is sphinx f = open("cmu.dic","r") for line in f: line = str.strip(line) word = str.split(line,"\t") gr = cgi.escape(word[0]) out.write('\n\ \n\ '+gr+'\n\ '+word[1]+'\n\ ') # ended lexemes out.write('\n\n') out.close() # now check the output is ok tree = parse(outfile) lexicon = tree.getroot() mylexcount = for lexeme in lexicon: mylexcount += print 'Found %(number)d lexemes' % {"number":mylexcount} Liệt kê bắt đầu cách nhập mơ đun từ thư viện phân tích cú pháp XML elementtree (xem phần Tài nguyên) số thư viện hỗ trợ Việc nhập ElementTree phân phối khác liên quan đến cú pháp khác chút, tùy thuộc vào cách bạn cài đặt mơ đun Đoạn mã ví dụ đến từ openSUSE với mô đun cài đặt từ nguồn, Ubuntu yêu cầu from xml.etree.ElementTree import parse Mô đun str cho phép số thao tác chuỗi, sys cho bạn quyền truy cập vào tệp cgi cung cấp thường trình đặt dấu gạch chéo ngược cần thiết việc xử lý liệu cho XML Mã hy vọng nhận đối số giao diện dịng lệnh (CLI) để nói cho biết liệu có chuyển dịch từ định dạng Sphinx CMU HTK/VoxForge khơng Sau đó, đoạn mã ví dụ mở tệp để xuất viết đoạn mở đầu XML thích hợp cho PLS Vì bạn khơng lưu trữ ký tự Unicode giai đoạn này, nên việc mở tệp để truy cập ASCII đủ Lúc này, mã Liệt kê 5: Xử lý dòng tệp nguồn, chia tách trường thành chuỗi riêng biệt viết thành phần lexeme, grapheme phoneme Xác định phoneme thuộc tính alphabet="x-htk-voxforge" liệu gửi đến từ từ vựng VoxForge alphabet="x-cmusphinx" liệu từ Sphinx Giữ nguyên trường hợp âm vị Khi trường nhập khẩu, chứa ký tự, chẳng hạn dấu "và" (&), gây vấn đề XML, trừ đặt dấu gạch chéo ngược với cgi.escape() Cuối cùng, đoạn mã: Viết thẻ đóng Đóng tệp PLS sau nạp lại tệp XML Đọc hết tệp đếm phần tử lexeme Báo cáo tổng số đếm từ vị Nếu tổng số đếm báo cáo, XML xuất chắn có định dạng Liệt kê đoạn trích kết từ vựng HTK VoxForge Liệt kê Đoạn trích kết từ vựng HTK VoxForge AGENDA ax jh eh n d ax AGENT ey jh ih n t Về đầu trang Chuyển đổi từ PLS Điều quan trọng bạn dễ dàng chuyển ngược lại từ định dạng PLS sang flat-file Mã Liệt kê giả định bạn có từ vựng lưu tệp có định dạng PLS dự án nhận dạng tiếng nói bạn sử dụng flat-file theo định dạng HTK theo định dạng Sphinx CMU Liệt kê Chuyển đổi từ PLS from elementtree.ElementTree import parse import string as str import sys # # call with # python pls2flat.py x-htk-voxforge > mylexicon # or # python pls2flat.py x-cmusphinx > mylexicon.dic # if len(sys.argv) > 1: alpha = sys.argv[1] # if alpha == "x-htk-voxforge": tree = parse("mylexvox.pls") else: tree = parse("mylexspx.pls") lexicon = tree.getroot() for lexeme in lexicon: for child in lexeme: #print child.tag if child.tag[-8:] == 'grapheme': if alpha == 'x-htk-voxforge': gr = str.upper(child.text) print gr,"\t","["+gr+"]","\t", else: gr = child.text print gr,"\t", if child.tag[-7:] == 'phoneme': if child.get('alphabet') == alpha: print child.text Kịch lệnh ngắn sử dụng thư viện elementtree để phân tích cú pháp tệp XML PLS Nó thiết lập phần tử gốc sau lặp lại qua phần tử lexeme, tìm kiếm grapheme phoneme ghi giá trị vào tệp văn theo định dạng thích hợp Kịch lệnh yêu cầu ký tự cuối thẻ dùng cho grapheme có tiền tố vùng tên trả với thẻ Nó tạo lại định dạng ba trường cho HTK hai trường cho Sphinx CMU Về đầu trang Việc hợp xử lý Unicode Kịch lệnh Liệt kê sử dụng hai tệp PLS để tạo tệp PLS chung có chứa thơng tin cho hai tệp ban đầu Nó chuyển dịch chuỗi phoneme VoxForge sang Unicode lưu trữ phiên Unicode phần tử phoneme riêng biệt xác định thuộc tính alphabet="ipa" Liệt kê Việc hợp Unicode #! /usr/bin/python -u # -*- coding: utf-8 -*# # challenge is to merge two pls files # given two pls files, merge them into one # import elementtree.ElementTree as ET from elementtree.ElementTree import parse import string as str import codecs import cgi # treevox = ET.parse("mylexvox.pls") treespx = ET.parse("mylexspx.pls") # lexvox = treevox.getroot() lexspx = treespx.getroot() # phons = { 'aa':u'ɑ','ae':u'æ','ah':u'ʌ','ao':u'ɔ','ar':u'ɛr','aw':u'aʊ', 'ax':u'ə','ay':u'aɪ','b':u'b','ch':u'tʃ','d':u'd','dh':u'ð','eh':u'ɛ', 'el':u'ɔl','en':u'ɑn','er':u'ər','ey':u'eɪ','f':u'f', 'g':u'ɡ','hh':u'h','ih':u'ɪ','ir':u'ɪr','iy':u'i','jh':u'dʒ','k':u'k','l':u'l ', 'm':u'm','n':u'n','ng':u'ŋ','ow':u'oʊ','oy':u'ɔɪ','p':u'p','r':u'r','s':u's', 'sh':u'ʃ','t':u't','th':u'θ','uh':u'ʊ','ur':u'ʊr','uw':u'u','v':u'v', 'w':u'w','y':u'j','z':u'z','zh':u'ʒ','sil':'' } # def to_utf(s): myp = str.split(s) myipa = [] for p in myp: myipa.append(phons[p]) return str.join(myipa,'') # outfile = "my2lexmrg.pls" out = codecs.open(outfile, encoding='utf-8', mode='w') # out.write('\n\ ') # # scan the two pls, create dictionary voxdict = {} for lexeme in lexvox: gr = str.lower(lexeme[0].text) ph = lexeme[1].text voxdict[gr] = {ph,} # for lexeme in lexspx: gr = lexeme[0].text ph = lexeme[1].text if gr in voxdict: voxdict[gr].add(ph) else: voxdict[gr] = {ph,} # for gr in sorted(voxdict.iterkeys()): out.write('\n\ \n\ '+cgi.escape(gr)+'') #print "%s: %s" % (key, voxdict[key]) for ph in sorted(voxdict[gr]): alph = 'x-htk-voxforge' if ph.islower() else 'x-cmusphinx' out.write('\n\ '+ph+'') if ph.islower(): phipa = to_utf(ph) out.write(u'\n\ '+phipa+'') out.write('\n\ ') # done, close files out.write('\n') out.close() # now check the output is ok tree = parse(outfile) lexicon = tree.getroot() mylexcount = for lexeme in lexicon: mylexcount += print 'Found %(number)d lexemes' % {"number":mylexcount} Bạn bắt đầu biểu thức khơng thức (hashban) (#!) số đặc biệt cho trình thơng dịch Python, dịng thứ hai, mã chứa ký tự Unicode Sau kịch lệnh nhập số mơ đun, gồm có elementtree, codecs cgi, có ích xử lý Unicode Bạn nói cho trình thơng dịch biết hai tệp PLS nằm đâu trỏ tới phần tử gốc chúng Biến phons lưu từ điển đặc biệt có chứa ánh xạ từ mã Arpabet CMU đến tổ hợp Unicode tương đương Từ điển dịch chuỗi phoneme có sang phiên Unicode Xin tự nhiên sửa đổi ánh xạ cho mục đích riêng bạn—ví dụ, bạn cảm thấy chữ tương đương với 'aa' Unicode u'ɑ:', có âm a kéo dài Chỉ có hàm định nghĩa to_utf(), hàm dịch chuỗi Arpabet ASCII sang Unicode Phần cuối tảng mở tệp để lưu kết đầu ra, bảo đảm tệp biết phải sẵn sàng chấp nhận Unicode viết đoạn mở đầu PLS vào Bây bạn sẵn sàng để xử lý tệp cách tạo hai từ điển Python đặc biệt bên trong, từ điển từ tệp PLS, cách quét chúng với thư viện elementtree Người ta giả định grapheme phần tử phoneme phần tử thứ hai từ vị Kịch lệnh thêm tất ghi từ tệp vào từ điển hợp Khi quét tệp thứ hai, khóa tồn từ điển hợp bạn thêm vào tập hợp âm vị Nếu khơng, bạn tạo mục khóa từ điển hợp Ở cuối vịng lặp, từ điển hợp có chứa khóa từ hai tệp ban đầu tập hợp kèm theo hai chuỗi phoneme Ghi tệp PLS từ việc hợp mà bạn vừa tạo Khi bạn quét qua từ điển, bạn thêm thuộc tính alphabet để phân biệt phoneme với phoneme khác Khi ghi lại âm vị có, bạn tạo chuỗi phoneme mới, tương đương Unicode chuỗi Arpabet CMU, mà bạn nhận từ phiên HTK phiên Sphinx (hoặc hai) theo nhu cầu bạn Cuối cùng, đóng phần tử gốc, đóng tệp phân tích lại cú pháp bạn làm trước để kiểm tra xem có định dạng không Kết tương tự Liệt kê Liệt kê Các kết hợp agenda AH JH EH N D AH ax jh eh n d ax ədʒɛndə agendas AH JH EH N D AH Z agent EY JH AH N T ey jh ih n t eɪdʒɪnt agent's EY JH AH N T S Với từ điển PLS hợp nhất, bạn áp dụng XSL (Extensible Stylesheet Language - Ngôn ngữ định kiểu mở rộng) thủ tục khác để tạo kết mà bạn cần, cho dù flat-file hay tệp PLS đặc trưng Về lý thuyết, bạn lưu chuỗi phoneme khác tệp này, chí từ ngơn ngữ khác Tuy nhiên, cách sử dụng đặc tả PLS không chuẩn Kai Schott làm nhiều việc với PLS có số tệp chuẩn bị để tải dạng ngôn ngữ khác nhau, đặc biệt tiếng Đức (xem phần Tài nguyên) Về đầu trang Các vấn đề chưa giải Mặc dù bạn nhận nhiều thơng tin từ flat-file, vấn đề sau chưa giải Lựa chọn từ nhiều chữ đặc trưng cho âm vị Thỉnh thoảng, bạn cần xử lý nhiều cách viết tả cho từ ngơn ngữ Vai trị âm vị giống hệt cho hai phép tả, bạn có nhiều chữ đặc trưng cho âm vị từ vị Tuy nhiên, khơng có PLS cho phép bạn thêm thuộc tính cho phần tử grapheme có với thuộc tính alphabet phần tử phoneme Các từ viết tắt Các từ vựng thường chứa từ viết tắt PLS xử lý từ viết tắt phần tử lexeme gọi Để xây dựng tự động PLS từ flat-file, bạn cần cách để phân biệt từ viết tắt với từ thực từ vựng Các flat-file không thiết phải có thơng tin Vai trị/thành phần tiếng nói Như với từ viết tắt, thơng tin thành phần tiếng nói khơng có sẵn từ flat-file để gắn thuộc tính role cố định vào PLS ... sau Lợi việc sử dụng đặc tả PLS chỗ thêm cấu trúc chặt chẽ cho phép bạn lưu trữ thêm thông tin, chẳng hạn thành phần tiếng nói bảng chữ cụ thể Chi tiết thành phần tiếng nói quan trọng tiếng Anh... cần thiết việc xử lý liệu cho XML Mã hy vọng nhận đối số giao diện dịng lệnh (CLI) để nói cho biết liệu có chuyển dịch từ định dạng Sphinx CMU HTK/VoxForge khơng Sau đó, đoạn mã ví dụ mở tệp để... tệp để xuất viết đoạn mở đầu XML thích hợp cho PLS Vì bạn khơng lưu trữ ký tự Unicode giai đoạn này, nên việc mở tệp để truy cập ASCII đủ Lúc này, mã Liệt kê 5: Xử lý dòng tệp nguồn, chia