1 T i i i w n d ; 2 vi vi 1 (1 )|di 1 ni 1 |; 3 if ( mode == SPIKE ) //Chế độ trễ đỉnh 4 vafactori vi. /4; 5 Di di vafactori; 6 if (Di di vi) 7 Di di vi; 8 end 9 else //Chế độ bình thường 10 vafactori vi; 11 Di di vafactori; 12 end
4.4 THUẬT TOÁN WSOLA CO DÃN GÓI CHO ĐỌC RA THÍCH NGHI
Nhƣ mô tả ở trên, đọc ra thích nghi chỉ đạt đƣợc khi từng gói thoại riêng có thể đƣợc xác định tỷ lệ co dãn mà không làm giảm chất lƣợng thoại.
Thuật toán "lấp đầy bằng sóng đồng dạng" (WSOLA, Wave Similarity Overlap-Add) đƣợc sử dụng cho kỹ thuật TSM của thoại. Kỹ thuật TSM mục đích là thay đổi tốc độ nói từng phần của thoại nhƣng vẫn giữ đƣợc độ cảm nhận của thoại nhƣ âm sắc, chất lƣợng thoại và chu kỳ thay đổi biên độ âm lƣợng (chu kỳ "pitch").
Sự xác lập tỷ lệ co dãn gói thoại đƣợc nhận biết bởi kỹ thuật co dãn thang thời gian dựa trên thuật toán WSOLA, nó là một phƣơng pháp trên cơ sở nội suy hoạt động trong toàn bộ miền thời gian. Kỹ thuật này đã đƣợc sử dụng trong [29] để thiết lập tỷ lệ các khối audio dài, sửa và cải tiến trong [1 7] và [27] để che dấu mất gói bằng cách dãn khối của một vài gói. Ý tƣởng cơ bản của WSOLA là phân tích đầu vào thành các đoạn với chiều dài tƣơng đƣơng và các phần đầu chồng lấp lên nhau. Đặc biệt, WSOLA tạo ra dạng sóng tổng hợp
y(n), mà vẫn bảo đảm sự đồng dạng tối đa với dạng sóng gốc x(m). Sự sắp xếp lại dẫn đến chiều dài thoại ra đƣợc thay đổi. Để các đoạn này đƣợc bổ sung trong phần chồng lấp, các vị trí liên quan của chúng trong đầu vào đƣợc tìm thấy qua tìm kiếm tƣơng quan chéo tối đa giữa chúng, để chúng có sự đồng dạng tối đa và sự chồng lấp sẽ không gây nên bất cứ sự gián đoạn gì ở đầu ra.
Cửa sổ trọng số đƣợc áp dụng với các đoạn trƣớc khi chúng đƣợc ghép nối với đoạn đầu chồng lấp với nhau để tạo ra sự chuyển tiếp mịn giữa đoạn ghép nối đƣợc khôi phục ở đầu ra. Để xử lý thoại, WSOLA có ƣu điểm là bảo toàn c hu kỳ “pitch”, đây là yêu cầu khắt khe để đảm bảo về mặt chất lƣợng âm thoại.
4.4.1 Cải tiến thuật toán WSOLA cho từng gói
Trong [17], do tính tự nhiên của mất gói và hoạt động đa gói, trễ với khoảng thời gian 2 đến 3 gói đƣợc xem xét cho việc dãn gói. Vì mục tiêu của đọc ra thích nghi là để giảm bớt trễ, trễ xử lý thấp hơn là điều mong muốn. Do đó chúng ta phải biến đổi thuật toán WSOLA và cải tiến nó thực hiện với mỗi gói. Mặt khác, một gói đến có thể đƣợc xác lập tỷ lệ co dãn ngay lập tức và độc lập mà không làm tăng them trễ xử lý. Để xác lập tỷ lệ co dãn một gói, trƣớc tiên chúng ta chọn một đoạn mẫu có chiều dài cố định ở đầu vào và sau đó tìm kiếm đoạn đồng dạng với đoạn mẫu. Đoạn đồng dạng bắt đầu đƣợc tìm kiếm trong vùng tìm kiếm nhƣ trong hình 4.9. Khi thực hiện trên từng gói, việc tìm kiếm cho một đoạn đồng dạng đƣợc chặt chẽ hơn, vì sự tập hợp lại các đoạn đồng dạng phải đƣợc thực hiện trong các khối của chu kỳ “pitch” và có ít hơn các chu kỳ “pitch” trong một gói ngắn. Với chiều dài một gói là 20 ms (ví dụ chuẩn G.729) và tuỳ thuộc vào giới tính của ngƣời nói, có thể có ít hơn hai chu kỳ “pitch”, điều này làm cho nó khó trích ra đoạn đồng dạng. Để khắc phục vấn đề này, chúng ta thay đổi thuật toán để giảm chiều dài đoạn cho tính toán tƣơng quan và vị trí đoạn mẫu đầu tiên bắt đầu của gói vào, nhƣ thể hiện trên hình 4.9(a). Để kéo dãn các gói ngắn, chúng ta di chuyển vùng tìm kiếm cho đoạn đồng dạng đầu tiên tới gói trƣớc đó để có phạm vi rộng hơn tìm kiếm các dạng sóng đồng dạng, nhƣ gợi ý trong [12]. Trong hình 4.9(a), mặc dù gói đầu vào bắt đầu trong chu kỳ pitch thứ 2, đoạn đồng dạng đƣợc tìm thấy trong chu kỳ của pitch thứ nhất. Mặc dù gói trƣớc đó có thể sẵn sàng đọc ra ở thời điểm xác lập thang thời gian, sóng đồng dạng có thể vẫn đƣợc trích ra từ nó để cấu trúc cho đầu ra mới mà không gây trễ gói trƣóc đó. Một khi đoạn đồng dạng đƣợc tìm thấy, trọng số đƣợc tăng thêm bởi mở rộng cửa sổ và tăng thêm trọng số đoạn mẫu bởi cửa sổ dốc đối xứng. Đoạn đồng dạng tiếp theo bởi phần còn lại của mẫu trong gói tiếp theo sau đó đƣợc di chuyển và đƣợc xếp chồng lên với đoạn mẫu để tạo ra dạng sóng cho đầu ra. Kết quả đầu ra dài hơn đầu vào do vị trí tƣơng đối của đoạn đồng dạng tìm thấy và sự dịch chuyển của đoạn đồng
dạng nhƣ trình bày trên hình 4.9(a). Ý nghĩa của khai triển phụ thuộc vào vị trí và cỡ của vùng tìm kiếm đƣợc định nghĩa.
Trong hình 4.9 giữa các chu kỳ “pitch” trong đoạn sóng đƣợc phân chia bởi đƣờng nét đứt thẳng đứng và đƣợc đánh dấu với các số thứ tự. Ví dụ trong hình 4.9, chúng ta có thể quan sát từ dạng sóng đƣa ra mà một chu kỳ pitch bổ sung đƣợc tạo ra và bổ sung nhƣ kết quả của sự tập hợp lại và chồng lấp của các đoạn đƣợc trích ra từ đầu vào. Tuy nhiên, chu kỳ “pitch” mở rộng không chỉ là sự lặp lại của chu kỳ “pitch” nào từ đầu vào mà là nội suy từ một vài chu kỳ pitch.
Để tìm kiếm đoạn đồng dạng của đoạn mẫu trong vùng tìm kiếm, sử dụng hàm tƣơng quan để tính toán giữa đoạn mẫu (TemplateBlock) và đoạn nguồn (SourceBlock) trong miền tìm kiếm. Mỗi đoạn nguồn trong miền tìm kiếm đồng dạng đƣợc dịch đi , trong đó -L/2 -L/2-1 với L là chiều dài của miền tìm kiếm.
Đánh giá mức độ đồng dạng sử dụng hàm tƣơng quan chéo nhƣ công thức (4.17) dƣới đây. ) ( ) ( ) ( 0 k k SourseBloc x k ock TemplateBl N k (4.17)
Trong đó, N là chiều dài của một đoạn. Cửa sổ trọng số sử dụng cho tìm kiếm là cửa sổ cosin tăng (raised-cosine), h(n)=0.5-0.5cos(2 n/N). Cỡ của cửa sổ đƣợc thiết lập là chiều dài của đoạn N.
Tín hiệu vào
Gói vào Gói vào
Chu kỳ Pitch
Đoạn mẫu Cửa sổ trọng số
Đoạn đồng dạng
Tìm k iếm dạng sóng đồng dạng
Hình 4.9: (a) dãn và (b) nén từng gói sử dụng TSM
Chất lƣợng thoại và thời gian tính toán của thuật toán phụ thuộc vào cỡ đoạn và chiều dài của vùng tìm kiếm cho đoạn nguồn. Các đoạn lớn sẽ chứa nhiều chu kỳ pitch nên việc tìm tƣơng quan đồng dạng giữa đoạn mẫu và đoạn đồng dạng tốt hơn. Tuy nhiên, nếu cỡ đoạn quá lớn sẽ sinh tiếng vọng và các âm thanh lạ ở đầu ra. Vùng tìm kiếm lớn cũng sẽ cho kết quả tƣơng quan tốt hơn nhƣng cũng phải tính toán nhiều hơn.
Trong hình 4.9(a) ba chu kỳ pitch đầu tiên là sự chồng lấp có trọng số của các chu kỳ pitch 1/2, 2/3, và 3/4 tƣơng ứng. Điều này giải thích tại sao chất lƣợng âm thanh sử dụng kỹ thuật co dãn thời gian là tốt hơn lặp lại “pitch” (nhƣ trình bày trong chƣơng 3). Tƣơng tự nhƣ thế cho việc nén gói, trong đó thông tin đƣợc mang bởi chu kỳ “pitch” đƣợc chặt nhỏ để bảo tồn và phân bổ trong số chu kỳ còn lại. Tuy nhiên, thực hiện với từng gói mô tả trên có ƣu điểm giống nhƣ lặp “pitch” là không làm tăng thêm trễ.
Nếu thoại đầu ra không tiệm cận đƣợc chiều dài mong đợi sau một số tính toán thì sự lặp lại bổ sung đƣợc thực hiện. Trong một sự lặp lại tiếp theo, một đoạn mẫu mới của cùng chiều dài đƣợc định nghĩa ngay lập tức theo mẫu trong đoạn lặp lại cuối cùng. Tất cả các đoạn mẫu đƣợc định nghĩa và mẫu còn lại sau
mẫu cuối cùng trong đầu vào để bao trùm toàn bộ đầu ra với chiều dài cần đạt đƣợc. Con số tổng của các đoạn mẫu đƣợc xác định và số của đoạn lặp đƣợc sử dụng ở đây là:
1
W Li
(4.18)
Trong đó [x] biểu diễn cho số tự nhiên lớn nhất mà nhỏ hơn hoặc bằng x, i L
là chiều dài cần đạt đƣợc của đầu ra và W là chiều dài của đoạn (hoặc là đoạn mẫu hoặc là đoạn đồng dạng).
Nén gói đƣợc thực hiện theo cách tƣơng tự nhƣ mô tả trong hình 4.9(b). Chỉ một điểm khác đó là vùng tìm kiếm cho đoạn đồng dạng sẽ không đƣợc định nghĩa trong gói trƣớc đó để tạo ra ở đầu ra ngắn hơn chiều dài. Nén gói thành công yêu cầu một gói chứa đựng nhiều hơn một "pitch", nó giới hạn chiều dài tối thiểu của gói có thể đƣợc nén. Tuy nhiên, chiều dài một gói phổ biến cỡ 20 ms thƣờng hiệu quả vì giá trị "pitch" dƣới 100 Hz là không thƣờng xuyên trong tín hiệu thoại. Cũng có thể trong một vài trƣờng hợp, nén gói không thể đƣợc thực hiện, nó không thích hợp với trễ nén với các gói tiếp sau đó.
So sánh dạng sóng đầu vào và đầu ra trong hình 4.9, nó hiển nhiên là bảo đảm hoạt động tần số "pitch" của thoại đầu vào. Chỉ có chiều dài các gói thay đổi và do đó tốc độ thoại đƣợc biến đổi.
Một điểm lợi của kỹ thuật nghiên cứu trong luận văn này với một gói ngắn đó là đầu vào đƣợc chia thành ít các đoạn mẫu hơn để chỉ một hoặc hai đoạn lặp đặc trƣng sẽ cho một đầu ra có chiều dài nhƣ mong đợi. Đặc điểm quan trọng khác của thuật toán thể hiện rõ trong hình 4.9 đó là bắt đầu và kết thúc của mỗi gói không bị biến đổi. Nhƣ kết quả, khi các gói đƣợc sửa đổi tái tạo đƣợc nối vào mà không gây chồng chéo lên nhau bảo đảm sự chuyển đổi dạng sóng tự nhiên và trơn mƣợt. Do đó, các gói đƣợc sửa đổi độc lập và gửi đi đế n hàng đợi đầu ra. Kiểu thực hiện này là rất phù hợp cho bộ lập chƣơng trình đọc ra thích nghi cao.
4.4.2 Thực hiện tính toán thời gian đọc ra
Vì co dãn các tỷ lệ các gói đã đƣợc thực hiện theo bội số tự nhiên của các chu kỳ "pitch", nó không thể thực hiện chiều dài tuỳ ý gói và thời gian đọc ra nhƣ đƣợc mong đợi cho đọc ra thích nghi. Mặt khác, chiều dài gói tính toán đƣợc thực tế Li sau một gói WSOLA có thể chỉ xấp xỉ chiều dài đƣợc yêu cầu
i
L . Vì lý do này, chúng ta định nghĩa "ngƣỡng dãn" và "ngƣỡng nén". Nếu chỉ thời gian đọc mong muốn lớn hơn thời gian đọc đƣợc lập trình do vƣợt quá ngƣỡng nén, chúng ta sẽ nén một gói để tăng tốc độ đọc ra. Ngƣỡng nén thƣờng lớn hơn một chu kỳ pitch điển hình. Sử dụng cùng phƣơng pháp để dãn một gói, trừ phi hai ngƣỡng nén là không đối xứng. Để ngăn chặn mất gói do trễ không cần thiết, chúng ta áp dụng nén từ từ đủ để tránh rớt dƣới thời gian đọc ra. Ngƣỡng dãn nhỏ hơn đƣợc định nghĩa có thể nhỏ hơn một chu kỳ “pitch”. Trong trƣờng hợp này chúng ta dãn gói và giảm tốc độ đọc ra để làm thích nghi