Dự án của tôiMột Đời — Lyric VideoKhớp lời với giọng hát
Khớp lời với giọng hát: tìm timing karaoke từng chữ
Vì sao đoán thời lượng từng chữ theo âm tiết bị lệch, và cách tìm ra dữ liệu karaoke cấp từ khớp 99,5% giọng hát thật cho lyric video.
Bài toán: chữ phải sáng đúng lúc giọng hát lên, ở mức từng chữ. Bài viết kể lại ba cách đã thử: chia đều theo âm tiết, dò onset từ stem giọng hát, và dùng dữ liệu karaoke cấp từ, cùng số liệu so khớp thật: 379/381 từ khớp, lệch trung vị -0,004 giây, không trôi dần về cuối bài.
Một lyric video sống hay chết ở chỗ chữ sáng lên đúng khoảnh khắc giọng hát cất lên, ở mức từng chữ chứ không phải từng câu. Sai nửa giây ở một câu hát nhanh là tai người nghe nhận ra ngay, dù mắt không thấy gì.
Bài này kể lại phần khó nhất của dự án: tìm cho được timeline cấp từ cho bài “Một Đời” (5 phút 28 giây, 47 câu, 381 từ), và cách kiểm tra xem timeline đó có thật sự khớp không.
Trả lời nhanh
Dữ liệu lời theo dòng (LRC) chỉ cho biết câu bắt đầu ở giây nào. Muốn đúng từng chữ thì cần dữ liệu karaoke cấp từ: mỗi từ có một cặp (bắt đầu, thời lượng).
Ba cách đã thử, cách thứ ba đứng lại:
| Cách | Nguồn mốc thời gian | Kết quả |
|---|---|---|
| Chia theo trọng số âm tiết | Suy ra từ mốc câu trong LRC | Nghe “gần đúng”, lệch rõ ở câu nhanh và ở chữ cuối câu |
| Dò onset trên stem giọng hát | Tách stem bằng Demucs, dò biên độ | Khá hơn, nhưng vẫn sai ở chữ ngân và chỗ vào nhịp lệch |
| Dữ liệu karaoke cấp từ | Định dạng KRC: 414 thẻ từ, 381 thẻ khớp lời | 379/381 từ khớp, lệch trung vị −0,004 giây |
Vì sao chia theo âm tiết không đủ
Ý tưởng đầu tiên rất tự nhiên: biết câu bắt đầu ở 20,86 giây và kết thúc ở 26,48 giây, chia thời lượng đó cho các chữ theo số âm tiết. Với câu hát đều thì cách này chấp nhận được.
Nhưng bài hát không đọc đều. Có câu dồn chữ vào nửa sau rồi ngân dài chữ cuối; có câu chữ đầu ngân, chữ sau đọc nhanh. Cách chia đều luôn sai theo cùng một kiểu: chữ sáng sớm ở đầu câu và muộn ở cuối câu.
Cách cải tiến tiếp theo là tách stem giọng hát (Demucs, mô hình htdemucs, lấy ra vocals.wav) rồi dò biên độ để tìm điểm vào của từng từ. Cách này bám sát giọng hát hơn hẳn, nhưng vẫn vấp ở hai chỗ: chữ ngân dài thì năng lượng không còn đỉnh rõ để dò, và khi nhạc nền vẫn còn lọt vào stem thì dò ra điểm vào giả.
Đi tìm dữ liệu karaoke cấp từ
Hướng thứ ba: đừng suy mốc thời gian, đi tìm dữ liệu đã có. Các bản karaoke số lưu timing cấp từ trong định dạng KRC, mỗi từ được gắn thẻ start,duration. Sau khi giải mã lớp nén, bản dùng cho bài này cho ra 414 thẻ từ.
Bỏ 11 thẻ chỉ chứa khoảng trắng và 22 thẻ thuộc phần ghi chú, giới thiệu ở đầu bài, còn lại đúng 381 từ, bằng số từ trong lời. Phần việc kế tiếp là so khớp: chuẩn hoá dấu câu, hạ chữ thường, rồi ghép từng từ của lời với từng mốc theo thứ tự.
Kết quả so khớp:
- 379/381 từ khớp, tức 99,5%.
- Độ lệch trung vị: −0,004 giây (gần như trùng khít).
- Một nửa số từ lệch trong khoảng ±0,08 giây.
- Kiểm tra trôi dần: độ lệch ở đầu bài, giữa bài và cuối bài lần lượt là −0,023, +0,030 và −0,011 giây, không tăng dần, nên timeline không bị “chậm dần” về cuối.
Hai từ không khớp nằm ở chỗ lời ghi một đằng, bản karaoke hát một nẻo. Với hai chỗ đó, cách xử lý là nghe lại và gán mốc theo giọng hát thật.
Ví dụ một đoạn đã khớp:
Vì 20,86 · yêu 21,09 · em 21,30rồianh 22,71 · chẳng 22,91 · ngại 23,11. Ba chữ đầu dồn nhanh, rồi có một quãng nghỉ, rồi vào cụm sau. Chia đều câu theo âm tiết không thể ra được hình dạng này.
Methodology (phương pháp)
- Nguồn dữ liệu: lời theo dòng từ lrclib (
id=33911816) và dữ liệu karaoke cấp từ từ định dạng KRC của bản karaoke số. Âm thanh tham chiếu là file 48 kHz tách từ bản thu chính thức. - Tiêu chí: một từ được coi là khớp khi mốc thời gian lệch dưới 0,12 giây so với mốc tham chiếu và thứ tự từ không đổi.
- Kiểm tra: ngoài việc so số, các đoạn nghi ngờ (câu hát nhanh, chỗ có quãng nghỉ dài) được nghe lại và đối chiếu bằng mắt trên dạng sóng.
- Hạn chế: dữ liệu KRC do cộng đồng tạo, không phải bản chính thức từ nhà sản xuất, nên vẫn có thể sai ở vài chỗ; vì vậy mới phải so khớp và nghe lại chứ không dùng thẳng. Các bài hát không có dữ liệu karaoke cấp từ sẽ phải quay lại hướng căn chỉnh cưỡng bức, và chất lượng khi đó phụ thuộc hoàn toàn vào bản thu.
Bài học giữ lại
Khi cần độ chính xác ở mức một phần mười giây, dữ liệu do con người gõ cho đúng nhịp thường thắng mô hình tự suy, và rẻ hơn nhiều. Việc của mình là tìm tới dữ liệu đó, rồi kiểm tra bằng số chứ không chỉ nghe thấy “có vẻ ổn”.
Timeline này là đầu vào cho phần sau: dựng cảnh và hiệu ứng để những mốc thời gian đó nhìn thấy được bằng mắt.
Gắn thẻ
lyric videokaraoke từng chữđồng bộ lờikrcdemucsHỏi đáp
Vì sao không dùng thẳng mốc thời gian theo dòng của LRC?
LRC chỉ cho biết câu nào bắt đầu ở giây nào. Muốn chữ sáng theo nhịp hát thì phải chia thời lượng của câu cho từng chữ, mà tốc độ hát không đều: câu có chữ ngân dài, câu đọc nhanh. Chia đều hay chia theo trọng số âm tiết đều sai ở đúng những câu tai người nghe rõ nhất.
Dữ liệu karaoke cấp từ lấy ở đâu?
Từ các bản karaoke số của định dạng KRC, trong đó mỗi từ được gắn cặp (thời điểm bắt đầu, thời lượng). Sau khi giải mã lớp nén, bản dùng cho bài này có 414 thẻ từ. Bỏ các thẻ khoảng trắng và phần ghi chú đầu bài thì còn đúng 381 từ, khớp với 381 từ trong lời. Đây là dữ liệu do cộng đồng tạo nên, vẫn phải đối chiếu lại bằng cách nghe các đoạn nghi ngờ.
Làm sao biết timeline là đúng, không chỉ là "nghe được"?
So từng từ trong lời với từng mốc của dữ liệu karaoke, rồi tính phân bố độ lệch. Bản cuối có 379/381 từ khớp (99,5%), mốc lệch trung vị là -0,004 giây, một nửa số từ lệch trong khoảng ±0,08 giây và không có xu hướng trôi về cuối bài.
Whisper có làm được việc này không?
Đã thử và không ổn định với bài hát có nhạc nền dày và reverb: mốc từ nhảy giữa các lần chạy, nhất là ở câu hát nhanh. Với bài không có dữ liệu karaoke thì buộc phải quay lại căn chỉnh cưỡng bức (forced alignment) bằng stable-ts, nhưng kết quả cần người nghe kiểm lại.
Nguồn tham khảo
- lrclib — cơ sở dữ liệu lời bài hát LRC - lrclib
- Demucs — mô hình tách nhạc thành các stem - Meta Research
- stable-ts — căn chỉnh cưỡng bức cho Whisper - GitHub
Về tác giả
Bài liên quan
Điểm tin AI 08-11: cử tri bác data center, Google mua Wyoming
Cử tri Mỹ bác gần hết 41 cuộc bỏ phiếu địa phương về data center. OpenAI ra bộ khung compute campus, cam kết bỏ NDA. Google mua dự án Wyoming 17 tỷ USD.Điểm tin AI 07-11: OpenAI gọi 11 tỷ, chi tiêu AI đỉnh điểm
OpenAI hoàn tất 11 tỷ USD giá trị 1,25 nghìn tỷ. Dữ liệu Ramp cho thấy chi tiêu AI doanh nghiệp chỉ tăng 1,5% qua tháng 8–9. Meta Muse ra Spaces quản lý dự án.Điểm tin AI 06-11: Airbnb hẹn agent du lịch, GPT-6 Cyber diệt 948 lỗi
Airbnb hẹn agent du lịch nửa đầu 2027. Claude đọc được tài khoản ngân hàng. OpenAI nói doanh nghiệp chiếm phần lớn doanh thu và tính IPO 2027.