Cắt bớt vài giây của một bản ghi nghe như thao tác đơn giản nhất. Thế nhưng đoạn cắt xong thường hơi sai: có tiếng tách ở chỗ cắt, có khoảng lặng nhỏ ở đầu, phát lặp thì bị khựng, hoặc nghe kém hơn bản gốc một chút. Không lỗi nào trong số đó do chính việc cắt. Chúng đến từ cách các định dạng nén như MP3 lưu âm thanh, và từ việc mã hóa lại. Bài này giải thích chuyện gì xảy ra, kèm con số, và cách công cụ cắt âm thanh tránh được bằng cách xuất WAV.
WAV là danh sách mẫu, MP3 là danh sách khung
Tệp WAV gần như chỉ gồm các mẫu âm: mỗi kênh một con số, hàng chục nghìn lần mỗi giây, sau phần đầu 44 byte. Với stereo 44,1 kHz, 16 bit, mỗi giây là 44.100 × 2 kênh × 2 byte = 176.400 byte. Bạn có thể cắt WAV giữa hai mẫu bất kỳ và kết quả dài đúng như đã chọn. Không có gì bị giải mã hay mã hóa lại, nên không có gì thay đổi.
MP3 là một chuỗi khung. Với MPEG-1 Layer III, loại MP3 thông dụng, mỗi khung chứa 1.152 mẫu (tài liệu kỹ thuật của dự án LAME ghi 1.152 cho MPEG-1 và 576 cho MPEG-2). Ở 44,1 kHz, một khung dài 1.152 ÷ 44.100 = 26,12 ms; ở 48 kHz là đúng 24 ms. Công cụ cắt MP3 mà không giải mã chỉ cắt được ở ranh giới khung, nên điểm đầu và cuối bị làm tròn theo lưới 26 ms. Ngoài ra, do cơ chế "bể bit" (bit reservoir), một khung có thể lưu một phần dữ liệu trong các khung trước nó, nên khung đầu tiên sau chỗ cắt có thể không giải mã được và một số trình phát sẽ bỏ qua hoặc tắt tiếng khung đó.
Độ trễ và phần đệm của bộ mã hóa: vì sao đoạn cắt bắt đầu trễ
Khi tạo MP3, bộ lọc của bộ mã hóa và bộ giải mã đều thêm độ trễ. Tài liệu của LAME mô tả độ trễ giải mã 528 mẫu và độ trễ mã hóa mặc định của LAME là 576 mẫu. Cộng lại là 1.104 mẫu (thường được nêu là 1.105), tức khoảng 25 ms im lặng ở 44,1 kHz đứng trước âm thanh thật. Ở cuối, bộ mã hóa đệm cho tròn một khung. Lấy ví dụ 30 giây ở 44,1 kHz: 1.323.000 mẫu, cộng 576 mẫu trễ là 1.323.576, bằng 1.148,94 khung. Khung cuối được lấp đầy, nên có ít nhất 72 mẫu đệm phía sau, và bộ mã hóa thường thêm một khung đẩy dữ liệu nữa.
LAME ghi độ trễ và phần đệm chính xác vào một thẻ trong khung đầu tiên; trình phát đọc thẻ này sẽ bỏ cả hai, đó chính là "phát liền mạch" (gapless). Trình phát bỏ qua thẻ sẽ phát luôn khoảng lặng thừa. Vì vậy nhạc chuông hay đoạn lặp làm từ MP3 đã cắt có thể vào trễ nửa nhịp hoặc hở một quãng mỗi lần lặp.
Mã hóa lại: mất chất lượng theo từng thế hệ
Khi công cụ cắt giải mã MP3, cắt mẫu rồi mã hóa thành MP3 mới, âm thanh đi qua bộ mã hóa mất dữ liệu lần thứ hai. Bộ mã hóa thứ hai không biết bộ thứ nhất đã bỏ gì; nó chỉ bỏ thêm. Với bitrate cao, khác biệt sau một lần thường nhỏ, nhưng cộng dồn qua mỗi lần chỉnh, và tệp mới lại có độ trễ cùng phần đệm mới.
Xuất WAV tránh được tất cả. Công cụ giải mã tệp một lần, cắt đúng mẫu và ghi nguyên các mẫu. Phần chất lượng MP3 gốc đã mất thì vẫn mất: WAV không lấy lại được những gì MP3 đã bỏ, nhưng không bỏ thêm gì.
Cái bẫy tần số lấy mẫu trong trình duyệt
Trình duyệt giải mã âm thanh theo tần số lấy mẫu của audio context, và tài liệu MDN về decodeAudioData ghi rõ bộ đệm sau giải mã được lấy mẫu lại theo tần số của context. Công cụ nào giải mã tệp 44,1 kHz trong context 48 kHz là đã âm thầm lấy mẫu lại. Công cụ cắt âm thanh đọc tần số trong phần đầu tệp (WAV, MP3, FLAC, Ogg) và giải mã đúng tần số đó, nên 44,1 kHz vẫn là 44,1 kHz. Với định dạng không đọc được phần đầu như M4A, công cụ dùng 48 kHz và cho bạn biết.
Ví dụ cụ thể
Bạn có đoạn mở đầu podcast dài ba phút, dạng MP3 192 kbit/s, và muốn lấy 30 giây từ 1:10.000 đến 1:40.000, giảm dần âm lượng trong 2 giây cuối.
- Tệp MP3 nặng 192.000 ÷ 8 × 180 = 4.320.000 byte (4,3 MB).
- Đoạn cắt dài 30 giây × 44.100 = 1.323.000 khung mẫu mỗi kênh.
- Dạng WAV stereo 16 bit là 1.323.000 × 4 + 44 = 5.292.044 byte (5,3 MB). Công cụ hiển thị con số này trước khi lưu.
- Fade out phủ 2 × 44.100 = 88.200 khung cuối. Với kiểu công suất đều, độ lợi ở giữa là sin(45°) = 0,707, tức −3 dB; fade tuyến tính ở mức 0,5, tức −6 dB, nên nghe như nhỏ đi sớm hơn.
- Tệp bắt đầu đúng ở mẫu thứ 3.087.000 (70 × 44.100) và không có khoảng lặng thừa ở hai đầu.
Cả ba phút dạng WAV sẽ là 44.100 × 4 × 180 + 44 = 31.752.044 byte, gấp khoảng bảy lần MP3. Đó là cái giá của định dạng không mất dữ liệu, và vì sao WAV hợp để chỉnh sửa, lưu trữ hơn là gửi bản ghi dài qua tin nhắn.
Những lỗi thường gặp
- Lưu đoạn cắt thành MP3 hết lần này đến lần khác. Mỗi lần mã hóa lại mất thêm một chút. Hãy giữ bản WAV để làm việc và chỉ xuất MP3 ở bước cuối.
- Cắt giữa một âm. Nếu dạng sóng không bằng không ở chỗ cắt, màng loa nhảy đột ngột và bạn nghe tiếng tách. Fade 10 ms (441 mẫu ở 44,1 kHz) sẽ xóa nó, hoặc dời điểm cắt sang chỗ yên lặng.
- Dùng fade tuyến tính dài cho nhạc. Nhạc nghe như biến mất quá sớm; kiểu công suất đều giữ độ to cảm nhận đều hơn.
- Mong vòng lặp hoàn hảo từ MP3. Độ trễ và phần đệm để lại khoảng lặng ở hai đầu, trừ khi trình phát đọc thẻ gapless. Hãy lặp bằng WAV.
- Chọn 24 bit "cho chất lượng" khi nguồn là MP3. Nguồn vốn đã kém hơn mức 16 bit cho phép; 24 bit chỉ có ý nghĩa với bản ghi còn chỉnh sửa tiếp.
- Để công cụ âm thầm lấy mẫu lại. Hãy kiểm tra tần số lấy mẫu của kết quả có khớp bản gốc không.
Cắt ngay trong trình duyệt
Mở công cụ cắt âm thanh, chọn tệp rồi kéo tay nắm đầu và cuối, hoặc gõ thời gian chính xác đến mili giây. Thêm fade ngắn ở hai đầu, nghe thử đoạn đã chọn và tải WAV. Nếu chưa có bản ghi, máy ghi âm ghi micro ngay trong trình duyệt và cũng lưu được WAV.