API hiệu chỉnh mốc thời gian lời bài hát

Cập nhật 2026-09-18 · nhóm Suno-API

Đâ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ố:

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)

  1. 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.)
  2. 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).
  3. 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ỹ)

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:

  1. Gọi POST /api/music/lyrics-align/upload-ticket với file_name / file_size / content_type, nhận put_url (URL đã ký, không chứa thông tin xác thực dài hạn) và object_key;
  2. PUT tệp lên put_url, phải mang nguyên content_type trong phản hồi (nó tham gia chữ ký; đổi một ký tự là 403);
  3. Khi gửi yêu cầu căn, truyền audio_object_key thay 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).

Tiếp theoAPI chứng nhận cấp phép sử dụng âm nhạc thương mạ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