Phụ Đề Karaoke Từng Chữ: Thẻ ASS, Whisper và WebVTT
← Blog
🎬 Phụ đề & Caption7 phút đọc

Phụ Đề Karaoke Từng Chữ: Thẻ ASS, Whisper và WebVTT

💡 Phụ đề karaoke từng chữ làm nổi bật mỗi từ khi nói. Để có bản SRT nhánh nhanh: whisper audio.mp3 --word_timestamps True --highlight_words True --output_format srt --max_words_per_line 4 --max_line_count 1. Để có hiệu ứng chuyển màu thật sự, dùng thẻ ASS {\kf60}từ (thời lượng tính bằng centisecond) với PrimaryColour &H0000FFFF (vàng) và SecondaryColour &H00FFFFFF (trắng).

Ý chính

  • Lệnh Whisper cho bản nháp: --word_timestamps True --highlight_words True --output_format srt --max_words_per_line 4 --max_line_count 1. Từ đang nói được bọc trong thẻ <u> (gạch chân, không phải màu).
  • Thẻ ASS \kf<dur> tạo hiệu ứng quét màu từ trái sang phải trong <dur> centisecond. \k<dur> chuyển màu fill tức thì. Đơn vị: centisecond (60 = 0,6 s).
  • Màu ASS theo thứ tự AABBGGRR. Highlight vàng: PrimaryColour=&H0000FFFF. Pre-highlight trắng: SecondaryColour=&H00FFFFFF. Viền đen: OutlineColour=&H00000000.
  • WebVTT inline timestamp dùng cú pháp <MM:SS.mmm>từ. Style với ::cue(:past) và ::cue(:future) trong CSS.
  • Giới hạn 3-4 từ mỗi cue, Fontsize 72 cho PlayResY 1920, tỷ lệ tương phản tối thiểu 4,5:1 giữa màu highlight và nền.

Phụ đề karaoke từng chữ khác gì so với phụ đề thông thường?

Một cue phụ đề thông thường hiển thị cả câu và giữ nguyên trong 1-3 giây. Phụ đề karaoke từng chữ làm điều ngược lại: nó làm nổi bật mỗi từ theo thứ tự, đồng bộ với âm thanh để người xem theo dõi lời thoại trong thời gian thực. Từ khóa chính ở đây là "phụ đề karaoke từng chữ", và ứng dụng trải rộng từ video lyric YouTube, clip lip-sync TikTok, đến bất kỳ nội dung creator nào mà phụ đề là điểm nhấn thị giác.

Tôi dùng ba cách triển khai khác nhau tùy mục tiêu. Cờ --highlight_words của Whisper tạo SRT với markup gạch chân trong vòng hai phút. Thẻ ASS karaoke (\kf, \k) nhúng chuyển màu thật sự vào file .ass để burn với ffmpeg. WebVTT inline timestamp xử lý trường hợp web player không cần re-encode, dùng CSS pseudo-class.

Tạo timestamp từng chữ với Whisper

Tính năng word-level timestamp của Whisper căn chỉnh từng từ đã nhận dạng vào khoảng thời gian cụ thể trong audio. Lệnh tôi chạy đầu tiên với mọi file mới:

whisper audio.mp3 \
  --model base \
  --language en \
  --word_timestamps True \
  --highlight_words True \
  --output_format srt \
  --max_line_width 42 \
  --max_line_count 1 \
  --max_words_per_line 4 \
  --output_dir captions/
  • --model base: đủ nhanh cho bản nháp; dùng medium hoặc large-v3 khi cần độ chính xác cao hơn với giọng nặng hoặc lời nhanh.
  • --word_timestamps True: bật timing theo từng chữ. Thiếu cờ này thì --highlight_words không có tác dụng.
  • --highlight_words True: bọc từ đang nói trong <u>...</u>. Hầu hết player render thành gạch chân, không phải màu. Để có màu thật cần ASS hoặc WebVTT.
  • --max_words_per_line 4: chia transcript thành nhóm 4 từ mỗi cue, đủ ngắn để đọc trên màn hình điện thoại.
  • --max_line_count 1: một dòng mỗi cue, tránh cue karaoke bị đẩy xuống hai dòng.

SRT kết quả là bản nháp. Whisper thường đặt sai ranh giới chữ trong lời nhanh, giọng chồng chéo, hoặc tên riêng. Tôi luôn chỉnh tay trong Subtitle Edit trước khi dùng timing cho file production.

Thẻ ASS karaoke: \kf và \k, màu sắc và block style hoàn chỉnh

Thẻ karaoke ASS xuất hiện trước mỗi chữ trong văn bản sự kiện dialogue, mang thời lượng tính bằng centisecond. Ba biến thể:

  • \k<dur>: chuyển màu fill tức thì từ SecondaryColour sang PrimaryColour khi chữ bắt đầu.
  • \kf<dur> (giống hệt \K<dur>): quét màu từ trái sang phải từ SecondaryColour đến PrimaryColour trong thời lượng của chữ. Đây là hiệu ứng karaoke sweep.
  • \ko<dur>: viền outline xuất hiện tức thì khi chữ bắt đầu. Hữu ích cho phong cách lyric fill trong suốt.

Màu ASS dùng ký hiệu &HAABBGGRR: AA là alpha (00 = hoàn toàn không trong suốt), BB là blue, GG là green, RR là red. Vàng (highlight) là &H0000FFFF (R=FF, G=FF, B=00). Trắng là &H00FFFFFF. Đây là block style .ass hoàn chỉnh tôi dùng cho karaoke video dọc 1080x1920:

[Script Info]
ScriptType: v4.00+
PlayResX: 1080
PlayResY: 1920

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Kara,Montserrat,72,&H0000FFFF,&H00FFFFFF,&H00000000,&H80000000,1,0,0,0,100,100,0,0,1,3,1,2,30,30,160,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.20,0:00:04.50,Kara,,0,0,0,,{\kf30}Đây {\kf45}là {\kf60}ka{\kf55}ra{\kf70}oke
  • PrimaryColour &H0000FFFF: vàng, màu highlight khi active.
  • SecondaryColour &H00FFFFFF: trắng, màu trước khi hiệu ứng quét đến.
  • Fontsize 72 / Alignment 2 / MarginV 160: căn dưới giữa tại 160 px, giữ text phía trên thanh home iOS và scrub bar của TikTok trên canvas 1920 px.
  • Outline 3: viền đen 3 pt trên text vàng và trắng là bắt buộc để đọc được trên mọi nền.

Để chuyển SRT từ Whisper sang ASS làm cấu trúc ban đầu: seconv.exe captions/audio.srt AdvancedSubStationAlpha --output-folder captions/ --overwrite. Sau đó mở trong Aegisub, chuyển sang chế độ karaoke timing và gõ nhịp theo từng âm tiết khi nghe audio. Để burn file .ass vào video dọc: ffmpeg -i input.mp4 -vf "ass=captions/audio.ass" -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p -c:a copy output_karaoke.mp4.

Số từ và cài đặt tương phản nào giữ karaoke dễ đọc?

Phụ đề karaoke có ràng buộc dễ đọc chặt hơn phụ đề thông thường vì người xem vừa theo dõi vị trí highlight vừa đọc toàn dòng.

  • Tối đa 3-4 từ mỗi cue. Hơn bốn từ nghĩa là người xem phải quét qua phạm vi rộng trong khi theo dõi hiệu ứng sweep. Trên điện thoại cầm dọc ở 72 pt, bốn từ ngắn lấp đầy chiều rộng màn hình vừa đủ.
  • Thời lượng sweep tối thiểu 25 centisecond mỗi từ. Thẻ \kf dưới khoảng 20 centisecond chạy nhanh hơn mắt có thể theo dõi và animation trở thành nhiễu. Tôi gộp bất kỳ thẻ nào dưới 25 cs với từ liền kề.
  • Thời lượng cue tối thiểu 0,5 giây. Cue quá ngắn biến mất trước khi mắt kịp nhận ra. Tôi chạy "Fix duration too short" trong Subtitle Edit với mức sàn 500 ms.
  • Tỷ lệ tương phản 4,5:1 trở lên, theo WCAG 2.1 SC 1.4.3, giữa màu highlight và nền phía sau. Vàng trên viền đen ở nền tối vượt ngưỡng này dễ dàng. Vàng trên trắng không có viền sẽ thất bại.

Lỗi phổ biến nhất: animate quá nhanh khiến phụ đề trở thành nhiễu thị giác. Giải pháp không phải là font to hơn mà là ít từ hơn mỗi cue hoặc tốc độ nói chậm hơn khi thu âm.

WebVTT inline timestamp cho HTML5 video

Nếu mục tiêu là HTML5 <video> player thay vì burn-in, WebVTT inline timestamp cho phép hiệu ứng karaoke mà không cần re-encode. Mỗi từ được đặt trước bởi timestamp trong dấu ngoặc góc, tăng dần trong khoảng thời gian bắt đầu - kết thúc của cue:

WEBVTT

STYLE
::cue {
  color: white;
  font-size: 1.6em;
  background-color: rgba(0, 0, 0, 0.65);
}
::cue(:past) {
  color: #ffff00;
}
::cue(:future) {
  color: rgba(255, 255, 255, 0.5);
}

00:00:01.200 --> 00:00:04.500
<00:00:01.200>Đây <00:00:01.700>là <00:00:02.200>ka<00:00:02.700>ra<00:00:03.100>oke
  • Cú pháp inline timestamp: <HH:MM:SS.mmm> hoặc <MM:SS.mmm>, phải tăng dần và nằm trong khoảng thời gian của cue.
  • ::cue(:past): style các từ đã qua. Tôi đặt vàng (#ffff00) để hiển thị những gì đã nói.
  • ::cue(:future): làm mờ các từ chưa đến ở 50% opacity.
  • Lưu ý trình duyệt: tính đến năm 2026, ::cue(:past) và ::cue(:future) hoạt động tốt trên Chrome nhưng không đồng đều trên Firefox. Hãy kiểm tra trên trình duyệt mục tiêu.

Gắn file bằng: <track kind="captions" src="captions/audio.vtt" srclang="vi" default>. Xem thêm hướng dẫn kỹ thuật tại trang phụ đề video dọc của tôi.

Tôi nên tự làm hay thuê chuyên gia?

Một creator làm việc trên video mạng xã hội hoàn toàn có thể tự làm toàn bộ quy trình với công cụ miễn phí. Whisper xử lý bản ghi, Aegisub xử lý timing karaoke, và ffmpeg xử lý burn-in. Khi đã quen quy trình, chi phí thời gian khoảng một giờ chỉnh sửa cho mỗi mười phút audio. Với nội dung bạn tự đăng, đó là mức đầu tư hợp lý.

Khi nên thuê thêm: khi file karaoke burn-in cũng cần đi kèm một track accessibility riêng biệt, track đó phải đáp ứng thông số kỹ thuật của nền tảng, không phải chỉ là hiệu ứng trang trí. Nếu bạn cần track phụ đề bằng ngôn ngữ khác, đó là lúc cần chuyên gia ngôn ngữ gốc để tránh lỗi CPS và ngắt dòng sai cho ngôn ngữ đó.

Câu hỏi thường gặp

--highlight_words của Whisper có tạo màu karaoke thật không?

Không, chỉ gạch chân. Whisper bọc từ đang nói trong <u>...</u> trong SRT. Để có chuyển màu thật sự, cần thẻ ASS \kf hoặc WebVTT inline timestamp với CSS ::cue(:past).

Sự khác biệt giữa \k và \kf trong ASS là gì?

\k chuyển màu fill tức thì từ SecondaryColour sang PrimaryColour khi chữ bắt đầu. \kf quét chuyển màu đó từ trái sang phải trong suốt thời lượng của chữ, tạo hiệu ứng wipe karaoke. Muốn hiệu ứng quét, luôn dùng \kf. Dùng \k chỉ khi muốn chuyển màu cứng không animation.

Cue karaoke của tôi khó đọc dù font to - tại sao?

Nguyên nhân gần như luôn là quá nhiều từ mỗi cue kết hợp với thời lượng \kf dưới 20 centisecond. Animation chạy nhanh hơn mắt theo dõi được. Hãy giảm xuống 3 từ mỗi cue và kiểm tra không có tag nào dưới 25 centisecond. Đồng thời đảm bảo có Outline 3 trở lên và màu highlight đủ tương phản với nền.

Có thể dùng ASS karaoke trong soft track MKV không burn-in không?

Có. MKV hỗ trợ ASS/SSA làm codec subtitle track và các player như VLC, mpv, MPC-HC render animation \kf từ soft ASS track. Mux với ffmpeg: ffmpeg -i video.mp4 -i captions/audio.ass -map 0 -map 1 -c copy -c:s ass out.mkv. MP4 không hỗ trợ ASS track; với MP4 phải burn-in hoặc dùng WebVTT/SRT track không có animation màu.

Fontsize ASS bao nhiêu là đúng cho canvas 1080x1920?

Với PlayResY 1920, tôi dùng Fontsize 72 làm chuẩn. Điều này tương đương khoảng 3,75% chiều cao frame, đọc được trên điện thoại 6 inch ở khoảng cách tay cầm bình thường. Tăng lên 80-96 cho phong cách lyric nổi bật hơn; không xuống dưới 60 hoặc người xem trên màn hình nhỏ sẽ khó đọc.

Nguồn

Written by Dao Huy (Lucas), Vietnamese translator & localization specialist (EN · ZH · FR → Vietnamese). See translation services →

Báo giáWhatsApp