+ Vấn ñề : CSDL là một kiểu dữ liệu có cấu trúc chứa danh sách các diphone.Trong ñó mỗi Diphone là một ñối tượng có các thuộc tính như mảng dữ liệu của File Wav, mảng toạ ñộ các ñiểm cực
Trang 1Chương 14: Một số đặc trưng của chương
trình
Trang 2+ Toàn bộ môdun ñược ñóng gói thành một dll nên dễ dàng thừa kế cho các ứng dụng khác
+ Toàn bộ môdun ñược thiết kế theo hướng ñối tượng kể cả CSDL nên dễ nâng cấp sửa chữa về sau, và ñược thiết kế ñộc lập nên khi sửa ñổi CSDL không làm ảnh hưởng tới chương trình
+ Môdun sử dụng Font Unicode là Font khá thông dụng hiện nay + Môdun ñược lập trình trên nền Net kích thước File CSDL khá nhỏ nên có thể dễ dàng chuyển ñổi sang các ứng dụng chạy trên ñiện thoại di ñộng
3.2.2.2.4 Một số vấn ñề và giải pháp.
* Vấn ñề lưu trữ CSDL.
+ Vấn ñề : CSDL là một kiểu dữ liệu có cấu trúc chứa danh sách các diphone.Trong ñó mỗi Diphone là một ñối tượng có các thuộc tính như mảng dữ liệu của File Wav, mảng toạ ñộ các ñiểm cực trị, toạ ñộ ñiểm nối vv nên việc lưu trữ dữ liệu theo kiểu tuần
tự là khó khăn và phức tạp thậm trí việc tìm kiếm truy cập, cập nhật
là khó do kiểu lưu trữ tuần tự gây ra ví dụ khi thay ñổi khíc thước, dung lượng của một Diphone có thể sẽ làm mất hoặc sai lệch các dữ liệu của Diphone ñằng sau nó
+ Ý tưởng và giải pháp : coi toàn bộ CSDL là một Object có cấu trúc và lưu toàn bộ Object này xuống ổ cứng ðể giải quyết vấn ñề này em sử dụng một formatter ñể tuần tự hóa ñối tượng và ghi nó vào một System IO FileStream Khi cần truy xuất ñối tượng,
sử dụng formatter cùng kiểu ñể ñọc dữ liệu ñược-tuần-tự-hóa từ file
Trang 3và giải tuần tự hóa ñối tượng Thư viện lớp NET Framework cung cấp các hiện thực formatter sau ñây ñể tuần tự hóa ñối tượng theo dạng nhị phân hay SOAP:
System Runtime Serialization Formatters Binary BinaryFormatter System Runtime Serialization Formatters Soap SoapFormatter
Trang 4Lớp BinaryFormatter và SoapFormatter có thể ñược sử dụng
ñể tuần tự hóa một ñối tượng của bất kỳ kiểu nào ñược gắn với ñặc tính System SerializableAttribute BinaryFormatter sinh
ra một stream dữ liệu nhị phân mô tả ñối tượng và trạng thái của
nó, trong khi SoapFormatter sinh ra một tài liệu SOAP
Cả hai lớp BinaryFormatter và SoapFormatter ñều hiện thực giao diện System Runtime Serialization IFormatter, giao diện này ñịnh nghĩa hai phương thức: Serialize và Deserialize
Serialize nhận một tham chiếu System Object và một tham chiếu System IO Stream làm ñối số, tuần tự hóa Object và ghi nó vào Stream
Deserialize nhận một tham chiếu Stream làm ñối số, ñọc dữ liệu của ñối tượng ñược-tuần-tự-hóa từ Stream, và trả về một tham chiếu Object ñến ñối tượng ñược-giải-tuần-tự-hóa Ta phải ép tham chiếu Object này về kiểu thích hợp
* Vấn ñề tách dấu và tìm kiếm các Diphone
+ Vấn ñề : Một trong những bước quan trọng của bước tổng hợp mức cao ñó là tìm ñược vị trí nguyên âm ñầu tiên và dấu của từ
là gì ví dụ dấu huyền dấu sắc hay dấu hỏi…hay như khi ñã tìm ñược Diphone ñó là Diphone gì thì việc xác ñịnh vị trí của nó trong CSDL như thế nào? Việc viết các hàm kiểm tra và tìm kiếm này không khó tuy nhiên tốc ñộ thực thi phải nhanh và tối ưu
+ Ý tưởng và giải pháp : Sử dụng các tập hợp của Net cung
Trang 5cấp sẵn cụ thể vấn ñề xác ñịnh kí tự ñó có phải là nguyên âm hay không hoặc kí tự ñó có chứa dấu hay không trong C# em sử dụng tập hợp StringCollection và sử dụng hàm Contains() ñể kiểm tra
kí tự ñó có thuộc tập hợp hay không Còn vấn ñề tìm kiếm em sử dụng bảng băm Hashtable, Hashtable là kiểu cấu trúc
Trang 6Sinh Viên : Trần Thành ðức - Lớp : 46TH Trang 59
dữ liệu có mục tiêu tối ưu hoá việc tìm kiếm trong Net Hashtable là một kiểu từ ñiển ( kiểu tập hợp trong ñó có 2 thành phần chính liên
hệ với nhau là khóa và giá trị) ñược tối ưu cho việc truy cập nhanh Khi chúng ta truy cập một giá trị trong hashtable thì phải cấp một khóa Khóa trong hashtable có thể là kiểu dữ liệu ñược xây dựng sẵn hay cũng có thể là thể hiện của kiểu dữ liệu do người dùng tạo ra
* Vấn ñề cắt và ghép nối các Diphone.
+ Vấn ñề : Sau khi thu âm ñược các từ mẫu, vấn ñề tiếp theo là phải tách từ ñã thu ñể thu ñược các diphone mong muốn Do ñặc ñiểm từ ñơn âm tiết của tiếng Việt nên từ mẫu ñược tạo nên từ hai diphone, diphone bắt ñầu và diphone kết thúc ðể có ñược các diphone này, ta phải cắt ra các ñoạn tín hiệu từ mẫu ñã có Các diphone bắt ñầu ñược cắt từ phần bên trái của mẫu và các diphone kết thúc ñược cắt từ phần bên phải của mẫu Các ñiểm cắt ñược xác ñịnh trực tiếp bằng mắt ðiểm cắt phải thoả mãn ñiều kiện:
+ Nằm trong phần tín hiệu ổn ñịnh
+ ðiểm cắt bên phải của diphone bắt ñầu và ñiểm cắt bên trái của diphone kết thúc phải nằm tại ñỉnh cao nhất trong một chu
kỳ của phần tín hiệu tương ứng với nguyên âm (gần như tuần hoàn) ðiều này bảo ñảm rằng hai diphone dùng ñể ghép nối không
bị lệch pha nhiều
Trang 7Sinh Viên : Trần Thành ðức - Lớp : 46TH Trang 60
HÌnh 3.12 Vịtrí ñiểm cắt
Trang 8+ Ý tưởng và giải pháp : Em không sử dụng khái niệm “ñiểm cắt-ñiểm nối ” mà ñưa ra khái niệm “ðoạn nối”.Vị trí ñoạn nối này cũng vẫn phải thỏa mãn ñiều kiện là nắm trong phân tín hiệu ổn ñịnh
và vị trí ñiểm cắt cũng phải nằm tại ñỉnh cao nhất trong một chu kỳ của phần tín hiệu tương ứng Cụ thể quá trình xử lý nối hai Diphone ñược tiến hành như sau :
- Bước 1 : Tiến hành cắt Diphone như bình thường
- Bước 2 : Áp dụng biến ñổi khung OLA cho ½ chu kì bên phải của Diphone bên trái, tương tự cũng áp dụng ñổi khung OLA cho ½ chu kì bên trái của Diphone bên phải
-Bước 4 : ðiều chỉnh cường ñộ của hai Diphone ñảm bảo không có hiện tượng chênh lệch về cường ñộ do quá trình thu âm gây ra
-Bước 5 : Cộng xếp chồng hai Diphone ñể dược từ hoàn chỉnh
Nửa bên trái sau khi cắt và xử lý khung
OLA
Nửa bên phải sau khi cắt và xử lý khung OLA
Trang 10Hình 3.13 Kết quả sau khi cộng xếp chồng 2 nửa.
- ðể ý rằng do sử dụng giải thuật cộng xếp chồng hai nửa tín hiệu mà tín hiệu giường như ñược biến ñổi một cách từ
từ từ ñoạn thứ nhất sang ñoạn thứ hai, hay nói cách khác “ñoạn nối” ñã ñược làm “trơn” Và với phương pháp tách riêng hai nửa chu kì kết hợp với biến ñổi về cường ñộ cho một số khung OLA ở gần chỗ cắt hoàn toàn có thể tăng ñược ñộ dài của ñoạn nối lên To,3/2To,2To,vv…Nghĩa là làm tín hiệu ñược biến ñổi một cách dần dần từ ñoạn 1 sang ñoạn 2
- ðể thuận tiện cho người sử dụng việc cắt các Diphone
em hỗ trợ hai phương pháp Phương pháp 1 : Sử dụng một phần mềm xử lý âm thanh ñể cắt file Wav một cách trực tiếp sau ñó lưu file Wav này vào CSDL Phương pháp 2 : sử dụng
dữ liệu của một từ ñã có trong CSDL và chỉ ra vị trí ñiểm cần cắt và chương trình sẽ tự ñộng cắt lấy Diphone tương ứng Ưu ñiểm của phương pháp thứ 2 là không phụ thuộc vào chương trình trung gian và kích thước CSDL tạo ra sẽ nhỏ hơn tuy nhiên chi phí tính toán sẽ nhiều hơn so với phương pháp 1
* Vấn ñề biến ñổi cường ñộ và trường ñộ.
+ Vấn ñề : Khi ghép nối các Diphone hay ghép nối các từ có hiện tượng không ñồng bộ về cường ñộ do quá trình thu âm gây ra Vì vậy cần phải biến ñổi cường ñộ ñể cho
Trang 11cường ñộ của các từ hay các diphone ñồng bộ.Vấn ñề tiếp là trong các câu có ngữ ñiệu hay biến ñổi từ không dấu thành từ
có dấu vv thì yếu tố biến ñổi về trường ñộ cũng có vai trò quan trọng
+ Ý tưởng và giải pháp : Vấn ñề biến ñổi cường ñộ ñược thực hiện bằng cách biến ñổi trực tiếp(cộng, trừ, nhân, chia….) dữ liệu của File Wav Vấn ñề biến ñổi về trường ñộ ñược giải quyết bằng cách sử
Trang 12dụng ArrayList ñể cài ñặt mảng OLA Việc kéo dãn hay thu ngắn trường ñộ của từ ñược thực hiện bằng cách thêm hoặc bớt một phần tử của ArrayList tại vị trí xác ñịnh Lớp ArrayList hỗ trợ phương thức Insert() ñể thêm một phần tử và phương thức RemoveAt() ñể gỡ bỏ một phần tử tại vị trí xác ñịnh của mảng
* Vấn ñề biến ñổi tần số cơ
bản
+ Vấn ñề : Giải thuật TD-PSOLA sử dụng biến ñổi tần số
cơ bản của một từ không dấu ñể tạo ra từ có dấu ,vì vậy mà làm giảm kích thước CSDL
+ Ý tưởng và giải pháp : Quá trình thay ñổi tần số cơ bản ñược tiến hành bằng cách thay ñổi khoảng cách giữa các khung OLA.Chiều dài của một khung OLA là một chu kì cơ bản Tuy nhiên tâm của khung OLA lại không nằm chính giữa ðể tăng ñộ chính xác em ñưa ra khái niệm ñó là sử dụng khung OLA bất ñối xứng Trong ñó hai nửa của khung OLA nửa trái và và nửa phải ñược tách và xử lí riêng Phương pháp này cũng làm cho việc xử lí các phụ âm sát như sắc, chắc, sắn, sán, xá vv… một cách dễ dàng và mềm dẻo hơn
Trang 13Hình 3.14 Một khung OLA khi chưa qua xử lí
Trang 14Quá trình giảm tần số cơ bản sẽ là quá trình tăng khoảng cách giữa các khung OLA.Ngược lại quá trình tăng tần số cơ bản sẽ là quá trình giảm khoảng cách giữa các khung OLA Khoảng cách giữa 2 khung OLA chính bằng ½ chu kì cơ bản
Hình 3.15 Một khung OLA sau khi ñược tách và xử lí
3.2.2.2.5 Chương trình thử nghiệm.
Toàn bộ Môdun ñược ñóng gói thành một lớp trong một dll nên việc sủ
dụng rất ñơn giản Cụ thể như sau :
//Khởi tạo một ñối tượng Speaker
Speaker TL_Speak = new Speaker();
Trang 15//Phát âm ra loa.
Trang 16TL_Speak.Speak("Khoa Công Nghệ Thông Tin Trường ðại Học Thuỷ Lợi");
//Hiện ñồ thị sóng âm lên pictureBox2
TL_Speak.RenderTimeDomainLeft(ref
pictureBox2);
//Lưu File xuống ổ cứng
TL_Speak.Save(@"c:\output.w
av");