Đây là quá trình liệt kê tất cả các khả năng ghép của các phone với nhau. Một cách đơn giản chúng ta có thể viết đoạn chương trình:
Bảng 4 Một cách liệt kê các diphone
for (phone u trong tập phone) for (phone v trong tập phone)
tập diphone kết quả = add(diphone(u – v))
Trong tiếng Việt không phải cặp phone – phone nào cũng tồn tại, vì vậy, cách làm này gây ra sự lãng phí về cơ sở dữ liệu phải lưu trữ, tuy không ảnh hưởng đến chất lượng tiếng nói tổng hợp thu được sau cùng nhưng làm cho cơ sở dữ liệu bị tăng lên nhiều lần. Theo cách định nghĩa các phone như trên, sẽ không tồn tại các diphone dạng nguyên âm – nguyên âm hoặc phụ âm – phụ âm. Tôi sẽ chỉ định nghĩa những diphone có tồn tại. Để dễ dàng hơn cho việc xây dựng, tôi chia các phone vào 5 tập:
Bảng 5 Phân loại các phone
Các tập dữ liệu Các phần tử
8 phone phụ âm có thể đứng cuối (consonants_can_stay_last)
16 phone phụ âm không thể đứng cuối (consonants_cannot_stay_last)
B, D, Dd, G, GI, H, KH, L, PH, Q, R, S, TR, TH, V, X
13 phone nguyên âm có thể đứng cuối (vowels_can_stay_last)
A, E, Ee, I, O, Oo, Ow, U, Uw, OA, OE, UY, Y
24 phone nguyên âm bắt buộc phải đứng cuối (vowels_must_stay_last)
AI, AO, AU, AY, AaU, AaY, EO, EeU, IA, IEeU, IU, OI, OoI, OwI, UA, UEe, UI, UooI, UOw, UYA, UwA, UwI, UwOwU, UwU
9 phone nguyên âm không thể đứng cuối (vowel_cannot_stay_last)
Aa, Aw, IEe, OAw, OO, UAa, UYEe, UOo, UwOw
Sau khi đã chia các phone vào 5 tập như trên, ta có thể thực hiện việc liệt kê các phép ghép nối dễ dàng hơn.