Dữ liệu âm thanh

Từ một dãy số đến ảnh phổ có trục đúng

Chương 7 · Bài 7.1

2

Một giây âm thanh nói gì?

Điện thoại trả hàng nghìn số.

Waveform dày đặc chưa cho biết âm nào xuất hiện trước, âm nào xuất hiện sau.

Cần một biểu diễn cho thấy tần số nào xuất hiện ở lúc nào: spectrogram.

3

Mục tiêu

  • Tính thời lượng từ số mẫu và sample rate; đổi sample rate không bị aliasing.
  • Đọc spectrogram; hiểu window và hop của STFT.
  • Tự tính log-mel.
  • Chọn augmentation hợp với nhãn.
01

Waveform và lấy mẫu

Waveform và lấy mẫu5

Phóng to 20 ms

Ở 2000 Hz, âm 200 Hz có 10 mẫu mỗi chu kỳ, âm 600 Hz chỉ khoảng 3.3 mẫu.-0.700.70510ms sau 0 s200 Hz: 10 mẫu mỗi chu kỳ0510ms sau 0.5 s600 Hz: 3.33 mẫu mỗi chu kỳmỗi chấm là một mẫu, cách nhau 0.5 ms (sample rate 2000 Hz)
Ở 2000 Hz, âm 200 Hz có 10 mẫu mỗi chu kỳ, âm 600 Hz chỉ khoảng 3.3 mẫu.
Waveform và lấy mẫu6

Giữ đúng đơn vị

tn=nfs,T=Nfs.t_n=\frac{n}{f_s},\qquad T=\frac{N}{f_s}.

fsf_s là số mẫu mỗi giây; NN là tổng số mẫu. nn là chỉ số mẫu tính từ 0.

2000 mẫu ở 2000 Hz dài 1 giây.

WAV 16-bit: chia cho 32 768 để về [−1,1)[-1,1). Stereo: tính theo trục mẫu.

Waveform và lấy mẫu7

Dữ liệu biết trước đáp án

Nửa đầu: sine 200 Hz.

Nửa sau: sine 600 Hz.

Spectrogram đúng phải cho thấy 200 Hz rồi 600 Hz.

print(waveform.shape)
print(f"thời lượng = {duration:.3f} s")
print(f"khoảng mẫu = {interval_ms:.3f} ms")
Kết quả(2000,)
thời lượng = 1.000 s
khoảng mẫu = 0.500 ms
Waveform và lấy mẫu8

Hỏi nhanh

File WAV stereo 16 kHz được đọc thành mảng shape (48000, 2), tức 48 000 mẫu cho mỗi kênh. File dài bao nhiêu giây?

Waveform và lấy mẫu9

Hỏi nhanh

Microphone phải của một bản ghi stereo bị đấu ngược cực, nên kênh phải đúng bằng kênh trái đổi dấu. Downmix bằng cách lấy trung bình hai kênh thì được gì?

Waveform và lấy mẫu10

Aliasing xảy ra trước model

Cosine 350 Hz và 650 Hz có cùng mẫu khi fs=1000f_s=1000 Hz.

Nyquist frequency: fs/2f_s/2. Thành phần f∈(fs/2,fs)f\in(f_s/2,f_s) hiện ra ở fs−ff_s-f.

print(np.allclose(low_tone, high_tone))
Kết quảTrue

Thông tin không còn phân biệt được trong input.

Waveform và lấy mẫu11

Hai cosine, cùng các chấm

Lấy mẫu 1000 Hz: cosine 350 Hz và 650 Hz đi qua đúng cùng các điểm mẫu.-1010246810ms350 Hz650 Hzlấy mẫu 1000 Hz: hai cosine đi qua đúng cùng các chấm, 650 = 1000 − 350
Lấy mẫu 1000 Hz: cosine 350 Hz và 650 Hz đi qua đúng cùng các điểm mẫu.
Waveform và lấy mẫu12

Bỏ mẫu hay lọc rồi bỏ mẫu

waveform[::2]: còn 1000 Hz, Nyquist 500 Hz.

Đoạn 600 Hz gập về 400 Hz, vì 1000−600=400{1000-600=400}.

Kết quảbỏ mẫu: 1000 mẫu, biên độ ở 400 Hz = 0.400
có lọc: 1000 mẫu, biên độ ở 400 Hz = 0.000

resample_poly lọc thông thấp trước: mất 600 Hz nhưng không bịa âm mới.

Waveform và lấy mẫu13

Phổ sau khi hạ sample rate

Bỏ mẫu sinh âm giả 400 Hz; resample_poly lọc trước nên không có.00.20.40200400Hzbỏ mẫu waveform[::2]400 Hz: 0.4000200400Hzresample_poly (có lọc)400 Hz: 0.000nửa sau chỉ có âm 600 Hz; ở 1000 Hz, Nyquist còn 500 Hz
Bỏ mẫu sinh âm giả 400 Hz; resample_poly lọc trước nên không có.
Waveform và lấy mẫu14

Metadata khác resample

Giữ 2000 mẫu nhưng gắn 4000 Hz: phát trong 0.5 giây.

Resample lên 4000 mẫu ở 4000 Hz: vẫn 1 giây.

Kết quảđổi metadata: 0.500 s
resample: 1.000 s

Upsample không thêm âm cao mà bản ghi chưa từng có.

Waveform và lấy mẫu15

Hỏi nhanh

Thu âm ở 8000 Hz mà không có bộ lọc chống aliasing, trong khi trong phòng có tiếng rít 5000 Hz. Trên spectrogram của bản ghi, tiếng rít hiện ra ở đâu?

Waveform và lấy mẫu16

Hỏi nhanh

Clip 16 kHz dài 2 giây chứa tiếng còi 1000 Hz. Một bước tiền xử lý chỉ sửa header thành 24 kHz, giữ nguyên mảng. Phát lại, hoặc đưa vào model 24 kHz, thì clip ra sao?

02

STFT: tần số theo thời gian

STFT: tần số theo thời gian18

Cắt frame rồi FFT

Window L=200L=200 mẫu, tức 100 ms.

Hop H=100H=100 mẫu, tức 50 ms.

Hann window làm hai đầu frame nhỏ dần.

Không padding:

F=1+⌊N−LH⌋=19.F=1+\left\lfloor\frac{N-L}{H}\right\rfloor=19.

Hop quyết định bước trượt; window quyết định đoạn được quan sát.

center=True đệm L/2L/2 mỗi đầu:

F=1+⌊NH⌋.F=1+\left\lfloor\frac{N}{H}\right\rfloor.
STFT: tần số theo thời gian19

Window, hop và Hann

STFT chia waveform thành các frame chồng nửa nhau, nhân cửa sổ Hann.00.10.20.30.4giâyframe 0frame 1frame 2window 200 mẫu (100 ms), hop 100 mẫu (50 ms): mỗi frame chồng nửa frame trước; đường cong là Hann
STFT chia waveform thành các frame chồng nửa nhau, nhân cửa sổ Hann.
STFT: tần số theo thời gian20

Hai dải xuất hiện ở hai lúc

Spectrogram: 200 Hz ở nửa giây đầu, 600 Hz ở nửa giây sau.0200600100000.250.50.751giây200 Hz600 HzHz theo trục dọc0 dB−80 dB
Spectrogram: 200 Hz ở nửa giây đầu, 600 Hz ở nửa giây sau.
STFT: tần số theo thời gian21

STFT trên một câu đọc thật

Cửa sổ 25 ms trượt trên waveform; mỗi vị trí qua FFT thành một cột spectrogram.
STFT: tần số theo thời gian22

Đọc shape và đỉnh

print(power.shape)
peaks = np.argmax(power[:, [0, -1]], axis=0)
print(frequencies[peaks])
print(centers[[0, -1]].round(2))
Kết quả(101, 19)
[200. 600.]
[0.05 0.95]

101 hàng: bin tần số.

19 cột: frame.

Power trong bài là bình phương biên độ tương đối, không phải watt/Hz.

STFT: tần số theo thời gian23

Hỏi nhanh

Tiếng nói 16 kHz, window 400 mẫu tức 25 ms, không zero-padding. rfft của một frame cho bao nhiêu bin, và các bin cách nhau bao nhiêu Hz?

STFT: tần số theo thời gian24

Hỏi nhanh

Giữ window length 200 mẫu, giảm hop từ 100 xuống 50 mẫu trên waveform của bài. Điều gì thay đổi trực tiếp?

STFT: tần số theo thời gian25

Window và độ phân giải

Window dài: tách tần số gần nhau tốt hơn, nhưng nhòe theo thời gian.

Window ngắn: định vị sự kiện nhanh tốt hơn, đỉnh phổ rộng hơn.

Zero-padding: lưới bin dày hơn, fs/nfftf_s/n_{\mathrm{fft}} thay cho fs/Lf_s/L.

Không thêm chu kỳ quan sát, nên không tăng độ phân giải thật.

STFT: tần số theo thời gian26

Hỏi nhanh

Hai bài toán có cùng sample rate. Bài (1) định vị tiếng gõ phím chỉ kéo dài vài mili giây. Bài (2) phân biệt hai nốt nhạc ngân dài, cao độ chênh nhau vài Hz. Nên chọn window thế nào?

STFT: tần số theo thời gian27

Đánh đổi thời gian và tần số

Cửa sổ ngắn định vị tiếng gõ sắc nhưng nhòe tần số; cửa sổ dài thì ngược lại.030060000.51giâywindow 40 mẫu (20 ms)00.51giâywindow 400 mẫu (200 ms)tín hiệu: hai âm 300 Hz và 330 Hz, cộng một tiếng gõ ngắn ở 0.5 s
Cửa sổ ngắn định vị tiếng gõ sắc nhưng nhòe tần số; cửa sổ dài thì ngược lại.
03

Mel và log

Mel và log29

Gộp 101 bin thành 20 band

Bộ lọc mel hẹp ở tần số thấp, rộng dần ở tần số cao.0102505007501000Hztrọng số20 tam giác đều theo mel: hẹp ở tần số thấp, rộng dần ở tần số cao
Bộ lọc mel hẹp ở tần số thấp, rộng dần ở tần số cao.
Mel và log30

Hỏi nhanh

Bộ lọc của bài đặt 22 mốc đều theo mel trên dải 0-1000 Hz. Hai mốc đầu cách nhau khoảng 30 Hz. Hai mốc cuối cách nhau khoảng bao nhiêu?

Mel và log31

Hai phép biến đổi

M=WP.M=WP.

(20,101) @ (101,19) cho (20,19).

L=10log⁡10max⁡(M,ε)Mref.L=10\log_{10}\frac{\max(M,\varepsilon)}{M_{\mathrm{ref}}}.

Mốc của hình là đỉnh clip; quy ước mel là HTK.

Mel và log32

Hỏi nhanh

Mel power có phần tử bằng 0. Trước khi lấy log, vì sao người ta thường tính log⁡(max⁡(power,ε))\log(\max(\text{power}, \varepsilon)) với ε>0\varepsilon > 0?

Mel và log33

Log-mel của clip

Log-mel: năng lượng ở band thấp nửa đầu, band cao hơn nửa sau.0102000.51giâyhàng: mel bandshape (20, 19)min −112.1 dBmax 0 dB
Log-mel: năng lượng ở band thấp nửa đầu, band cao hơn nửa sau.
Mel và log34

Một mel band

Power (1,4,1)(1,4,1), trọng số (0.5,1,0.5)(0.5,1,0.5):

M=0.5+4+0.5=5.M=0.5+4+0.5=5.

Mốc 5 cho 0 dB; power 0.5 cho −10-10 dB.

Kết quả(20, 101) (20, 19)
[-112.1    0. ]
True

True kiểm mọi giá trị log-mel đều hữu hạn. Chặn trước log để tránh -inf; dải hiển thị có thể hẹp hơn dải số.

04

Chuẩn hóa và augmentation

Chuẩn hóa và augmentation36

Peak normalization

(0,0.2,−0.4,0.2)(0,0.2,-0.4,0.2) chia cho 0.4:

Kết quả[ 0.   0.5 -1.   0.5]
[0. 0. 0. 0.]
RMS trước = 0.245

Clip toàn 0 giữ nguyên, không chia cho peak 0.

Chuẩn hóa từng clip có thể xóa thông tin âm lượng hữu ích.

Chuẩn hóa và augmentation37

Hỏi nhanh

Đề phân loại máy bơm “bình thường” và “kẹt”, ghi bằng cùng một microphone đặt cố định. Máy kẹt rung mạnh hơn: dạng sóng gần giống máy bình thường, nhưng biên độ gấp khoảng 3 lần. Một đội peak-normalize từng clip trước khi tính log-mel. Chuyện gì xảy ra?

Chuẩn hóa và augmentation38

Chuẩn hóa từng clip

Peak normalize từng clip xóa mất khác biệt biên độ giữa máy bơm kẹt và bình thường.-10100.10.2giâytrước00.10.2giâysau peak normalizecam: máy kẹt · xanh: máy bình thườngminh họa: hai clip cùng dạng sóng, biên độ gấp 3; chuẩn hóa từng clip làm chúng trùng nhau
Peak normalize từng clip xóa mất khác biệt biên độ giữa máy bơm kẹt và bình thường.
Chuẩn hóa và augmentation39

Augmentation phải giữ nhãn

Hỏi trước: sau biến đổi, đáp án còn là đáp án cũ?

Nhãn cao độ nốt: pitch shift đổi nhãn. Nhãn transcript: crop mất từ đổi nhãn.

SpecAugment che một dải thời gian hoặc tần số trên log-mel, chỉ lúc train.

Điền 0 sau z-score là điền mean của band.

Chuẩn hóa và augmentation40

Time mask và frequency mask

SpecAugment che một dải thời gian và một dải tần khi train.0102000.51giâylog-mel00.51giâysau time mask và frequency maskvùng che được điền một giá trị; điền gì phụ thuộc thang đang dùng (ở đây −80 dB)
SpecAugment che một dải thời gian và một dải tần khi train.
Chuẩn hóa và augmentation41

Hỏi nhanh

Nhãn là transcript đầy đủ của câu nói. Crop ngẫu nhiên làm mất nửa cuối clip, nhưng vẫn giữ transcript cũ. Làm vậy có hợp lệ không?

Chuẩn hóa và augmentation42

Hỏi nhanh

Nhãn là danh tính người nói, gồm 10 người trong một câu lạc bộ. Phép augmentation nào dễ làm sai nhãn nhất?

Chuẩn hóa và augmentation43

Khi đi thi

  • Header: sample rate, kênh, thời lượng, clip im lặng.
  • Đúng sample rate và processor của checkpoint.
  • Chia theo bản ghi gốc trước khi cắt đoạn.
05

Luyện đề

Luyện đề45

Luyện đề 1

Clip 1 giây ở 16 kHz, window 400 mẫu, hop 160 mẫu. Số frame STFT khi không padding, và khi center=True, tức đệm 200 mẫu mỗi đầu, lần lượt là bao nhiêu?

Phỏng theoCMU 10-601 · Exam 3 Practice · Q1.2(b)

Luyện đề46

Luyện đề 2

STFT của bài, với window 200, hop 100 và Hann, có thể viết bằng nn.Conv1d(1, 202, kernel_size=200, stride=s, bias=False) với 202 kernel cố định, gồm 101 cosine và 101 sine đã nhân Hann. Với waveform shape (1, 1, 2000), s bằng bao nhiêu, và output có shape gì?

Phỏng theoNOAI 2026 Singapore · Vòng sơ loại · Câu 201

Luyện đề47

Luyện đề 3

Đề cho mỗi mẫu là một chuỗi 500 giá trị cảm biến, không ghi sample rate. Một đội cắt frame dài 50, hop 25, rồi lấy rfft của mỗi frame làm token cho Transformer. Có bao nhiêu token, và trục tần số của mỗi token đọc thế nào?

Phỏng theoUSA-NA-AIO 2026 · Vòng 2 · Ngày 1 · Part 1.4

Luyện đề48

Chốt ý

Waveform luôn đi cùng sample rate; giảm sample rate phải lọc trước.

STFT: window quyết định đoạn quan sát, hop quyết định bước trượt; log-mel nén lại cho model.

Luyện đề49

Sau giờ học

Làm 10 câu kiểm tra cuối bài trên trang bài học.

Chạy notebook; đổi hop của stft_power, dự đoán số frame trước rồi kiểm bằng power.shape.