API ปรับเทียบไทม์สแตมป์เนื้อเพลง
นี่ไม่ใช่การรู้จำเสียง ข้อความใช้เนื้อเพลงต้นฉบับที่คุณให้เสมอ เราทำเพียงวางแต่ละตัวอักษรลงในเวลาที่ถูกต้อง — จึงไม่มีกรณี "ตัวอักษรที่ได้ยินผิดทำให้เนื้อเพลงไม่ตรง"
คำอธิบายเอนด์พอยต์
จัดแนวเนื้อเพลงที่มีอยู่แล้วกับเสียง และคืนไทม์สแตมป์ระดับบรรทัด + ระดับตัวอักษร ใช้สำหรับไฮไลต์ทีละตัวอักษรแบบคาราโอเกะ เนื้อเพลงเลื่อน และการสร้างคำบรรยาย
เอนด์พอยต์: POST /api/music/lyrics-align
การยืนยันตัวตน: ดูการยืนยันตัวตน เฮดเดอร์คือ Authorization: Bearer YOUR_API_KEY
ค่าบริการ: คิดตามครั้ง (ปัจจุบันค่าเริ่มต้น 0.1 หยวนต่อครั้ง) หากเป็นเพลงของแพลตฟอร์มและติ๊กแยกเสียงร้อง จะคิดเพิ่มอีกหนึ่งครั้งตามราคา «แยกเสียงร้อง/ดนตรีประกอบ» ของแพลตฟอร์ม ยอดหักจริงเป็นไปตามการตั้งราคาในระบบหลังบ้าน
เวลาที่ใช้เฉลี่ย: 5–15 วินาที (ขึ้นกับความยาวเสียง และว่าต้องแยกเสียงร้องหน้างานหรือไม่)
ทำไมต้องปรับเทียบ: ไทม์สแตมป์ฝั่งผู้สร้างไม่ได้แม่นเสมอ
API เนื้อเพลงพร้อมไทม์สแตมป์ คืนไทม์สแตมป์รายคำจากฝั่งผู้สร้างโดยตรง และมีความคลาดเคลื่อน:
- ท่อนซ้ำ ฮาร์โมนีหนาแน่น แร็ป และโน้ตยาวมักเลื่อนทั้งท่อนหรือเลื่อนบางตัวอักษร
- บางเพลงขาดช่วงต้น (เช่น ช่วงดนตรีนำล้วน ๆ ชิ้นแรกเริ่มที่สิบกว่าวินาที)
- บางบรรทัดจับจุดอ้างอิงเวลาได้ยาก
การปรับเทียบจะจัดแนวเวลาใหม่บนพื้นฐานของเนื้อเพลงที่คุณให้เอง: แก้เฉพาะเวลา ไม่แก้ข้อความ จึงเหมาะกับงานที่ต้องการความ «ตรงเป๊ะ» (ไฮไลต์ทีละตัวแบบ KTV คำบรรยายรายตัว ให้คะแนนร้องตาม)
วิธีที่แนะนำ (สามขั้น ได้ผลดีที่สุด)
- แยกเสียงร้องล้วนก่อน (แยกเสียงร้อง/ดนตรีประกอบ) แล้วจัดแนวเฉพาะแทร็กเสียงร้อง — ดนตรีประกอบและฮาร์โมนีจะไม่กวนอีก หลักฐานจากการวัด: ในการเทียบทีละบรรทัดระหว่าง «เพลงเต็ม vs แทร็กเสียงร้อง» ของเพลงเดียวกัน 28 บรรทัดมี 5 บรรทัดที่ต่างเกิน 0.25 วินาที (มากสุด 2.64 วินาที) สองเอนจินที่เป็นอิสระต่อกันต่างกันเฉลี่ย 0.239 วินาทีบนแทร็กเสียงร้อง และ 0.508 วินาทีบนเพลงเต็ม — ความสอดคล้องต่างกันเกือบเท่าตัว จึงแนะนำให้เปิดเมื่อทำไฮไลต์รายตัว (KTV/คำบรรยาย) (กำลังวัดอัตราการดีขึ้นจริงด้วยเอนจินใหม่)
- ให้เนื้อเพลงครบถ้วน: ทั้งเพลง ทีละบรรทัด ตรงกับเสียงหนึ่งต่อหนึ่ง หากขาดประโยคหรือท่อน บรรทัดถัดไปจะเลื่อนทั้งหมด อย่าใส่ไทม์สแตมป์เช่น
[00:23.82]ในเนื้อเพลง (ใส่แล้วระบบจะข้ามให้อัตโนมัติ) - เพลงของแพลตฟอร์มเพียงติ๊ก
vocal_separate: trueเราจะทำ «แยก + จัดแนว» ให้ในขั้นตอนเดียว
สามวิธีใช้งาน
| วิธี | ส่งอะไร | เนื้อเพลงมาจากไหน | แยกเสียงร้อง |
|---|---|---|---|
| เพลงภายนอก · URL สาธารณะ | audio_url + เนื้อเพลง |
คุณให้เอง | ❌ ไม่รองรับ |
| เพลงภายนอก · อัปโหลดไฟล์ในเครื่องตรง ๆ (เพิ่ม 2026-10) | audio_object_key + เนื้อเพลง |
คุณให้เอง | ❌ ไม่รองรับ |
| เพลงของแพลตฟอร์ม (เพลงที่สร้างบนเว็บนี้) | song_id |
เราดึงจากบันทึกเพลง | ✅ เลือกได้ |
ความสัมพันธ์ของพารามิเตอร์ (จุดที่ผิดพลาดบ่อยที่สุด โปรดอ่านให้ดี)
- ส่ง
song_id→ ใช้เส้นทางเพลงของแพลตฟอร์ม: อย่าส่งlyrics/audio_url/audio_object_keyอีก - ส่ง
audio_urlหรือaudio_object_key→ ใช้เส้นทางเพลงภายนอก: ส่งได้อย่างใดอย่างหนึ่งเท่านั้น และอย่าส่งsong_id vocal_separateใช้ได้เฉพาะเพลงของแพลตฟอร์ม หากส่งมากับเพลงภายนอกจะถูกปฏิเสธ (เสียงไม่ได้อยู่ฝั่งเรา แยกไม่ได้)
เพิ่มใหม่: อัปโหลดไฟล์ในเครื่องตรง ๆ (เสียงไม่ผ่านเซิร์ฟเวอร์เรา)
ใช้เมื่อเสียงอยู่ในเครื่องคุณและไม่อยากอัปขึ้นที่จัดเก็บสาธารณะของคุณก่อน สองขั้นตอน:
- เรียก
POST /api/music/lyrics-align/upload-ticketพร้อมfile_name/file_size/content_typeจะได้put_url(URL ที่ลงนามแล้ว ไม่มีข้อมูลรับรองระยะยาว) และobject_key PUTไฟล์ไปที่put_urlต้องแนบcontent_typeจากคำตอบไปตามเดิม (มันร่วมในลายเซ็น เปลี่ยนหนึ่งตัวอักษรจะได้ 403)- ตอนส่งงานจัดแนว ให้ส่ง
audio_object_keyแทนaudio_url
ข้อมูลรับรองใช้ครั้งเดียว: เมื่อจัดแนวเสร็จ (สำเร็จหรือล้มเหลว) เซิร์ฟเวอร์จะลบออบเจ็กต์นี้ ใช้ key เดิมซ้ำจะเกิดข้อผิดพลาด
เพิ่มใหม่: เนื้อเพลงไม่ส่งก็ได้แล้ว
เดิมเพลงภายนอกต้องมีเนื้อเพลง ตอนนี้ไม่ส่งก็ใช้ได้ — เซิร์ฟเวอร์จะรู้จำก่อนหนึ่งครั้ง แล้วใช้ข้อความที่รู้จำได้เป็นเนื้อเพลง
ต้องบอกให้ชัดถึงราคาที่ต้องจ่าย: ข้อความจะยึดผลการรู้จำเป็นหลัก บางตัวอักษรอาจไม่ถูกต้อง คำตอบลักษณะนี้จะระบุชัดว่า
lyrics_source: "asr", confidence: "low" และใน warnings[] มี
{"code":"no_reference_lyrics"}
หากจะทำไฮไลต์รายตัว / KTV กรุณาให้เนื้อเพลงต้นฉบับเสมอ
พารามิเตอร์คำขอ
Headers
| พารามิเตอร์ | ชนิด | จำเป็น | หมายเหตุ |
|---|---|---|---|
| Authorization | string | ใช่ | Bearer YOUR_API_KEY |
| Content-Type | string | ใช่ | application/json |
พารามิเตอร์บอดี
| พารามิเตอร์ | ชนิด | จำเป็น | ค่าเริ่มต้น | หมายเหตุ |
|---|---|---|---|---|
| song_id | string | เลือกหนึ่งในสอง | - | ID เพลงของแพลตฟอร์ม |
| lyrics | string | ไม่ | - | เนื้อเพลงต้นฉบับ ขึ้นบรรทัดใหม่ด้วย \n ตอนนี้ไม่ส่งก็ได้ |
| audio_url | string | หนึ่งในสองสำหรับเพลงภายนอก | - | ที่อยู่เสียง ต้องดาวน์โหลดได้จากสาธารณะ |
| audio_object_key | string | หนึ่งในสองสำหรับเพลงภายนอก | - | key ของออบเจ็กต์ที่อัปโหลดตรง (เรียก /lyrics-align/upload-ticket ก่อน) |
| vocal_separate | boolean | ไม่ | false |
จะแยกเสียงร้องก่อนหรือไม่ (เฉพาะเพลงของแพลตฟอร์ม) |
| language | string | ไม่ | ตรวจจับอัตโนมัติ | Chinese / English ฯลฯ; ไม่ส่งจะเดาจากเนื้อเพลง |
| granularity | string | ไม่ | both |
both / line (ไม่คืนรายตัว) / word |
| sections | string | ไม่ | keep |
keep เก็บป้ายท่อนเช่น [Chorus] (ไม่ร่วมในไทม์ไลน์) / drop |
| format | string | ไม่ | json |
json / lrc / lrc-word (สองอันหลังจะคืนข้อความ lrc, lrc_word เพิ่ม) |
ข้อจำกัด
| รายการ | ข้อจำกัด |
|---|---|
| ความยาวเสียง | ≤ 6 นาที (เกินจะคืนข้อผิดพลาดและคืนเงินเต็มจำนวน) |
| แหล่งเสียง | ต้องดาวน์โหลดได้จากสาธารณะ ไม่รับที่อยู่ที่ต้องล็อกอิน |
| รูปแบบเนื้อเพลง | ข้อความล้วน ขึ้นบรรทัดใหม่ด้วย \n; ป้ายท่อนเช่น [Verse], 【主歌】 จะเก็บไว้ตามเดิมแต่ไม่ร่วมในไทม์ไลน์ |
| หลายเพลง | หนึ่งเพลงต่อหนึ่งคำขอ หลายเพลงให้วนเรียกเอง |
| การเก็บผลลัพธ์ | เอนด์พอยต์นี้ไม่บันทึกลงฐานข้อมูล กรุณาเก็บผลลัพธ์เอง |
ตัวอย่างคำขอ
เพลงภายนอก (เนื้อเพลง + ที่อยู่เสียง)
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": "เดินบนถนนหนาวเย็น\nลมกลางคืนแตะต้องดวงตา\nเวลาผ่านไปดั่งสายน้ำ",
"audio_url": "https://your-bucket.example.com/song.mp3"
}'
เพลงของแพลตฟอร์ม (ไม่แยก)
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"}'
เพลงของแพลตฟอร์ม + แยกเสียงร้อง (แนะนำสำหรับคาราโอเกะ)
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}'
คำตอบ
คำตอบที่สำเร็จ
{
"success": true,
"lyrics_source": "platform",
"vocal_separate": false,
"coverage": 0.935,
"exact": 196,
"fuzzy": 4,
"total": 214,
"lines": [
{
"text": "เดินบนถนนหนาวเย็น",
"start": 21.66,
"end": 24.06,
"chars": [
{"char": "เ", "start": 21.66, "end": 21.74, "word": true},
{"char": "ด", "start": 21.98, "end": 22.22, "word": true}
]
}
]
}
คำอธิบายฟิลด์
| ฟิลด์ | ชนิด | หมายเหตุ |
|---|---|---|
success |
boolean | คำขอสำเร็จหรือไม่ |
lyrics_source |
string | platform = เนื้อเพลงจากเพลงของแพลตฟอร์ม; user = เนื้อเพลงที่คุณให้; asr = คุณไม่ให้เนื้อเพลง ข้อความมาจากการรู้จำ |
vocal_separate |
boolean | ครั้งนี้ผ่านการแยกเสียงร้องหรือไม่ |
confidence |
string | high / low (เมื่อ lyrics_source=asr จะเป็น low เสมอ) |
warnings[] |
array | คำเตือนกรณีลดระดับ; เมื่อไม่มีเนื้อเพลงจะมี {"code":"no_reference_lyrics"} |
coverage |
number | คุณภาพการจัดแนว: สัดส่วนตัวอักษรที่มีจุดอ้างอิงเวลาชัดเจน (0–1) |
exact / fuzzy / total |
number | จำนวนตัวอักษรที่ตรงเป๊ะ / ตรงเสียงพ้อง / ตัวอักษรที่ใช้ได้ของเนื้อเพลง |
lines[].text |
string | หนึ่งบรรทัดของเนื้อเพลง ตรงกับต้นฉบับของคุณทีละตัวอักษร |
lines[].start / end |
number | เวลาเริ่มและสิ้นสุดของบรรทัดนี้ (วินาที) |
lines[].section |
boolean | บรรทัดนี้เป็นป้ายท่อนหรือไม่ (true = ไม่มีเวลา ไม่ร่วมไฮไลต์) |
lines[].chars[] |
array | เวลารายตัวอักษร: char, start/end วินาที, word นับเข้าไทม์ไลน์หรือไม่ (เครื่องหมายวรรคตอนเป็น false) |
words[] |
array | รายการตัวอักษรแบบแบน: text / start / end / line; ไม่คืนเมื่อ granularity=line |
lrc |
string | ข้อความ LRC รายบรรทัด (มีเมื่อ format=lrc หรือ lrc-word) |
lrc_word |
string | LRC รายตัวอักษรแบบเสริม มีแท็ก <mm:ss.xx> ในบรรทัด (มีเมื่อ format=lrc-word) |
ใช้ coverage อย่างไร (สามระดับ)
| coverage | การใช้ที่แนะนำ |
|---|---|
| ≥ 0.9 | ทำไฮไลต์รายตัวได้ (คาราโอเกะ) |
| 0.8 – 0.9 | ใช้ผสมรายตัวกับรายบรรทัด หรือไฮไลต์เฉพาะบรรทัด ส่วนรายตัวใช้เป็นข้อมูลอ้างอิง |
| < 0.8 | แนะนำให้ไฮไลต์เฉพาะบรรทัด (ท่อนซ้ำ ฮาร์โมนีหนาแน่น ภาษาถิ่น แร็ปมักได้ต่ำ) |
สถานะและเวลาที่ใช้
| สถานการณ์ | เวลาที่วัดได้ |
|---|---|
| เพลงของแพลตฟอร์ม · ไม่แยก | ประมาณ 4.5 วินาที |
| เพลงของแพลตฟอร์ม · แยก (มีแทร็กเสียงร้องอยู่แล้ว) | ประมาณ 11 วินาที |
| เพลงของแพลตฟอร์ม · แยก (ต้องแยกหน้างาน) | ประมาณ 25 วินาที นานสุดประมาณ 1 นาที |
| เพลงภายนอก · เนื้อเพลง + ที่อยู่เสียง | ประมาณ 5–15 วินาที (ตามความยาวเสียง) |
ขีดจำกัดการรันครั้งเดียวฝั่งเซิร์ฟเวอร์คือ 8 นาที; แนะนำตั้ง timeout ฝั่งไคลเอนต์ไว้ที่ 120 วินาทีขึ้นไป
คำตอบข้อผิดพลาด
{
"success": false,
"message": "音频超过 6 分钟上限(实际 7.2 分钟)"
}
| สถานการณ์ | คิดค่าบริการหรือไม่ |
|---|---|
| ไม่มีเสียง (ไม่ส่งทั้งสาม) | ไม่คิด (ยังไม่เริ่มประมวลผล) |
ส่ง audio_url และ audio_object_key พร้อมกัน |
ไม่คิด (ยังไม่เริ่มประมวลผล) |
| ออบเจ็กต์ที่อัปโหลดตรงยังไม่ลงดิสก์ / ถูกลบแล้ว | ไม่คิด (ยังไม่เริ่มประมวลผล) |
granularity / sections / format ไม่ถูกต้อง |
ไม่คิด (ยังไม่เริ่มประมวลผล) |
| เพลงของแพลตฟอร์มไม่มีอยู่ / ไม่ใช่ของบัญชีปัจจุบัน | ไม่คิด (ยังไม่เริ่มประมวลผล) |
| พารามิเตอร์ขาดหรือไม่ถูกต้อง | ไม่คิด (ยังไม่เริ่มประมวลผล) |
| เสียงเกินขีดจำกัด 6 นาที | คืนเงินเต็มจำนวน |
| เสียงดาวน์โหลดไม่ได้ (ที่อยู่ไม่สาธารณะ / ต้องล็อกอิน) | คืนเงินเต็มจำนวน |
| ไม่ส่งเนื้อเพลง และเซิร์ฟเวอร์รู้จำไม่สำเร็จ | คืนเงินเต็มจำนวน |
| ติ๊กแยกเสียงร้องแต่ไม่มีแทร็กเสียงร้องที่ใช้ได้ | คืนเงินเต็มจำนวน (รวมค่าแยกเสียงร้อง) |
| บริการจัดแนวขัดข้องหรือ timeout | คืนเงินเต็มจำนวน |
หลักการ: ไม่ได้ผลลัพธ์สุดท้ายก็คืนเงินเต็มจำนวน จะคิดค่าบริการเมื่อคืนไทม์สแตมป์รายตัวอักษรจริงเท่านั้น และการคืนเงินทำอัตโนมัติ ไม่ต้องยื่นคำขอ
ค่าบริการ
| รายการ | เก็บเมื่อไร | หมายเหตุ |
|---|---|---|
| ปรับเทียบไทม์สแตมป์เนื้อเพลง (ฐาน) | ทุกครั้ง | คิดตามครั้ง (ปัจจุบันค่าเริ่มต้น 0.1 หยวนต่อครั้ง) ยอดหักจริงเป็นไปตามการตั้งราคาในระบบหลังบ้าน |
| ค่าเพิ่มการถอดข้อความ | เฉพาะเมื่อไม่ให้เนื้อเพลง | เซิร์ฟเวอร์ต้องรันการรู้จำเสียงหนึ่งครั้ง ซึ่งเป็นต้นทุนที่ระดับ «มีเนื้อเพลง» ไม่มี จึงคิดราคาแยก |
| แยกเสียงร้อง (ตัวเลือก เฉพาะเพลงของแพลตฟอร์ม) | เมื่อติ๊ก vocal_separate |
คิดหนึ่งครั้งตามราคา «แยกเสียงร้อง/ดนตรีประกอบ» ที่มีอยู่ของแพลตฟอร์ม และคำนวณรวมกับเอนด์พอยต์นี้ |
ความสัมพันธ์แบบรวม:
จ่ายจริง = ราคาฐาน + (ไม่ให้เนื้อเพลง ? ค่าเพิ่มการถอดข้อความ : 0) + (ติ๊กแยก ? ค่าแยก : 0)
ค่าแยกเสียงร้องเก็บเพียงครั้งเดียว: หากคุณแยกไว้แล้วและได้แทร็กเสียงร้องมาใช้ได้ทันที เอนด์พอยต์นี้จะเป็นผู้เก็บ; หากต้องแยกหน้างาน ขั้นตอนการแยกจะเป็นผู้เก็บ
ตัวอย่างเต็ม (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("คุณภาพการจัดแนว coverage =", res["coverage"])
for line in res["lines"]:
print(f'{line["start"]:7.2f} {line["text"]}')
# คาราโอเกะรายตัว: แต่ละตัวใน line["chars"] มี start / end ของตัวเอง
คำถามที่พบบ่อย
ถาม: ผลลัพธ์เป็นรายตัวหรือรายบรรทัด?
ตอบ: ทั้งสอง lines[].start เป็นรายบรรทัด, lines[].chars[].start / end เป็นรายตัว โปรแกรมเล่นจะเลือกใช้ตามต้องการ
ถาม: ทำไมข้อความที่คืนมาตรงกับที่ผมส่งไปเป๊ะ? ตอบ: ออกแบบไว้เช่นนั้น เราไม่รู้จำแล้วเขียนใหม่ ทำเพียงจัดแนวเวลา เนื้อเพลงจึงไม่ถูก «แก้เป็นคำผิด»
ถาม: coverage สูง แต่ฟังดูยังเพี้ยนอยู่เล็กน้อย?
ตอบ: ความคลาดเคลื่อนรายตัวมักอยู่ระดับสิบมิลลิวินาที; หากทั้งเพลงเพี้ยนเป็นค่าเดียวกันหมด มักเกิดจากมีช่วงเงียบที่ต้นเสียง ตัดออกแล้วลองใหม่ได้
ถาม: ทำไมแยกเสียงร้องเมื่อสักครู่ใช้ได้ ผ่านไปพักหนึ่งกลับบอก «แทร็กเสียงร้องใช้ไม่ได้»? ตอบ: ผลการแยกเป็นที่อยู่ชั่วคราวที่มีอายุสั้น (วัดได้ประมาณครึ่งชั่วโมงแล้วหมดอายุ) กรณีนี้เอนด์พอยต์จะลองแยกใหม่ให้อัตโนมัติ หากยังล้มเหลวจะคืนเงินเต็มจำนวน ดังนั้นวิธี «แยกก่อน แล้วค่อยปรับเทียบทีหลัง» ไม่น่าเชื่อถือ ควรทำต่อเนื่องในกระบวนการเดียวกัน
ถาม: เพลงของแพลตฟอร์มต้องแยกเองก่อนไหม?
ตอบ: ไม่ต้อง เมื่อติ๊ก vocal_separate: true เราจะตรวจว่าเพลงนี้มีแทร็กเสียงร้องอยู่แล้วหรือไม่ หากไม่มีแทร็กที่ใช้ได้จะแจ้งข้อผิดพลาดและคืนเงิน ไม่ใช้เพลงต้นฉบับกลบเกลื่อน
ถาม: ทำเป็นชุดได้ไหม? ตอบ: หนึ่งคำขอหนึ่งเพลง หากเป็นชุดให้วนเรียก แต่ละครั้งคิดค่าบริการตามปกติ แนะนำให้แคชผลลัพธ์ไว้ในเครื่อง
ถาม: ผลลัพธ์ถูกบันทึกไหม? ตอบ: เอนด์พอยต์นี้ไม่บันทึก กรุณาเก็บค่าที่คืนมาเอง (ไทม์สแตมป์รายบรรทัดและรายตัวอยู่ในคำตอบแล้ว)
รับคีย์ API
สร้างคีย์ API ในคอนโซลหลังสมัครสมาชิก การสร้างหนึ่งครั้งราคา 0.6 หยวน ได้ 2 เพลง ดาวน์โหลดไม่จำกัด และไม่ต้องใช้เบอร์โทรศัพท์
รับคีย์ API กลับไปภาพรวม