API hiệu chỉnh mốc thời gian lời bài hát
Đây không phải nhận dạng giọng nói. Văn bản luôn dùng nguyên văn lời bạn đưa; chúng tôi chỉ đặt từng ký tự vào đúng thời điểm — nên không bao giờ có chuyện "nghe nhầm ký tự khiến lời bị lệch".
Mô tả endpoint
Căn khớp lời có sẵn với âm thanh và trả về mốc thời gian theo dòng và theo ký tự, phục vụ tô sáng từng ký tự kiểu karaoke, lời chạy và tạo phụ đề.
Endpoint: POST /api/music/lyrics-align
Xác thực: xem Xác thực; tiêu đề là Authorization: Bearer YOUR_API_KEY
Tính phí: tính theo lần gọi (hiện mặc định 0,1 ¥ mỗi lần); nếu bài hát thuộc nền tảng mà bạn tích tách giọng hát, sẽ tính thêm một lần theo giá "tách giọng hát/nhạc đệm" của nền tảng. Số tiền thực trừ tuân theo cấu hình giá trong phần quản trị.
Thời gian trung bình: 5–15 giây (tùy độ dài âm thanh và việc có phải tách giọng tại chỗ hay không)
Vì sao cần hiệu chỉnh: mốc thời gian phía tạo nhạc không phải lúc nào cũng chính xác
API lời bài hát có mốc thời gian trả về trực tiếp mốc thời gian theo từng từ của phía tạo nhạc, và chúng có sai số:
- đoạn lặp, hòa âm dày, rap và nốt dài thường lệch tổng thể hoặc lệch vài ký tự;
- một số bài thiếu một đoạn ở đầu (ví dụ đoạn dạo thuần nhạc, mảnh đầu tiên chỉ bắt đầu từ giây thứ mười mấy);
- vài dòng khó neo vào một mốc thời gian rõ ràng.
Hiệu chỉnh làm lại việc căn thời gian dựa trên lời do chính bạn cung cấp: chỉ sửa thời gian, không đổi văn bản, phù hợp với các trường hợp cần "khớp chuẩn" (tô sáng từng ký tự kiểu KTV, phụ đề theo ký tự, chấm điểm hát theo).
Cách làm được khuyến nghị (ba bước, hiệu quả nhất)
- Trích giọng hát thuần trước (tách giọng hát/nhạc đệm) và chỉ căn trên track giọng hát — nhạc đệm và hòa âm không còn gây nhiễu. Căn cứ đo được: khi so sánh từng dòng giữa "bản mix đầy đủ và track giọng hát" của cùng một bài, 5 trong 28 dòng lệch hơn 0,25 giây (nhiều nhất 2,64 giây); hai động cơ độc lập lệch trung bình 0,239 giây trên track giọng hát và 0,508 giây trên bản mix đầy đủ — độ nhất quán gần như chênh gấp đôi. Vì vậy với tô sáng từng ký tự (KTV/phụ đề) nên bật. (Mức cải thiện cụ thể đang được đo lại bằng động cơ mới.)
- Cung cấp lời đầy đủ: cả bài, theo dòng, khớp một-một với âm thanh. Thiếu một câu hay một đoạn sẽ làm lệch toàn bộ các dòng sau; đừng đưa mốc thời gian như
[00:23.82]vào lời (có cũng sẽ tự bỏ qua). - Với bài hát của nền tảng chỉ cần tích
vocal_separate: true, chúng tôi làm "tách + căn" trong một bước.
Ba cách dùng
| Cách dùng | Gửi gì | Lời lấy từ đâu | Tách giọng hát |
|---|---|---|---|
| Bài hát ngoài · URL công khai | audio_url + lời |
Bạn tự cung cấp | ❌ Không hỗ trợ |
| Bài hát ngoài · tải tệp cục bộ trực tiếp (mới 2026-10) | audio_object_key + lời |
Bạn tự cung cấp | ❌ Không hỗ trợ |
| Bài hát của nền tảng (bài tạo trên site này) | song_id |
Chúng tôi lấy từ bản ghi bài hát | ✅ Tùy chọn |
Quan hệ giữa các tham số (chỗ dễ sai nhất, hãy đọc kỹ)
- Gửi
song_id→ đi đường bài hát nền tảng: đừng gửi thêmlyrics/audio_url/audio_object_key; - Gửi
audio_urlhoặcaudio_object_key→ đi đường bài hát ngoài: chỉ một trong hai, và đừng gửisong_id; vocal_separatechỉ có hiệu lực với bài hát nền tảng; gửi cho bài hát ngoài sẽ bị từ chối (âm thanh không ở phía chúng tôi, không tách được).
Mới: tải tệp cục bộ trực tiếp (âm thanh không đi qua máy chủ của chúng tôi)
Dùng khi âm thanh ở trên máy bạn và bạn không muốn đưa lên kho công khai của mình trước. Hai bước:
- Gọi
POST /api/music/lyrics-align/upload-ticketvớifile_name/file_size/content_type, nhậnput_url(URL đã ký, không chứa thông tin xác thực dài hạn) vàobject_key; PUTtệp lênput_url, phải mang nguyêncontent_typetrong phản hồi (nó tham gia chữ ký; đổi một ký tự là 403);- Khi gửi yêu cầu căn, truyền
audio_object_keythay vìaudio_url.
Thông tin xác thực dùng một lần: khi việc căn xong (thành công hay thất bại) máy chủ sẽ xoá đối tượng này, dùng lại cùng key sẽ báo lỗi.
Mới: lời đã có thể không gửi
Trước đây bài hát ngoài bắt buộc phải có lời. Nay có thể bỏ qua: máy chủ chạy một lần nhận dạng và dùng văn bản nhận dạng được làm lời.
Cái giá phải nói rõ: văn bản khi đó lấy theo kết quả nhận dạng, vài ký tự có thể sai. Những phản hồi này được ghi rõ
lyrics_source: "asr", confidence: "low" và trong warnings[] có
{"code":"no_reference_lyrics"}.
Muốn tô sáng từng ký tự / KTV thì nhất định phải cung cấp nguyên văn lời.
Tham số yêu cầu
Headers
| Tham số | Kiểu | Bắt buộc | Ghi chú |
|---|---|---|---|
| Authorization | string | có | Bearer YOUR_API_KEY |
| Content-Type | string | có | application/json |
Tham số body
| Tham số | Kiểu | Bắt buộc | Mặc định | Ghi chú |
|---|---|---|---|---|
| song_id | string | một trong hai | - | ID bài hát nền tảng |
| lyrics | string | không | - | Nguyên văn lời, phân dòng bằng \n. Nay có thể không gửi |
| audio_url | string | một trong hai cho bài ngoài | - | Địa chỉ âm thanh, phải tải công khai được |
| audio_object_key | string | một trong hai cho bài ngoài | - | Key của đối tượng tải trực tiếp (gọi /lyrics-align/upload-ticket trước) |
| vocal_separate | boolean | không | false |
Có tách giọng hát trước hay không (chỉ bài hát nền tảng) |
| language | string | không | tự nhận | Chinese / English v.v.; không gửi thì đoán từ nội dung lời |
| granularity | string | không | both |
both / line (không trả theo ký tự) / word |
| sections | string | không | keep |
keep giữ các nhãn đoạn như [Chorus] (không tham gia dòng thời gian) / drop |
| format | string | không | json |
json / lrc / lrc-word (hai cái sau trả thêm văn bản lrc, lrc_word) |
Giới hạn
| Mục | Giới hạn |
|---|---|
| Độ dài âm thanh | ≤ 6 phút (vượt sẽ báo lỗi và hoàn tiền toàn bộ) |
| Nguồn âm thanh | Phải tải công khai được, không nhận địa chỉ cần đăng nhập |
| Định dạng lời | Văn bản thuần, phân dòng bằng \n; các nhãn đoạn như [Verse], 【主歌】 giữ nguyên nhưng không tham gia dòng thời gian |
| Theo lô | Một bài mỗi lần gọi; nhiều bài thì tự lặp |
| Lưu kết quả | Endpoint này không lưu trữ, hãy tự lưu kết quả trả về |
Ví dụ yêu cầu
Bài hát ngoài (lời + địa chỉ âm thanh)
curl -X POST https://www.suno-api.io/api/music/lyrics-align \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lyrics": "Bước qua phố lạnh\nGío đêm khẽ chạm mắt tôi\nThời gian trôi như nước",
"audio_url": "https://your-bucket.example.com/song.mp3"
}'
Bài hát nền tảng (không tách)
curl -X POST https://www.suno-api.io/api/music/lyrics-align \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"song_id": "17e52af7-b5df-4877-a98a-dce94e0e6aa2"}'
Bài hát nền tảng + tách giọng hát (khuyến nghị cho karaoke)
curl -X POST https://www.suno-api.io/api/music/lyrics-align \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"song_id": "17e52af7-b5df-4877-a98a-dce94e0e6aa2", "vocal_separate": true}'
Phản hồi
Phản hồi thành công
{
"success": true,
"lyrics_source": "platform",
"vocal_separate": false,
"coverage": 0.935,
"exact": 196,
"fuzzy": 4,
"total": 214,
"lines": [
{
"text": "Bước qua phố lạnh",
"start": 21.66,
"end": 24.06,
"chars": [
{"char": "B", "start": 21.66, "end": 21.74, "word": true},
{"char": "ư", "start": 21.98, "end": 22.22, "word": true}
]
}
]
}
Giải thích các trường
| Trường | Kiểu | Ghi chú |
|---|---|---|
success |
boolean | Yêu cầu có thành công hay không |
lyrics_source |
string | platform = lời lấy từ bài hát nền tảng; user = lời do bạn cung cấp; asr = bạn không đưa lời, ký tự đến từ nhận dạng |
vocal_separate |
boolean | Lần này có đi qua tách giọng hát hay không |
confidence |
string | high / low (khi lyrics_source=asr luôn là low) |
warnings[] |
array | cảnh báo suy giảm; khi không có lời sẽ chứa {"code":"no_reference_lyrics"} |
coverage |
number | Chất lượng căn khớp: tỉ lệ ký tự có neo thời gian rõ ràng (0–1) |
exact / fuzzy / total |
number | ký tự khớp chính xác / khớp đồng âm / ký tự hợp lệ của lời |
lines[].text |
string | một dòng lời, từng ký tự đúng bằng nguyên văn của bạn |
lines[].start / end |
number | thời điểm bắt đầu và kết thúc của dòng (giây) |
lines[].section |
boolean | dòng này có phải nhãn đoạn (true = không có thời gian, không tô sáng) |
lines[].chars[] |
array | thời gian từng ký tự: char, start/end giây, word có tính vào dòng thời gian hay không (dấu câu là false) |
words[] |
array | danh sách ký tự phẳng: text / start / end / line; không trả khi granularity=line |
lrc |
string | văn bản LRC theo dòng (chỉ khi format=lrc hoặc lrc-word) |
lrc_word |
string | LRC theo ký tự mở rộng, có thẻ <mm:ss.xx> trong dòng (chỉ khi format=lrc-word) |
Dùng coverage thế nào (ba mức)
| coverage | Cách dùng khuyến nghị |
|---|---|
| ≥ 0,9 | có thể tô sáng từng ký tự (karaoke) |
| 0,8 – 0,9 | dùng kết hợp theo ký tự và theo dòng, hoặc chỉ tô sáng theo dòng, ký tự chỉ để tham khảo |
| < 0,8 | chỉ nên tô sáng theo dòng (đoạn lặp, hòa âm dày, tiếng địa phương, rap thường ra thấp) |
Trạng thái và thời gian
| Tình huống | Thời gian đo được |
|---|---|
| Bài hát nền tảng · không tách | khoảng 4,5 giây |
| Bài hát nền tảng · tách (đã có track giọng hát) | khoảng 11 giây |
| Bài hát nền tảng · tách (phải tách tại chỗ) | khoảng 25 giây, lâu nhất khoảng 1 phút |
| Bài hát ngoài · lời + địa chỉ âm thanh | khoảng 5–15 giây (tùy độ dài) |
Giới hạn một lần chạy trên máy chủ là 8 phút; nên đặt timeout phía client từ 120 giây trở lên.
Phản hồi lỗi
{
"success": false,
"message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
| Tình huống | Có tính phí không? |
|---|---|
| Thiếu âm thanh (không gửi cả ba) | Không tính (chưa bắt đầu xử lý) |
Gửi đồng thời audio_url và audio_object_key |
Không tính (chưa bắt đầu xử lý) |
| Đối tượng tải trực tiếp chưa có / đã bị xoá | Không tính (chưa bắt đầu xử lý) |
granularity / sections / format không hợp lệ |
Không tính (chưa bắt đầu xử lý) |
| Bài hát nền tảng không tồn tại / không thuộc tài khoản hiện tại | Không tính (chưa bắt đầu xử lý) |
| Thiếu tham số hoặc tham số không hợp lệ | Không tính (chưa bắt đầu xử lý) |
| Âm thanh vượt giới hạn 6 phút | Hoàn tiền toàn bộ |
| Âm thanh không tải được (địa chỉ không công khai / cần đăng nhập) | Hoàn tiền toàn bộ |
| Không gửi lời mà máy chủ nhận dạng thất bại | Hoàn tiền toàn bộ |
| Tích tách giọng hát nhưng không có track giọng dùng được | Hoàn tiền toàn bộ (gồm cả phí tách) |
| Dịch vụ căn khớp bất thường hoặc timeout | Hoàn tiền toàn bộ |
Nguyên tắc: không có kết quả cuối cùng thì hoàn tiền toàn bộ. Chỉ tính phí khi mốc thời gian từng ký tự thực sự được trả về, và việc hoàn tiền tự động, không cần yêu cầu.
Tính phí
| Khoản | Khi nào thu | Ghi chú |
|---|---|---|
| Hiệu chỉnh mốc thời gian lời (cơ bản) | mỗi lần gọi | theo lần gọi (hiện mặc định 0,1 ¥ mỗi lần); số tiền thực trừ tuân theo cấu hình giá trong phần quản trị |
| Phụ phí chép lời | chỉ khi không cung cấp lời | máy chủ phải chạy một lần nhận dạng giọng nói, chi phí mà mức "có lời" không có, nên tính riêng |
| Tách giọng hát (tùy chọn, chỉ bài hát nền tảng) | khi tích vocal_separate |
tính một lần theo giá "tách giọng hát/nhạc đệm" hiện có của nền tảng, quyết toán cùng endpoint này |
Quan hệ kết hợp:
thực trả = giá cơ bản + (không cung cấp lời ? phụ phí chép lời : 0) + (tích tách ? giá tách : 0)
Phí tách giọng hát chỉ thu một lần: nếu bạn đã tách và có sẵn track giọng hát thì endpoint này thu; nếu phải tách tại chỗ thì bước tách thu.
Ví dụ đầy đủ (Python)
import requests
API_KEY = "YOUR_API_KEY"
BASE = "https://www.suno-api.io"
def align_lyrics(song_id=None, lyrics=None, audio_url=None, vocal_separate=False):
payload = {}
if song_id:
payload["song_id"] = song_id
payload["vocal_separate"] = vocal_separate
else:
payload["lyrics"] = lyrics
payload["audio_url"] = audio_url
r = requests.post(
f"{BASE}/api/music/lyrics-align",
headers={"Authorization": f"Bearer {API_KEY}"},
json=payload,
timeout=600,
)
data = r.json()
if not data.get("success"):
raise RuntimeError(data.get("message"))
return data
res = align_lyrics(song_id="17e52af7-b5df-4877-a98a-dce94e0e6aa2", vocal_separate=True)
print("chất lượng căn khớp coverage =", res["coverage"])
for line in res["lines"]:
print(f'{line["start"]:7.2f} {line["text"]}')
# karaoke từng ký tự: mỗi ký tự trong line["chars"] có start / end riêng
Câu hỏi thường gặp
H: Kết quả là theo ký tự hay theo dòng?
Đ: Cả hai. lines[].start là theo dòng, lines[].chars[].start / end là theo ký tự; trình phát cần cái nào thì lấy cái đó.
H: Vì sao văn bản trả về giống hệt cái tôi gửi? Đ: Thiết kế là vậy. Chúng tôi không nhận dạng rồi viết lại, chỉ căn thời gian, nên lời không bao giờ bị "sửa thành lỗi chính tả".
H: coverage cao mà nghe vẫn hơi lệch?
Đ: Sai số từng ký tự thường ở mức vài chục mili giây; nếu cả bài lệch một lượng cố định thì nhiều khả năng đầu âm thanh có một đoạn im lặng — cắt bỏ rồi thử lại.
H: Vì sao lúc trước tách dùng được, một lúc sau lại báo "track giọng hát không khả dụng"? Đ: Kết quả tách là địa chỉ tạm thời có hiệu lực ngắn (đo được: hết hiệu lực sau khoảng nửa giờ). Khi đó endpoint sẽ tự thử tách lại; nếu vẫn thất bại sẽ hoàn tiền toàn bộ. Nên cách dùng "tách trước, hiệu chỉnh sau" không đáng tin — hãy làm liền trong cùng một luồng.
H: Bài hát nền tảng có cần tôi tự tách trước không?
Đ: Không. Khi tích vocal_separate: true chúng tôi kiểm tra bài đó đã có track giọng hát chưa; không có track dùng được thì báo lỗi và hoàn tiền, chứ không dùng bản gốc để cho qua.
H: Có làm theo lô được không? Đ: Một lần gọi một bài. Theo lô thì tự lặp; mỗi lần gọi đều tính phí bình thường, nên lưu kết quả vào bộ nhớ đệm cục bộ.
H: Kết quả có được lưu không? Đ: Endpoint này không lưu trữ, hãy tự lưu giá trị trả về (mốc thời gian theo dòng và theo ký tự đều có trong phản hồi).
Lấy khóa API
Tạo khóa API trong bảng điều khiển sau khi đăng ký. Mỗi lần tạo tốn 0,6 ¥ và trả về 2 bản nhạc, tải xuống không giới hạn và không cần số điện thoại.
Lấy khóa API Quay lại tổng quan