Tải bản đầy đủ (.doc) (25 trang)

BÀI tập lớn xử lý TIẾNG nói xử lý đồng hình

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (599.86 KB, 25 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BỘ MÔN KỸ THUẬT MÁY TÍNH
*********

BÁO CÁO BÀI TẬP LỚN XỬ LÝ TIẾNG NÓI

Đề Tài : Xử lý đồng hình

Giáo viên hướng dẫn:
GS.TS. Trịnh Văn Loan
Sinh viên thực hiện:
Nguyễn Thượng Khang

MSSV: 20083366

Nguyễn Anh Sơn

MSSV: 20082230
Lớp : KTMT– K53

Hà Nội - 2012


Mục lục
I. Lý thuyết:......................................................................................................3
1.

Khái niệm tiếng nói và xử lý tiếng nói:..................................................3
1.1.


Tiếng nói:..........................................................................................3

1.2.

Xử lý tiếng nói:..................................................................................3

2.

Bộ máy phát âm của con người:.............................................................3

3.

Các đặc tính của âm thanh:....................................................................4

4.

3.1.

Đặc tính vật lý của âm thanh:..........................................................4

3.2.

Đặc tính âm học của âm thanh:.......................................................4

Xử lý tín hiệu tiếng nói:..........................................................................8
4.1.

Sự biểu hiện và phân tích tiếng nói:................................................8

4.2.


Phương pháp xử lý đồng hình:......................................................11

4.3.

Xác định tần số cơ bản F0:............................................................13

II. Thiết kế chương trình:...............................................................................16
1.

Cấu trúc file wave:................................................................................16
1.1.

Khái niệm về tập tin wave...............................................................16

1.2.

Cấu trúc tập tin wave:.....................................................................17

2.

Phân tích và thiết kế chức năng chương trình:...................................20

3.

Cài đặt chương trình:............................................................................20

4.

Thử nghiệm chương trình:...................................................................27


2


I. Lý thuyết:
1. Khái niệm tiếng nói và xử lý tiếng nói:
1.1. Tiếng nói:
Tiếng nói là phương tiện trao đổi thông tin của con người. Trung khu thần
kinh điều khiển hệ thống phát âm và tạo ra âm thanh.
Tiếng nói phân biệt với các âm thanh khác bởi các đặc tính âm học có
nguồn gốc từ cơ chế tạo tiếng nói. Về bản chất tiếng nói là sự giao động của
không khí có mang theo thông tin. Các giao động này tạo thành những áp lực
đến tai và được tai phát hiện, phân tích chuyển đến trung khu thần kinh. Lúc này
tại trung khu thần kinh thông tin được tái tạo dưới dạng tư duy logic mà con
người có thể hiểu được.
Tín hiệu tiếng nói được tạo thành bởi chuỗi các âm vị liên tiếp. Sự sắp
xếp của các âm vị được chi phối bởi các quy tắc của ngôn ngữ.
1.2. Xử lý tiếng nói:
Xử lý tiếng nói là xử lý thông tin chứa trong tín hiệu tiếng nói nhằm lan
truyền, lưu trữ tín hiệu tiếng nói hoặc là tổng hợp nhận dạng tiếng nói.
Mục đích của việc xử lý tiếng nói:
- Mã hóa tiếng nói: Để lan truyền và lưu trữ tiếng nói một cách hiệu quả.
- Tổng hợp và nhận dạng tiếng nói: Giúp giải quyết các vấn về giao
tiếp giữa con người và hệ thống nói chung bằng tiếng nói.
- Phân tích tiếng nói: Phục vụ cho việc nghiên cứu về tín hiệu tiếng nói.
2. Bộ máy phát âm của con người:
Các thành phần giúp cho con người có thể phát âm bao gồm: Phổi, khí
quản và các đường dẫn miệng mũi.
Thanh quản: Chứa hai dây thanh và có thể giao động tạo ra sự cổng
hưởng cần thiết để tạo ra âm thanh. Khoảng cách giữa hai dây thanh gọi là thanh

môn.
Vị trí nguồn âm của âm tuần hoàn nằm tại thanh môn.
Chu kì rung của dây thanh (T0) được gọi là chu kì cơ bản, 1/T0 được gọi
là tần số cơ bản. Toàn bộ bộ máy phát âm tính từ thanh môn trở lên gọi là tuyến
âm.
Cơ chế phát âm:
- Tuyến âm được kích thích bởi nguồn năng lượng chính tại thanh môn.
Luồng khí từ phổi đi lên qua khí quản, luồng khí này sẽ va chạm vào hai dây
thanh trong tuyến âm. Hai dây thanh dao động sẽ tạo ra cộng hưởng, dao động
âm sẽ được lan truyền theo tuyến âm và sau khi đi qua khoang mũi và môi sẽ
tạo ra tiếng nói.
- Khoang mũi là ống không đều bắt đầu từ môi. Kết thúc bởi vòm miệng,
có độ dài cố định khoảng 12cm đối với người lớn.
- Vòm miệng là các nếp cơ chuyển động.
3. Các đặc tính của âm thanh:
3.1. Đặc tính vật lý của âm thanh:

3


- Độ cao: Độ cao hay còn gọi là độ trầm bổng của âm thanh. Độ trầm
bổng của âm thanh phụ thuộc vào sự chuyển động nhanh hay chậm của các
phần tử không khí trong một đơn vị thời gian. Nói cách khác, độ cao phụ thuộc
vào tần số giao động. Đối với tiếng nói, tần số giao động của đôi dây thanh qui
định độ cao giọng nói của con người và mỗi người có một độ cao giọng nói
khác nhau.
- Cường độ: Cường độ là độ to nhỏ của âm thanh, cường độ càng lớn thì
âm thanh truyền đi càng xa trong môi trường có nhiễu. Cường độ của sóng tiếng
nói do biên độ dao động của song qui định. Trong tiếng nói, cường độ của
nguyên âm thường lớn hơn phụ âm nên tai người nghe nguyên âm dễ hơn.

- Độ dài: Độ dài của âm phụ thuộc vào sự chấn động lâu hay mau của
các phần tử không khí. Cùng một âm nhưng trong các từ khác nhau thì độ dài
khác nhau.
- Âm sắc: Âm sắc là sắc thái riêng của một âm, cùng một nội dung, cùng
một độ cao nhưng mỗi người có âm sắc khác nhau.
3.2. Đặc tính âm học của âm thanh:
Như đã nói tiếng nói được tạo thành bởi các chuỗi âm vị lien tiếp. Sự sắp
xếp của các âm vị được chi phối bởi các qui tắc ngôn ngữ. Mỗi ngôn ngữ có số
lượng các âm vị khác nhau, thông thường cỡ 20 – 30 và bé hơn 50 cho mọi
ngôn ngữ. Các âm vị chia làm hai loại chính nguyên âm và phụ âm.
a. Nguyên âm và phụ âm:
Tín hiệu tiếng nói là tín hiệu tương tự biểu diễn thông tin về mặt ngôn
ngữ và được mô tả bởi các âm vị khác nhau. Như vậy âm vị là đơn vị nhỏ nhất
của ngôn ngữ. Tùy theo từng ngôn ngữ cụ thể mà số lượng các âm vị khác nhau.
Các âm vị được chia thành: nguyên âm và phụ âm.
Nguyên âm: Nguyên âm được tạo thành bằng sự cộng hưởng của dây
thanh khi dòng khí được thanh môn đẩy lên. Khoang miệng được tạo lập thành
nhiều hình dạng nhất tạo thành các nguyên âm khác nhau. Mỗi nguyên âm được
đặc trưng bởi ba formant đầu.
Phụ âm: Phụ âm được tạo ra bởi các dòng khí hỗn loạn được phát ra gần
những điểm co thắt của đường dẫn âm thanh do cách phát âm tạo thành. Dòng
không khí tại chỗ đóng của vòm miệng tạo ra phụ âm tắc. Những phụ âm xát
được phát ra từ chỗ co thắt lớn nhất và các âm tắc xát tạo ra từ khoảng giữa. Phụ
âm có đặc tính hữu thanh và vô thanh tùy thuộc vào dây thanh có dao động để
tạo thành cộng hưởng không. Đặc tính của phụ âm tùy thuộc vào tính chu kì của
dạng song, phổ tần số, thời gian tồn tại và sự truyền âm.
Hệ thống âm vị: Hệ thống âm vị bao gồm 11 nguyên âm đơn, 3 nguyên
âm đôi và 22 phụ âm. Sự phân biệt nguyên âm là theo độ nâng của lưỡi và sự
chuyển động của lười. Sự phân loại phụ âm là theo tắc hay xát, hữu thanh hay
vô thanh…

11 nguyên âm đơn:
4


STT

Nguyên âm đơn

Ví dụ

1

Y

Ý chí

2

Ê

Ê chề

3

A

A ha

4


Ă

Mắt

5

Â

Cần cù

6

Ơ

Chơi vơi

7

Ư

Uu tư

8

Ô

Cô giáo

9


O

Con bò

10

U

Xích đu

11

E

E dè

Nguyên âm đôi:
STT

Nguyên âm đôi

1

ia, yê, iê, ya

2

ua, uô

3


ưa, ươ

22 phụ âm
STT

Phụ âm

STT

Phụ âm

1

B

12

Tr

2

P

13

S
5



3

V

14

R

4

Ph

15

Ch

5

M

16

Nh

6

Đ

17


Ng, ngh

7

T

18

Kh

8

Th

19

G, gh

9

D, gi

20

H

10

N


21

X

11

L

22

C, k, q

b. Âm hữu thanh và âm vô thanh:
Âm hữu thanh: Âm hữu thanh được tạo ra từ các dây thanh bị căng đồng
thời và chúng rung động ở chế độ dãn khi không khí tăng lên làm thanh môn mở
ra và sau đó thanh môn xẹp xuống. Do sự cộng hưởng của dây thanh, sóng âm
tạo tạo ra có dạng gần như tuần hoàn. Phổ của âm hữu thanh có nhiều thành
phần hài tại giá trị bội số của tần số cộng hưởng, còn gọi là tần số cơ bản.
Âm vô thanh: Khi tạo ra âm vô thanh dây thanh không cộng hưởng.
Nguồn của âm vô thanh là nguồn là nguồn không tuần hoàn. Nó có vị trí không
cố định mà thay đổi theo âm chúng ta tạo ra. Phổ của nguồn âm khá đều trong
một phạm vi rộng từ vài Hz đến KHz. Tuyến âm được đặc trưng bởi các bộ lọc
thông dải.Tín hiệu đầu ra cũng là ngẫu nhiên.
c. Các yếu tố khác:
Tỷ suất thời gian: Trong khi nói chuyện, khoảng nói chuyện và khoảng
nghỉ xen kẽ nhau. Tỷ số thời gian nói và nghỉ gọi là tỷ suất thời gian.
Hàm năng lượng ngắn: Việc nghiên cứu xử lý tiếng nói trong thực tế chỉ
trong một thời gian hữu hạn (về mặt lý thuyết thì phải xét cho đến vô cùng), hay
trên số mẫu xác định. Việc nghiên cứu trên các mẫu này với các kĩ thuật nhất
định sẽ cho kết quả gần đúng so với lý thuyết. Thông thường việc lấy mẫu tín

hiệu tiếng nói được thực hiện thông qua các cửa sổ.
Tần số vượt qua điểm không: Tần suất vượt qua điểm không là số lần
biên độ tín hiệu tiếng nói vượt qua giá trị không trong khoảng thời gian cho
trước. Thông thường giá trị này của âm vô thanh lớn hơn âm hữu thanh do đặc
tính ngẫu nhiên của âm vô thanh. Đặc điểm này cũng được ứng dụng trong quá
trình tiền xử lý trong nhận dạng tiếng nói tự động.
Phát hiện điểm cuối: Trong xử lý tiếng nói việc xác định khi nào bắt đầu
xuất hiện và kết thúc quá trình nói là rất quan trọng và cần thiết. Có nhiều
phương pháp,ví dụ như sau:
6


Lấy một mẫu nhỏ của nền nhiễu trong khoảng thời gian yên lặng trước
khi nói. Dùng hàm năng lượng thời gian ngắn để tính năng lượng cho mẫu,
ngưỡng của tiếng nói được chọn là giá trị giữa năng lượng yên tĩnh và năng
lượng đỉnh. Ban đầu giả thiết điểm cuối xuất hiện tại điểm năng lượng tín hiệu
vượt qua ngưỡng. Để tính đúng ước lượng này, người ta giả thiết so sánh chúng
với giá trị đó trong vùng yên tĩnh. Khi những thay đổi phát hiện được trong khi
tính toán tần suất trên ở ngoài ngưỡng giả thiết thì điểm cuối được giả thiết lại
tại điểm mà sự thay đổi xẩy ra.
Tần số cơ bản

Người nói

80 – 200 Hz

Đàn ông

150 – 450 Hz


Phụ nữ

200 – 600 Hz

Trẻ em

Đối với hai âm có cùng độ cao, cường độ sẽ được phân biệt bởi tính tuần
hoàn. Một âm hữu thanh có tính tuần hoàn khi phân tích phổ sẽ xuất hiện sẽ
xuất hiện một vạch tại vùng tần số rất thấp. Vạch này đặc trưng cho tần số cơ
bản của âm. Trong hội thoại tần số cơ bản thay đổi liên tục.
Formant: Trong phổ tần số của tín hiệu tiếng nói, mỗi đỉnh có biên độ
cao nhất xét trong xét trong một khoảng nào đó (cực đại khu vực) xác định một
formant. Ngoài tần số, formant còn được xác định cả biên độ và giải thông của
chúng. Về mặt vật lý các tần sô formant tương ứng với các tần số cộng hưởng
tuyến âm. Trong xử lý tiếng nói đặc biệt là trong tổng hợp tiếng nói, để mô
phỏng lại tuyến âm người ta phải xác định được các tham số formant đối với
từng loại âm vị, do đó việc đánh giá ước lượng các formant có ý nghĩa rất quan
trọng.
Tần số formant biến đổi trong một dải rộng thuộc vào giới tính người nói
và đối với từng âm vị. Đồng thời formant còn phụ thuộc vào các âm vị trước và
sau nó. Thông thường phổ tần số tiếng nói chứa khoảng 6 formant nhưng ảnh
hưởng lớn nhất đến đặc tính của âm vị là 3 formant đầu tiên.
Tần số formant đặc trưng cho nguyên âm biến đổi tùy thuộc vào người
nói trong điều kiện phát âm nhất định. Mặc dù phạm vi tần số formant của các
nguyên âm có thể trùng lên nhau nhưng vị trí giữa các formant đó không đổi vì
sự xê dịch của các formant là song song.
4. Xử lý tín hiệu tiếng nói:
Kỹ thuật phân tích tiếng nói có thể được phân lớp vào miền tần số và
miền thời gian. Mục đích chính trong phân tích tiếng nói là đánh giá đáp ứng
tần số của bộ máy phát âm (tuyến âm). Các kỹ thuật xử lý tín hiệu tiếng nói

7


thông thường là dung dãy các bộ lọc, phân tích Fourier, xử lý đồng hình hoặc
cepstral.
Khái niệm “short time analysis” là cơ sở cho hầu hết các kỹ thuật phân
tích tiếng nói. Giả sử rằng trong khoảng thời gian dài tín hiệu tiếng nói là không
dừng nhưng với khoảng thời gian đủ nhỏ (10 – 30 ms), có thể xem nó là dừng.
Đây là lý do mà sự thay đổi phổ tín hiệu tiếng nói có liên hệ trực tiếp với sự
chuyển động của hệ phát âm (môi, cổ họng…) và các rang buộc ngữ cảnh, sinh
lý khác. Vì vậy các hệ thống phân tích tiếng nói đều thực hiện trên cơ sở thời
gian biến đổi, với các khung thời gian được chọn 10 -30 ms.
4.1. Sự biểu hiện và phân tích tiếng nói:
Tiếng nói liên tục là tập hợp các âm thanh phức tạp mà chúng ta khó sản
sinh nhân tạo. Tín hiệu tiếng nói được tạo thành bởi các chuỗi âm vị liên tiếp
bao gồm nguyên âm và phụ âm. Trong tín hiệu tiếng nói bao gồm F0 và các
thành phần được sản sinh bởi các giây thanh. Tuyến âm thay đổi các tín hiệu
nguồn tạo nên Formant. Mỗi tần số Formant có một biên độ và giải thông và đôi
khi khó có thể định nghĩa các tham số này một cách chính xác. Tần số cơ bản và
tần số Formant là những khái niệm quan trọng nhất trong tổng hợp và xử lý
tiếng nói nói chung.
Các âm vô thanh không có tần số cơ bản và có thể được xem là nhiễu
trắng. Thì thầm là trường hợp đặc biệt của tiếng nói, khi thì thầm thì ở đó không
có tần số cơ bản.
Dạng tiếng nói của 3 nguyên âm (/a/, /i/, /u/). Với miền thời gian và miền
tần số như trong hình sau.

Hình 1: Miền thời gian và miền tần số của nguyên âm a,e, i, u
Tần số của âm thanh bình thường nằm trong khoảng 300 Hz đến 3400
Hz. Vì vậy để biểu diễn tín hiệu tiếng nói trong kênh thoại thì 3 formant đầu là

đủ. Để chất lượng cao hơn tần số lấy mẫu phải nằm từ 10 kHz tới 20kHz.

8


Phương pháp thường sử dụng để mô tả tín hiệu tiếng nói là spectrogram
(ảnh phổ) mà qua đó biểu diễn thời gian – tần số - biên độ của một tín hiệu. Khi
đó miền có tần số cao hơn thì màu xám hơn. Phổ của nguyên âm và phụ âm
cũng dễ dàng nhận thấy. Do vậy ảnh phổ là phương pháp biểu diễn hữu ích nhất
để nghiên cứu tiếng nói.

Hình 2: Ảnh phổ biểu diễn miền thời gian của từ kaksi

Để xác định tần số cơ bản của tiếng nói thì sơ đồ khối như sau:
Bộ lọc hiệu
chỉnh

Cửa sổ

FFT

Log10|. |

Phân tích Cepstral cung cấp phương pháp để tách riêng tuyến âm và
nguồn kích thích. Tín hiệu tiếng nói sau khi qua bộ lọc hiệu chỉnh (thực chất là
bộ lọc thông cao) với hệ số truyền đạt:
H(z) = 1 – az-1, a < 1 và thường được chọn cỡ 0.95 – 0.98.
Bộ lọc hiệu chỉnh dùng để xét ảnh hưởng của tuyến âm trong miền tần số.
Do đặc tính phổ của tín hiệu nguồn, âm hữu thanh năng lượng tập trung ở miền
tần thấp có độ dốc phổ là 12dB/octave. Môi là bộ lọc thông cao có độ dốc cỡ

9


6dB/octave. Để phổ bằng phẳng hơn cần bộ lọc hiệu chỉnh bù lại 12dB/octave –
6dB/octave, do đó người ta chọn a = 0.95 – 0.98. Cửa sổ thường được chọn là
cửa số Hamming nhằm giảm sai số phân tích phổ khi độ dài tín hiệu hữu hạn.
Quá trình lấy log10| . | cho phổ đều hơn.
4.2. Phương pháp xử lý đồng hình:
Chúng ta đã biết rằng tín hiệu tiếng nói gồm ba thành phần, một dãy các
xung mô tả các pitch, xung kích thích và đáp ứng xung của ống thanh. Trong
miền thời gian, gọi s(n) là tín hiệu nguồn, e(n) là tín hiệu kích thích và h(n) biểu
diễn đáp ứng xung của ống thanh.
s(n) = e(n) * h(n).
Biến đổi Fourier 2 vế ta có
S() = E() . H().
Quan hệ biên độ:
|S()| = |E()| . |H()|.
Logarithm hóa hai vê ta có
log{|S()|} =log{|E()|} + log{|H()|}.
Như vậy logarithm của |S()| là tổng logarithm của |E()| và |H()|. Hơn nữa |
H()| được quyết định bởi tuyến âm theo hướng tần số biến đổi chậm, trong khi đó
phân bố |E()| có chu kì biến đổi nhan hơn theo tần số. Điều này có nghĩa là hai thành
phần này có thể phân tách nhau nhờ toán tử lọc. Phép lọc này thông thường được thực
hiện nhờ biến đổi Fourier ngược của log{|S()|}, cho ta cepstrum của tín hiệu. Trong
Cepstrum, chu kì pitch phân bố có tính chu kì, trong khi đó phân bố của tuyến âm xảy
ra gần trục hoành hơn bởi vì biến đổi chậm hơn.
Sơ đồ hệ thống đồng hình cho phân tích tiếng nói.

Bộ lọc
hiệu chỉnh


Cửa sổ
hamming

FFT

Log10|. |

FFT-1

Trong ảnh phổ xuất hiện các họ hài với chu kì của nguồn xung làm cho
việc quan sát trở nên khó khăn. Nếu cùng lúc có nhiều nguồn xung tuần hoàn
với các tần số khác nhau, trong ảnh phổ sẽ xuất hiện các họ hài với các chu kì
khác nhau của các nguồn, nên cần phải dung đến cepstrum. Trong cepstrum ta
có thể nhận ra các xung nhảy vọt đặc trưng cho các họ hài của phổ. Nếu ta chặn
được các xung của cepstrum này, tính được dãy tín hiệu theo thời gian sau khi
đã dùng phép biến đổi ngược, thì lúc đó ta sẽ có dạng đáp ứng xung đặc trưng
cho sự truyền đạt của hệ thống. Nếu dùng lọc tần số thấp để chặn tất cả các tín
hiệu trừ xung của cepstrum đặc trưng cho nguồn xung thì sau phép biến đổi
ngược ta nhận lại được tín hiệu theo thời gian của đáp ứng nguồn xung.

10


Hình 3: Tín hiệu tuần hoàn.
Ta thấy Cepstrum biến đổi tương đối chậm đặc trưng cho hàm truyền đạt
và Cepstrum nhảy vọt đại diện cho sự lặp lại tuần hoàn.

Hình 4: Cepstrum tương ứng của tín hiệu tuần hoàn.
Sử dụng Cepstrum trong việc đánh giá cường độ và các tần số đỉnh cộng

hưởng. Nếu không có sự dao động tuần hoàn trong phổ thì trong Cepstrum
tương ứng sẽ không có đỉnh xuất hiện. Do đó, với mọi âm thanh có chu kì
cường độ ngắn nhất, đỉnh cường độ xuất hiện trong các vùng nơi mà các thành
phần Cepstrum khác đã suy giảm đi đáng kể, nên khó phát hiện xung nhảy vọt.
Vì vậy, tốt nhất nên sử dụng một ngưỡng thấp trong quá trình tìm kiếm đỉnh
cường độ.

Hình 5: Tín hiệu không tuần hoàn.
Quan sát Cepstrum tương ứng ta thấy không có gì nổi trội.

11


Hình 6: Cepstrum tương ứng.
4.3. Xác định tần số cơ bản F0:
Theo các kết quả khảo sát và nghiên cứu, tần số cơ bản:
Giọng nam: 80 – 250 Hz.
Giọng nữ: 150 – 500 Hz.
Chúng ta thấy rằng với âm hữu thanh, có một đỉnh cao nhất trong
cepstrum tại chu kì cơ bản âm đầu vào. Không có đỉnh cao nhất xuất hiện trong
cepstrum đối với âm vô thanh. Những đặc tính của cepstrum được sử dụng cho
việc xác định tần số cơ bản cho âm hữu thanh hay vô thanh và ước lượng chu kì
cơ bản cho âm hữu thanh.
Một số phương pháp xác đinh F0:
- Dựa vào hàm tự tương quan.
- Dựa vào hàm vi sai biên độ trung bình.
- Dùng bộ lọc đảo và hàm tự tương quan.
- Xử lý đồng hình.
Đối với phương pháp xử lý đồng hình, ta thấy từ biểu thức (2.2):
x^(n) = s^(n) + u^(n)

(2.2).
Ta tách thành phần s^(n) bằng cách nhân x^(n) với cửa số (chữ nhật
chẳng hạn), biến đổi Fourier ta được phổ dexiben của nguồn.
Trong phổ dexiben của nguồn, đỉnh cao nhất và gần gốc nhất là tần số cơ
bản F0.
Đường bao của thủ tục ước lượng chu kì dựa trên cepstrum đơn giản hơn.
Cepstrum được tìm kiếm với đỉnh cao nhất trong lân cận của chu kì thời gian
được kì vọng. Nếu đỉnh cao nhất của cepstrum nằm bên trên ngưỡng thiết lập
trước đó, tín hiệu âm đầu vào giống như âm hữu thanh và vị trí của đỉnh cao
nhất là ước lượng tốt cho chu kì thời gian. Nếu đỉnh cao nhất không vượt qua
ngưỡng, nó giống như đầu vào của âm vô thanh. Sự biến thiên thời gian của chế
độ kích thích và chu kì thời gian có thể được ước lượng bằng cách tính toán một
giá trị cepstrum phụ thuộc thời gian dựa trên biến đổi Fourier phụ thuộc thời
gian. Điển hình, cepstrum được tính toán mỗi khoảng thời gian 10 – 20 ms vì
các tham số kích thích không thay đổi trong tín hiệu tiếng nói thông thường.
Để tính tần số cơ bản dựa trên cepstrum, ta phải tính được chu kì T0 của
tín hiệu tiếng nói. Giả sử có một khung cửa sổ với độ dài 32ms, tại thời điểm
12


đầu tiên ta xác định hai đỉnh cao nhất trên cepstrum, khoảng cách giữa hai điểm
này là chu kì của tiếng nói,do đó tần số cơ bản là 1/T0.

Hình 7: Tính chu kì cơ bản T0.

Tiếp theo ta dịch chuyển tiếp một nửa độ dài cửa sổ (16ms) đến vị trí tiếp
theo, xác định các đỉnh cao nhất trong cửa số 32 ms và lại tính tương tự như trên
thu được tần số cơ bản tiếp theo. Cuối cùng ta thu được một tập các tần số cơ
bản, chúng được biểu diễn như trên đồ thị sau:


13


Hình 8: Đường biểu diễn F0.

14


II. Thiết kế chương trình:
1. Cấu trúc file wave:

Hình 9: Cấu trúc file wave
1.1. Khái niệm về tập tin wave
Tập tin wave là một dạng tập tin dùng để lưu trữ dữ liệu âm thanh số
(dạng sóng) và nó là một trong những định dạng phổ biến nhất của hệ điều hành
Windown. Tập tin wave thuộc chuẩn RIFF (Resource Interchange File Format –
dạng tập tin tài nguyên có thể trao đổi). Đặc điểm của những tập tin thuộc chuẩn
RIFF đó là nó sẽ nhóm nội dung của tập tin thành các khối riêng biệt và mỗi
một khối sẽ gồm một header (dùng để quy định kiểu và kích thước khối) và các
byte dữ liệu.
Tập tin file wave có 2 dạng nén và không nén (dạng chuẩn) vì thế trong
đề tài này em chỉ đề cập đến dạng chuẩn của tập tin wave tức dạng không nén.
1.2. Cấu trúc tập tin wave:
Cấu trúc file wave gồm 3 khối: Khối mô tả dạng RIFF, khối thuộc tính
“fmt” và khối dữ liệu “data”. Trong đó khối thuộc tính “fmt” và khối dữ liệu
“data” là hai khối con của khối mô tả dạng RIFF.
a. Khối mô tả dạng RIFF:
Khối này xác định định dạng RIFF và có kích thước là 12 byte gồm các
trường:


15


Trường

Kích thước

Chức năng

ChunkID

4 byte

Chứa chuỗi “RIFF” dưới dạng mã ASCII.

ChunkSize

4 byte

Cho biết tổng kích thước của các trường sau nó.
ChunkSize = 4 + (8 + Subchunk1Size) + (8 +
Subchunk2Size).

Format

4 byte

Chứa chuỗi “WAVE”.

b. Khối thuộc tính “fmt”

Khối này xác định các thuộc tính của dữ liệu âm thanh và có kích thước
là 24 byte gồm các trường.
Trường

Kích
thước

Chức năng

Subchunk1ID

4 byte

Chứa chuỗi “fmt”.

Subchunk1Size

4 byte

Cho biết tổng kích thước của các trường thuộc
khối thuộc tính đứng phía sau trường này.
Đối với tập tin wave không nén thì
Subchunk1Size bằng 16).

AudioFormat

2 byte

Cho biết dạng nén của dữ liệu trong tập tin
wave.

Giá trị:
0 không xác định.
1 không nén (PCM – Pulse Code Modulation).
80 MPEG.
49 GSM 6.10.
17 IMA ADPCM.

16


Một số giá trị thông dụng
Trường

Kích
thước

Chức năng

Numchannels

2 byte

Cho biết số kênh của tập tin wave (mono = 1,
Stereo = 2).

SampleRate

4 byte

Cho biết số mẫu trên 1s và đây là tần số lấy mẫu.


ByteRate

4 byte

Cho biết số byte trên 1s ứng với tần số lấy mẫu
trên.
(ByteRate = SampleRate * NumChannels *
(BitsperSample / 8)

BlockAlign

2 byte

Cho biết số byte của 1 mẫu gồm tất cả các kênh.

BitsPerSample

Cho biết số bit trên 1 mẫu chỉ tính cho một kênh.
(8 bit = 8, 16 bit = 16).

c. Khối dữ liệu (data):
Khối này bao gồm các trường sau:
- Subchunk2ID: Có kích thước 4 byte và chứa chuỗi “data”.
- Subchunk2Size: Kích thước 4 byte và cho biết kích thước của dữ liệu
âm thanh thô trong trường data.
Subchunk2Size = NumSample * NumChannels * BitsperSample / 8.
- Data: Trường data chứa các byte dữ liệu âm thanh và các byte dữ liệu
này sẽ nhóm thành các mẫu, mỗi mẫu sẽ có 1 hoặc 2 kênh. Tùy vào số kênh của
một mẫu (xác định bởi trường NumChannels) và số bit trên kênh (xác định bởi

trường BitsPerSample) mà ta sẽ xác định được số byte của 1 mẫu.
Số kênh / số bit trên kênh / kích thước 1 mẫu / giá trị lớn nhất / giá trị nhỏ
nhất.
1 /(Mono)/8/1 byte/255/0.
1 (Mono)/16/2 byte/32767/-32768.
2 (Stereo)/8/2 byte/255/0.
2 (Stereo)/16/4 byte/32767/-32768.

17


// khoi tao cac gia tri
sample_array = NULL;
current_samples = 0;
total_number_of_samples_in_wave_file = 0;
// cap phat bo nho
wave_file_herder = new WAVE_FILE_HEADER;
data_chunk_header = new DATA_CHUNK_HEADER;
if(wave_file_herder == NULL)
exit(-1);
if (data_chunk_header == NULL)
exit(-1);
// open file wav
file = fopen(filename, "rb");
Hình 10:ifVí (file
dụ cho ==
cấu NULL)
trúc file wave
exit(-1);


2. Phân //
tíchdoc
và thiết
kế chức
năng chương trình:
36 file
header
Chương
trình được thiết kế =gồm
ba chức năng chính:
file_operator_state
fread((void*)wave_file_herder,
- Đọc và hiện thị tín hiệu tiếng
nói từ file ưav
sizeof(WAVE_FILE_HEADER),
(size_t)1,
file);
if
(file_operator_state
!=
1)
- Xác định tín hiệu cepstrum theo phương pháp xử lý đồng hình.
exit(-1);
- Hiện thị
tín hiệu cepstrum.
- Hiện
thị đường biểu diễn F0 đã tính được.
// kiem tra dinh dang cua header
// kiem tra dinh dang "RIEF" file


3. Cài đặt
chương
for
(i = trình:
0; i < 4; ++i)
wave_file_herderĐọc cácoutput_buffer[i]
trường của file wav:= Sự
dụng hàm fopen() để mở file và fread
>riff_string[i];
để đọc các trường của file wav.
output_buffer[4] = 0;
if (strcmp(output_buffer, "RIFF"))
input_wave::input_wave(char
*filename)
exit(-1);
{
int
i; tra dinh dang "WAVE" file
// kiem
FILE
for(i*file;
= 0; i < 4; ++i)
unsigned
int file_operator_state;
output_buffer[i]
= wave_file_herderchar output_buffer[80];
>wave_string[i];
output_buffer[4] = 0;
WAVE_FILE_HEADER
*wave_file_herder;

if (strcmp(output_buffer,
"WAVE") != 0)
DATA_CHUNK_HEADER
*data_chunk_header;
exit(-1);
short int *uptr;
// kiem tra "fmt" cua subchunk
unsigned
char
for(i = 0;
i <*cptr;
3; ++i)
int data_chunk_id;
// so
thu tu cua chunk tiep theo can
output_buffer[i]
= wave_file_herderdoc
>ftm_string[i];
long
int fp_moving_distance;
// so vi tri dich chuyen
output_buffer[3]
= 0;
file pointer;
if (strcmp(output_buffer, "fmt") != 0)
exit(-1);
// audio format tag phai bang 1
if (wave_file_herder->wave_file_format_tag != 1)
exit(-1);


18


// chi chap nhan luong tu 8 hoac 16 bit
if (wave_file_herder->number_of_bits_per_samples != 8
&& wave_file_herder->number_of_bits_per_samples != 16)
exit(-1);
// khong doc cac phan con lai cua header
// phan cua header da doc duoc co do dai 20 bytes
// 20 bytes nay gom co: "RIFF", chunksize(long int),
"WAVE", "FMT", SubchunkSize1
fp_moving_distance = wave_file_herder->pcm_heder_len (sizeof(WAVE_FILE_HEADER) - 20);
// chuyen con tro toi dau data chunk
file_operator_state = fseek(file, fp_moving_distance,
SEEK_CUR);
if (file_operator_state != 0)
exit(-1);
// doc cho toi khi tim thay "data" trong chunk data
data_chunk_id = 1;
while (data_chunk_id != 0)
{
if (data_chunk_id > MAX_NUMBER_OF_DATA_CHUNKS)
exit(-1);
// doc chunk header
// chunk header gom 8 bytes: "data", chunksize
(long int)
file_operator_state =
fread((void*)data_chunk_header, sizeof(DATA_CHUNK_HEADER),
(size_t)1, file);
// kiem tra chunk type

for(i = 0; i < 4; ++i)
output_buffer[i] = data_chunk_header>data_string[i];
output_buffer[4] = 0;
if(strcmp(output_buffer, "data") == 0)
break;
// so thu tu cua chunk tiep theo can doc
data_chunk_id++;
// chuyen sang chunk tiep theo
file_operator_state = fseek(file,
data_chunk_header->data_chunk_length, SEEK_CUR);
if (file_operator_state != 1)
exit(-1);
}
// do dai chunk data
wbuff_len = data_chunk_header->data_chunk_length;

19


// tim so luong mau
// so byte trong data chunk
// so mau = tong so byte / (so byte/mau)
total_number_of_samples_in_wave_file =
data_chunk_header->data_chunk_length;
total_number_of_samples_in_wave_file /=
wave_file_herder->number_of_bits_per_samples/8;
//cap phat bo nho
wbuff = new char [wbuff_len];
if (wbuff == NULL)
exit(-1);

sample_array = new
double[total_number_of_samples_in_wave_file];
if (sample_array == NULL)
exit(-1);
// doc cac mau, ghi gia tri cua cac mau vao wbuff
file_operator_state = fread((void*)wbuff, wbuff_len,
(size_t)1, file );
if (file_operator_state != 1)
exit(-1);
// convert data
// 16bits/sample
if (wave_file_herder->number_of_bits_per_samples == 16)
{
uptr = (short*)wbuff;
for(i = 0; i <
total_number_of_samples_in_wave_file; ++i)
sample_array[i] = (double)
(uptr[i])/NOMALIZE_16_BIT;
}
// 8bits/sample
else
{
cptr = (unsigned char *)wbuff;
for(i = 0; i <
total_number_of_samples_in_wave_file; i++)
sample_array[i] = (double)
(cptr[i])/NOMALIZE_8_BIT;
}
// tan so lay mau
sampling_frequency_hz = (double)(wave_file_herder>number_of_samples_per_second);

// so bit/mau
number_of_bits_per_sample = wave_file_herder>number_of_bits_per_samples;

20


// so kenh
number_of_channels = wave_file_herder->number_of_channel;
// reset buffer stream index
current_samples = 0;
// Release
if(wbuff != NULL)
delete wbuff;
if(wave_file_herder != NULL)
delete wave_file_herder;
if(data_chunk_header != NULL)
delete data_chunk_header;
fclose(file);
return;

21


Biến đổi Fourier rời rạc:
int DFT(char direction, int N, double *in_real, double
*in_image)
{
long i, k;
double omega_i, omega, coefficient;
double cos_omega_i, sin_omega_i;

double *local_real = NULL, *local_image = NULL;
if (direction == REVERSE_TRANSFORM)
{
omega = 2.0 * PI / (double)N;
coefficient = 1 / (double)N;
}
else if(direction == FORWARD_TRANFORM)
for (i
{ = 0; i < N; ++i)
{
omega = -2.0 * PI / (double)N;
local_real[i]
= 0;
coefficient
= 1;
local_image[i]
= 0;
}
omega_i
=
omega*(double)i;
else
for (k = 0; k < N; ++k)
{
{
perror("\n
Tranform Direction khong dung");
returncos_omega_i
FAILURE; = cos(k * omega_i);
sin_omega_i = sin(k * omega_i);

}
+= (in_real[k] * cos_omega_i local_real local_real[i]
= new double[N];
in_image[k]
* sin_omega_i);
local_image
= new double[N];
local_image[i] += (in_real[k] * sin_omega_i +
in_image[k]
* cos_omega_i);
if(local_real
== NULL || local_image == NULL)
}
return FAILURE;
}
// copy data back
for (i = 0; i < N; ++i)
{
in_real[i] = local_real[i] * coefficient;
in_image[i] = local_image[i] * coefficient;
}
delete local_image;
delete local_real;
return SUCCESS;
}

22


Xác định Cepstrum:

void window::compute_cepstrum()
{
int i;
int start_sampleID;
start_sampleID = windowID * (number_of_samples_per_window
- number_of_overlapping_window);
cepstrum_real_part = new
double[number_of_samples_per_window];
cepstrum_image_part = new
double[number_of_samples_per_window];
cepstrum_real_part = wav_file.get_sample(start_sampleID,
number_of_samples_per_window);
// cho qua cua so hamming
// sau
roi rac
fordo
(ibien
= 0;doi
i number_of_samples_per_window;
++i)
{DFT(FORWARD_TRANFORM, number_of_samples_per_window,
cepstrum_real_part,
cepstrum_image_part);
cepstrum_real_part[i]
= cepstrum_real_part[i] *
//
logarit
hoa
hamming_window[i];

for (i
= 0; i < number_of_samples_per_window;
++i)
cepstrum_image_part[i]
= 0;
{
}
cepstrum_real_part[i] =
log10(sqrt(cepstrum_real_part[i] * cepstrum_real_part[i] +
cepstrum_image_part[i] * cepstrum_image_part[i]));
cepstrum_image_part[i] = 0;
}
// sau do bien doi fourier nguoc
DFT(REVERSE_TRANSFORM, number_of_samples_per_window,
cepstrum_real_part, cepstrum_image_part);
}

23


Tính F0:
void window::compute_F0()
{
double maxY_in_F0_range = 0;
double y;
int maxIndex;
// tim chi so tuong ung voi mau cuc dai
for (int i = minF0Index; i < maxF0Index; ++i)
{
y = cepstrum_real_part[i];

if(maxY_in_F0_range < y)
{
maxY_in_F0_range = y;
maxIndex = i;
}
}
F0_array[windowID] = sampling_rate / maxIndex;
}

24


4. Thử nghiệm chương trình:
File đầu vào A96.wav.

25


×