วิธีสร้างวิดีโอและภาพ AI ด้วย Meta Muse API
อ่าน 16 นาที • 12 ตุลาคม 2026 (30 ตุลาคม 2026)
useapi.net เป็น API ของบุคคลที่สาม (third-party) ไม่มีส่วนเกี่ยวข้องกับ Meta และไม่ได้รับการรับรองจาก Meta
สารบัญ
- บทนำ
- ใช้โควตาไปเท่าไร
- ก่อนเริ่ม
- สร้างขึ้นมาอย่างไร
- สิ่งที่เราได้เรียนรู้
- ทำคลิป Short 30 วินาทีพร้อมเสียงบรรยาย (บท สามฉาก และรวมคลิป)
- คำถามที่พบบ่อย
- สรุป
บทนำ
Muse API ของ useapi.net สั่งงาน Muse เอเจนต์ AI ส่วนตัวของ Meta ได้จากโค้ด POST ครั้งเดียวสร้างภาพ หรือวิดีโอยาว 10 วินาทีที่มีบทพูด และทุกไฟล์ที่สร้างขึ้นจะเป็น asset id ที่งานถัดไปนำไปใช้เป็นอินพุตได้
Muse ในบทความนี้คือเอเจนต์ของ Meta ที่ muse.ai ไม่ใช่ Skiv บริษัทโฮสต์วิดีโอที่เคยใช้ชื่อ muse.ai จนถึงมีนาคม 2026 API นี้เป็นแบบโฮสต์ให้ จึงไม่ต้องติดตั้งอะไรเอง ต่างจากเครื่องมือที่ต้องโฮสต์เองอย่าง muse2api บทความเปรียบเทียบ Meta Muse video API วาง API ของ Meta เอง muse2api และ API แบบโฮสต์ไว้เทียบกัน
API นี้ทำงานบนแพ็กเกจเว็บไซต์ Muse ของคุณ และแพ็กเกจฟรีก็ใช้ได้ บทความนี้เริ่มจากรูปถ่ายธรรมดาสามรูป คือมอเตอร์ไซค์ BMW รุ่นวินเทจ ผู้หญิงผมแดง และชายหาดใต้สะพาน Golden Gate แล้วรวมเป็นภาพเดียวที่เธอขี่มอเตอร์ไซค์คันนั้นฝ่าคลื่น จากนั้นภาพนี้กลายเป็นวิดีโอที่เธอตะโกนพูดหนึ่งประโยค และในงานที่สาม ผู้หญิงอีกคนจากรูปที่สี่เข้ามาแทนเธอในวิดีโอ โดยฉากขี่ยังเหมือนเดิม ระหว่างทางยังสร้างภาพจากข้อความ และบูรณะพร้อมลงสีภาพถ่ายบุคคลอายุร้อยปี ซึ่งต่อมาเงยหน้าขึ้นและพูดได้ ทุกคำขอด้านล่างคือคำขอจริงที่สร้างสื่อในหน้านี้
ผู้ขี่จากรูปถ่าย ถูกสลับเข้าไปในคลิปที่ Muse สร้างจากภาพนิ่ง (ขั้นตอนที่ 8)
ใช้โควตาไปเท่าไร
useapi.net เป็น API ไม่ใช่บริการสร้างภาพหรือวิดีโอของตัวเอง ทุกคำขอทำงานบนบัญชี Muse ที่คุณเพิ่มผ่าน ตั้งค่า Muse และใช้โควตารายสัปดาห์ของ Muse ในบัญชีนั้น useapi.net ไม่คิดเงินต่อภาพหรือต่อวิดีโอ Muse แสดงโควตาเป็นเปอร์เซ็นต์เต็มที่ใช้ไป ภาพเดียวจึงมักไม่เห็นการเปลี่ยนแปลง
แต่ละขั้นตอนใช้โควตาไปเท่าไรบนแพ็กเกจฟรี อ่านจาก percentUsed ก่อนและหลังขั้นตอน และแต่ละงานใช้เวลานานเท่าไร:
| ขั้นตอน | Endpoint | ผลลัพธ์ | โควตาที่ใช้ | เวลา |
|---|---|---|---|---|
| ข้อความเป็นภาพ, 9:16 | POST /jobs/image | 1152×2048 | ไม่ได้วัด | 30 วิ |
| ข้อความเป็นภาพ, 16:9 พอดี | POST /jobs/image | 2048×1152 | 0% | 21 วิ |
| ผู้ขี่ + มอเตอร์ไซค์ + ชายหาด | POST /jobs/image | 2048×1152 | 0% | 31 วิ |
| ฉากขี่เป็นวิดีโอ | POST /jobs/video | 1280×720, 10 วิ | 3% | 88 วิ |
| บูรณะภาพเก่า | POST /jobs/image | 1344×1792 | 1% | 34 วิ |
| ภาพบุคคลพูดได้ | POST /jobs/video | 832×1104, 10 วิ | 2% | 68 วิ |
| สลับผู้ขี่ | POST /jobs/video | 1248×704, 10 วิ | 3% | 138 วิ |
การอัปโหลดไม่ใช้โควตา บนแพ็กเกจฟรี วิดีโอหนึ่งคลิปใช้ 2 ถึง 3 เปอร์เซ็นต์ของสัปดาห์ และภาพหนึ่งภาพใช้ 0 ถึง 1 เปอร์เซ็นต์ บัญชีฟรีหนึ่งบัญชีจึงสร้างวิดีโอได้ราว 30 ถึง 50 คลิปต่อสัปดาห์ หรือภาพหลายร้อยภาพ (ขั้นตอนที่ 9)
ก่อนเริ่ม
คุณต้องมี API token ของ useapi.net และบัญชี Muse ที่เพิ่มผ่าน ตั้งค่า Muse ก่อนเพิ่มบัญชี:
- Muse ให้บริการในสหรัฐฯ แคนาดา ญี่ปุ่น และสิงคโปร์ (ข้อมูล ณ 30 ตุลาคม 2026) จึงต้องสร้างบัญชีในประเทศใดประเทศหนึ่งในนี้ เมื่อเพิ่มบัญชีแล้ว คุณเรียก API ได้จากทุกที่
- ทำขั้นตอนเริ่มต้นใช้งานของ Muse ที่ muse.ai ให้ครบ รวมถึงการยืนยันอายุของ Meta และสร้างภาพที่นั่นหนึ่งภาพ
- บัญชีต้องล็อกอินด้วยอีเมลและรหัสผ่านได้ เพราะ API ล็อกอินด้วยอีเมลและรหัสผ่าน บัญชี Meta ที่ล็อกอินด้วยรหัสทางอีเมลอย่างเดียวยังไม่มีรหัสผ่าน ให้สร้างรหัสผ่านใน Meta Accounts Center (Password and security) แล้วค่อยเพิ่มบัญชีที่นี่ ถ้าไม่มีรหัสผ่าน การเพิ่มบัญชีจะถูกปฏิเสธด้วย
400 - ใช้บัญชีนี้กับ API เท่านั้น ไม่ใช้กับเครื่องมืออัตโนมัติอื่น เปิดบัญชีที่ muse.ai ในเบราว์เซอร์ได้ แต่ต้องเปิดจากสหรัฐฯ แคนาดา ญี่ปุ่น หรือสิงคโปร์ (ภูมิภาคที่ Muse รองรับอย่างเป็นทางการ) หรือผ่าน VPN ในประเทศเหล่านี้ เพราะ Meta อาจปิดการสร้างวิดีโอของบัญชีที่ถูกใช้จากที่อื่น
ทุกคำขอมีอยู่ใน Postman collection ด้วย
ด้วย ถ้าไม่อยากเขียนโค้ด เทมเพลต n8n Old Photo to Talking Video บูรณะภาพและทำให้ภาพพูดได้จากฟอร์ม และเทมเพลต Narrated Faceless Shorts เปลี่ยนหัวข้อให้เป็นคลิป Short ที่มีเสียงบรรยาย ทั้งบทความนี้ยังมีบน GitHub เป็นสคริปต์เดียว ทั้ง Node.js และ Python: images-videos/ ใน useapi/muse-api และมี agent skill สำหรับ Claude Code และ Codex
ขั้นตอนต่าง ๆ ใช้ curl, jq และตัวแปรกับฟังก์ชันช่วยเหล่านี้:
เปิดดูตัวแปรและฟังก์ชันช่วย
export USEAPI_TOKEN="user:12345-..."
export EMAIL="[email protected]"
export MUSE_PASSWORD="..." # รหัสผ่านบัญชี Muse ใช้ครั้งเดียวในขั้นตอนที่ 1
API=https://api.useapi.net/v1/muse
AUTH="Authorization: Bearer $USEAPI_TOKEN"
enc() { jq -rn --arg v "$1" '$v|@uri'; }
post() { curl -sS -X POST "$API/$1" -H "$AUTH" -H "Content-Type: application/json" -d "$2"; }
get() { curl -sS "$API/$1" -H "$AUTH"; }
upload() { curl -sS -X POST "$API/assets?email=$(enc "$EMAIL")" -H "$AUTH" -H "Content-Type: $2" --data-binary @"$1" | jq -r .assetId; }
download() { curl -sSf "$API/assets/$(enc "$1")" -H "$AUTH" -o "$2"; }
# รันงานแบบ async: ส่งงาน แล้ว poll GET /jobs/{jobid} ทุก 10 วินาที บันทึกผลงานสุดท้ายลงไฟล์ $1
run() {
local job id
job=$(post "$2" "$(jq '. + {async: true}' <<< "$3")")
id=$(jq -r .jobid <<< "$job")
while [ "$(jq -r .status <<< "$job")" = started ]; do
sleep 10
job=$(get "jobs/$(enc "$id")")
done
echo "$job" > "$1"
jq '{status, error, text: .result.text, asset: .result.assets[0].assetId}' "$1"
}
การสร้างทุกครั้งทำงานเป็นงาน (job) ถ้าไม่ใส่ async คำขอ POST จะรอได้ราว 100 วินาที แล้วตอบกลับเป็นข้อมูลงานที่เสร็จแล้ว หรือ 202 ถ้างานยังทำอยู่ วิดีโอในบทความนี้ใช้เวลา 68 ถึง 138 วินาที ฟังก์ชัน run จึงส่งทุกงานด้วย async: true แล้ว poll GET /jobs/jobid ถ้า run แสดง status อื่นที่ไม่ใช่ completed ให้อ่าน error ก่อนทำขั้นต่อไป
ถ้าอยากให้ระบบเรียกกลับแทนการ poll ให้เพิ่ม replyUrl: "https://example.com/hooks/muse" (และ replyRef ถ้าต้องการ) ลงใน body ใดก็ได้ด้านล่าง API จะส่ง POST หนึ่งครั้งพร้อมข้อมูลงานสุดท้ายเป็น JSON ไปที่ URL นั้น
id มีตัวอักษร : และ @ ฟังก์ชัน enc จึงเข้ารหัส URL ให้ทุกครั้งที่ id อยู่ใน path ของ URL อินพุตทั้งหมดของงานหนึ่งต้องอยู่ในบัญชี Muse เดียวกัน การอัปโหลดจึงระบุ email ไว้ และงานจะทำงานบนบัญชีที่เก็บอินพุตของมัน
สร้างขึ้นมาอย่างไร
1. เพิ่มบัญชี
POST /accounts รับอีเมลและรหัสผ่านของบัญชี Muse API ล็อกอินครั้งเดียว เก็บเซสชัน 30 วันไว้ และต่ออายุเซสชันเอง Muse จะส่งรหัสล็อกอินทางอีเมลทุกครั้งที่ล็อกอิน อีเมลนั้นเป็นแค่การแจ้งเตือน ไม่ต้องกรอกอะไร
curl — POST /accounts
post accounts "$(jq -n --arg email "$EMAIL" --arg password "$MUSE_PASSWORD" '{email: $email, password: $password}')" | jq '{health, maxJobs, quota}'
คำตอบแสดง health: "OK", maxJobs (ค่าเริ่มต้น 10) และแพ็กเกจกับการใช้งานของบัญชี ในที่นี้คือ tier: "HATCH_FREE" ซึ่งเป็นแพ็กเกจฟรี ถ้าตอบกลับเป็น 596 แปลว่า Meta ต้องการตรวจสอบความปลอดภัย ให้ล็อกอินที่ muse.ai ในเบราว์เซอร์หนึ่งครั้ง ทำการตรวจสอบให้เสร็จ แล้วส่งอีเมลและรหัสผ่านเดิมอีกครั้ง
2. อัปโหลดรูปถ่าย
POST /assets รับไฟล์ดิบเป็น body ขนาดสูงสุด 50 MB และเขียนลงในพื้นที่ทำงาน (workspace) ของ Muse ในบัญชีนั้น useapi.net ไม่เก็บไฟล์ใดไว้ assetId ในคำตอบคือสิ่งที่งานรับเป็น image_N
curl — POST /assets
BMW=$(upload bmw.jpeg image/jpeg)
RIDER=$(upload rider.jpeg image/jpeg)
BEACH=$(upload beach.jpeg image/jpeg)
OLD_PHOTO=$(upload old-photo.jpeg image/jpeg)
PINK=$(upload pink-hair.jpeg image/jpeg)
echo "$BMW"
# user:12345-email:6578616d706c6540676d61696c2e636f6d-image:7db53e7a1f0979cbab6ff46ec3f0a35b60e6ee579a0d738a9628cf46a0c7a0f5.jpg
อินพุตทั้งห้า: มอเตอร์ไซค์ ผู้ขี่ ชายหาด ภาพบุคคลเก่า และผู้ขี่คนที่สอง
asset id สร้างจากเนื้อหาของไฟล์ การอัปโหลดไฟล์เดิมเข้าบัญชีเดิมซ้ำจึงได้ id เดิม และไม่เขียนอะไรเพิ่ม
3. ภาพจากข้อความ
Muse ไม่มีพารามิเตอร์อัตราส่วนภาพ ต้องเขียนไว้ใน prompt เริ่มจากภาพบุคคลแนวตั้ง:
curl — POST /jobs/image
run portrait.json jobs/image "$(jq -n '{prompt: "Vertical 9:16 full-body portrait photo: a confident young woman biker with long wavy fiery red hair, green eyes and freckles, in a worn black leather jacket, dark jeans and boots, standing in a rain-soaked neon alley at dusk, looking straight at the camera, cinematic lighting, photorealistic."}')"
download "$(jq -r '.result.assets[0].assetId' portrait.json)" portrait.webp

ภาพนี้ได้อัตราส่วน 9:16 พอดี คือ 1152×2048 ส่วนภาพแนวนอนที่สั่งว่า Cinematic 16:9 landscape photo: … ได้กลับมาเป็น 1920×1280 ซึ่งเป็น 3:2 พอเขียนอัตราส่วนว่า in exactly 16:9 aspect ratio ก็ได้ตามที่ต้องการ:
curl — POST /jobs/image
run bmw-noir.json jobs/image "$(jq -n '{prompt: "In exactly 16:9 aspect ratio (landscape), a cinematic photo of a vintage 1920s black BMW motorcycle with white pinstripes, spoked wheels and a brown leather saddle, parked on wet cobblestones at night in San Francisco, the Golden Gate Bridge glowing through fog in the distance, neo-noir moonlight, reflections on the wet street, shot on 35mm film."}')"
download "$(jq -r '.result.assets[0].assetId' bmw-noir.json)" bmw-noir.webp

Muse ตอบว่า “That 16:9 frame with the bridge ghosting through the fog is pure neo-noir. Enjoy.” ข้อความตอบกลับของ Muse อยู่ใน result.text
4. รวมรูปถ่ายสามรูปเป็นภาพเดียว
งานหนึ่งรับภาพได้สูงสุด 9 ภาพ เป็น image_1..image_9 และ prompt อ้างถึงภาพเหล่านั้นด้วยชื่อ ในที่นี้มอเตอร์ไซค์คือ image_1 ผู้ขี่คือ image_2 และชายหาดคือ image_3 prompt ขอให้ Muse ใช้ชายหาดตามรูปถ่ายจริง สะพาน Golden Gate จึงอยู่ตำแหน่งเดิมเหมือนในรูป
curl — POST /jobs/image
run beach-ride.json jobs/image "$(jq -n --arg bmw "$BMW" --arg rider "$RIDER" --arg beach "$BEACH" \
'{image_1: $bmw, image_2: $rider, image_3: $beach,
prompt: "In exactly 16:9 aspect ratio (landscape), a cinematic photo: the woman from image_2 (her face, long wavy red hair, light blue top and jeans) riding the exact vintage motorcycle from image_1 along the shoreline of the beach in image_3, the front wheel cutting through the shallow surf and throwing spray, bright afternoon sun, her hair streaming in the wind, photorealistic. Use the beach, rocks and Golden Gate Bridge from image_3 as the background exactly as photographed: same position, same orientation, not mirrored or redrawn. Keep her face and the motorcycle'\''s design exactly as in the images."}')"
BEACH_RIDE=$(jq -r '.result.assets[0].assetId' beach-ride.json)
download "$BEACH_RIDE" beach-ride.webp

ใช้เวลา 31 วินาที และโควตารายสัปดาห์ไม่เปลี่ยนให้เห็น
5. ภาพกลายเป็นวิดีโอ ไม่ต้องอัปโหลดใหม่
BEACH_RIDE คือ id ของไฟล์ที่ Muse สร้าง ไฟล์อยู่ใน workspace ของบัญชีอยู่แล้ว จึงส่งเข้างานถัดไปเป็น image_1 ได้ทันที ไม่ต้องดาวน์โหลดหรืออัปโหลด Animate image_1 สร้างคลิปที่เริ่มจากภาพและคงรูปทรงของภาพไว้ และประโยคในเครื่องหมายคำพูดจะถูกพูดออกมา
curl — POST /jobs/video
run surf.json jobs/video "$(jq -n --arg img "$BEACH_RIDE" '{image_1: $img,
prompt: "Animate image_1 into a cinematic video in exactly 16:9 aspect ratio (landscape): she rides the vintage motorcycle along the shoreline, the front wheel slices through the shallow waves and sends spray flying, the old engine roars, she raises one fist and shouts with a laugh: \"Nothing beats this view!\" The camera tracks alongside her. The beach, the rocks and the Golden Gate Bridge stay exactly as in image_1 (same orientation). Keep her face and the motorcycle exactly as in image_1."}')"
SURF=$(jq -r '.result.assets[0].assetId' surf.json)
download "$SURF" surf.mp4
ดูบน YouTube ได้ด้วย: 3 photos in, 1 talking video out: Meta Muse API from REST
ได้คลิป 10 วินาทีที่ 1280×720 พร้อมเสียง Muse ตอบว่า “Done. 10 seconds, 16:9 landscape, straight from your image — no edits, no upscaling.”
ครั้งแรกที่รันงานนี้ล้มเหลวหลัง 37 วินาที Muse ตอบว่า “the video worker glitched out before it rendered anything, so no clip was made” API รายงานคำตอบแบบนี้เป็น 503 ซึ่งไม่ได้สร้างอะไร และคำขอเดิมก็ทำงานได้เมื่อรันอีกครั้ง ส่วนการปฏิเสธเพราะเนื้อหาจะเป็น 403 และต้องเปลี่ยน prompt
6. บูรณะและลงสีภาพเก่า
งานสร้างภาพซ่อมภาพได้ด้วย ภาพบุคคลเก่าเป็นภาพสีซีเปียซีดจาง ขนาด 685×900 พิกเซล อัตราส่วน 3:4 prompt ระบุสิ่งที่ต้องแก้ และย้ำให้คงกรอบภาพเดิม
curl — POST /jobs/image
run restored.json jobs/image "$(jq -n --arg img "$OLD_PHOTO" '{image_1: $img,
prompt: "Restore the old photograph image_1 as a high-quality modern photo: remove the scratches, dust, stains, fading and grain, recover sharp detail in the face, hair and fabric, and colorize it naturally (warm natural skin tones, dark brown hair, ivory tulle shawl, a soft pink rose with green leaves, a muted warm background). Keep the exact same person, expression, pose, framing and crop, and the same portrait aspect ratio as image_1 (3:4, 685×900): do not crop, extend or reframe it."}')"
RESTORED=$(jq -r '.result.assets[0].assetId' restored.json)
download "$RESTORED" restored.webp
ผลลัพธ์มีขนาด 1344×1792 เป็นกรอบ 3:4 เดิมที่ใหญ่ขึ้นราวสองเท่า ท่าทางและการครอปเหมือนเดิม Muse ตอบว่า “Done — restored, de-grained, and colorized, same framing and pose.”
7. ภาพบุคคลมีชีวิตขึ้นมา
ภาพที่บูรณะแล้วส่งเข้างานวิดีโอได้ทันที คลิปคงรูปทรงของภาพบุคคลไว้ จึงได้กลับมาเป็น 832×1104
curl — POST /jobs/video
run portrait-video.json jobs/video "$(jq -n --arg img "$RESTORED" '{image_1: $img,
prompt: "Animate image_1 into a video with the same portrait frame: the young woman slowly lifts her eyes to the camera, her smile widens, she gently touches the rose on her shoulder and says softly: \"It has been a hundred years... and you still remember me.\" A light breeze moves a few strands of her hair, soft window light, the camera stays still with a very slow push-in. Keep her face exactly as in image_1."}')"
download "$(jq -r '.result.assets[0].assetId' portrait-video.json)" portrait.mp4
ดูบน YouTube ได้ด้วย: This old portrait just spoke: one API call (Meta Muse API, third-party)
8. สลับผู้ขี่ในวิดีโอ
งานวิดีโอรับวิดีโอเป็นอินพุตได้ด้วย video_1 คือคลิปขี่ฝ่าคลื่นจากขั้นตอนที่ 5 และ image_1 คือรูปผู้หญิงคนที่สองผมสีชมพูมัดเป็นสองจุก prompt ขอให้ Muse เปลี่ยนผู้ขี่และคงทุกอย่างที่เหลือไว้ แล้วให้เธอพูดประโยคใหม่
curl — POST /jobs/video
run swap.json jobs/video "$(jq -n --arg vid "$SURF" --arg img "$PINK" '{video_1: $vid, image_1: $img,
prompt: "Edit video_1: replace the rider with the woman from image_1 (her face, pink hair in two buns, colorful makeup and tattoos), and keep everything else the same: the motorcycle, the beach, the waves and spray, the Golden Gate Bridge, the light, the camera move and the timing. Instead of the original line she shouts: \"Catch me if you can, San Francisco!\" Keep the 16:9 frame and the same length."}')"
download "$(jq -r '.result.assets[0].assetId' swap.json)" swap.mp4
งานนี้ใช้เวลา 138 วินาที ช้าที่สุดในบทความ ทุกงานในบทความนี้จึงรันแบบ async คลิปที่ได้คือฉากขี่เดิม แต่มีผู้หญิงอีกคนอยู่บนมอเตอร์ไซค์และตะโกนประโยคใหม่ Muse ตอบว่า “Done. She’s in, 10 seconds, 16:9, same ride, same bridge, same waves.”
ดูบน YouTube ได้ด้วย: Replace the person in a video, keep everything else: Meta Muse API
9. ตรวจโควตารายสัปดาห์
GET /accounts/email อ่านแพ็กเกจและการใช้งานของบัญชีแบบสด:
curl — GET /accounts/email
get "accounts/$(enc "$EMAIL")" | jq '{session, quota}'
quota.percentUsed คือสัดส่วนของสัปดาห์ที่ใช้ไปเป็นเปอร์เซ็นต์เต็ม และ quota.resetsAt คือเวลาที่โควตาเริ่มใหม่ หนึ่งสัปดาห์หลังจากเริ่มนับ วิดีโอสามคลิปข้างบนใช้คลิปละ 2 ถึง 3 เปอร์เซ็นต์ และภาพใช้ 0 หรือ 1 ตลอดการทดสอบทั้งหมด ซึ่งมีงานอีกสองงานที่ไม่ได้แสดงในที่นี้ บัญชีฟรีเพิ่มจาก 16 เป็น 28 เปอร์เซ็นต์ เมื่อบัญชีใช้โควตาหมด งานใหม่ที่ไม่ระบุ email จะไปที่บัญชีอื่นของคุณ และงานที่ระบุบัญชีนั้นจะได้ 412 จนถึง resetsAt
สิ่งที่เราได้เรียนรู้
- เขียนอัตราส่วนภาพว่า
in exactly 16:9 aspect ratioเพราะCinematic 16:9 landscape photoเคยได้กลับมาเป็น 3:2 - วิดีโอทุกคลิปยาวราว 10 วินาที prompt ที่ขอ 5 วินาทีก็ยังได้ 10 วินาที
- คลิปจากภาพเป็นวิดีโอจะคงรูปทรงของภาพไว้ เว้นแต่ prompt ขอรูปทรงอื่น
in exactly 9:16 aspect ratioเปลี่ยนภาพชายหาด 16:9 ของเราเป็นคลิปแนวตั้ง 720×1280 โดยจัดกรอบใหม่ ไม่ได้ยืดภาพ - ประโยคที่เขียนในเครื่องหมายคำพูดใน prompt วิดีโอจะถูกพูดออกมา
- ส่งไฟล์ที่สร้างแล้วต่อด้วย
assetIdไฟล์อยู่ใน workspace ของบัญชี การแก้ไขต่อกันหลายขั้นจึงไม่ต้องดาวน์โหลดระหว่างทาง - บอกให้ชัดว่าอะไรต้องคงเดิม “Same position, same orientation, not mirrored or redrawn” ทำให้ชายหาดจริงยังอยู่ในภาพรวม
503ที่มาพร้อมคำพูดของ Muse เอง เช่น “glitched out” ควรรันใหม่ ส่วน403คือการปฏิเสธ และต้องเปลี่ยน prompt- ส่งงานวิดีโอด้วย
async: trueคำขอแบบ sync รอได้ราว 100 วินาที แต่การสลับผู้ขี่ใช้ 138 วินาที
ทำคลิป Short 30 วินาทีพร้อมเสียงบรรยาย (บท สามฉาก และรวมคลิป)
วิดีโอ Muse ยาวราว 10 วินาทีเสมอ คลิป Short แนวตั้ง 30 วินาทีที่มีผู้บรรยายจึงต้องใช้งานวิดีโอสามงานและแชตสองครั้ง แชต แรกเขียนบทเป็น JSON งานวิดีโอ สามงานรันพร้อมกัน ฉากละหนึ่งงาน แต่ละงานพูดประโยคของตัวเองด้วยเสียงผู้บรรยายคนเดียวกัน และแชตสุดท้ายรวมคลิปด้วย ffmpeg ใน workspace ของบัญชีเอง คลิป Short ด้านล่างเล่าเรื่องการปะทุของภูเขาไฟ Tambora ในปี 1815 และ “ปีที่ไม่มีฤดูร้อน” ที่ตามมา ใช้เวลาจากหัวข้อหนึ่งบรรทัดจนได้ MP4 ราว 2 นาที
ดูบน YouTube ได้ด้วย: A narrated 30-second Short made only with Meta Muse API calls
คลิป 10 วินาทีสามคลิปรวมเป็น Short เดียวขนาด 720×1280 ยาว 30 วินาที จากหัวข้อ “how a single volcano cooled the whole planet in 1816”
บทใช้เวลา 11 วินาที คลิปทั้งสามใช้ 75, 75 และ 87 วินาทีโดยรันพร้อมกัน และการรวมคลิปใช้ 20 วินาที Short หนึ่งคลิปจึงใช้เวลาราว 2 ถึง 3 นาที คลิปนี้สร้างบนแพ็กเกจ Muse แบบเสียเงิน ซึ่งวิดีโอสี่คลิปในการทดสอบครั้งนั้น (สามคลิปนี้และอีกหนึ่งคลิป) ทำให้ตัวเลขรายสัปดาห์ขยับรวม 2 จุด และแชตไม่ทำให้ขยับเลย บนแพ็กเกจฟรี วิดีโอหนึ่งคลิปใช้ 2 ถึง 3 เปอร์เซ็นต์ของสัปดาห์ Short สามฉากจึงใช้ราว 6 ถึง 9 เปอร์เซ็นต์
ถ้าไม่อยากเขียนโค้ด ขั้นตอนเดียวกันนี้มีเป็นแอป n8n คือเทมเพลต Narrated Faceless Shorts ที่มีฟอร์ม หน้าบท และบันทึกลง Google Drive ตัวอย่าง Short สองคลิปที่เทมเพลตนี้สร้าง เผยแพร่ตามที่ได้ออกมา: The Great Pyramid was once bright white และ Why honey never spoils ซึ่งใช้เสียงจาก text to speech ของ Muse
ทั้งเวิร์กโฟลว์ยังมีเป็นสคริปต์เดียว ทั้ง Node.js และ Python: narrated-short/ ใน useapi/muse-api สคริปต์รับหัวข้อ และจะระบุจำนวนฉากกับคำอธิบายผู้บรรยายเองก็ได้ แล้วบันทึก Short ลงใน output/
ขั้นตอนต่าง ๆ ใช้ฟังก์ชันช่วยข้างบน และ chat ซึ่งเริ่มแชตแล้วอ่าน GET /chats/chatId จนกว่า Muse จะทำเสร็จ:
เปิดดูฟังก์ชันช่วยสำหรับแชต
# เริ่มแชต poll GET /chats/{chatId} ทุก 8 วินาทีจนกว่า Muse จะเสร็จ แล้วบันทึกแชตลงไฟล์ $1
chat() {
local id c
id=$(post chats "$2" | jq -r .chatId)
while sleep 8; do
c=$(get "chats/$(enc "$id")")
jq -e '.pendingApprovals | length > 0' <<< "$c" > /dev/null &&
echo "Muse asks for permission: answer it with POST /chats/{chatId}/approvals/{approvalId}"
jq -e '(.status | IN("completed", "interrupted", "failed")) and (.pendingApprovals | length == 0)' <<< "$c" > /dev/null && break
done
echo "$c" > "$1"
jq '{status, reply: ([.messages[] | select(.role == "assistant" and .text != "")][-1].text)}' "$1"
}
ทุกคำขอด้านล่างระบุ email แชตที่รับไฟล์ต้องรันบนบัญชีที่เก็บไฟล์นั้น คลิปทั้งสามและการรวมคลิปจึงอยู่บนบัญชีเดียวกันทั้งหมด
1. เขียนบทเป็น JSON
แชตแรกขอบทที่มีสามฉากพอดี และระบุรูปแบบ JSON ไว้ละเอียด แต่ละฉากมี line คือสิ่งที่ผู้บรรยายพูด จำกัดไว้ 25 คำให้พอดีกับ 10 วินาที และ visual คือหนึ่งประโยคที่บรรยายภาพในฉาก prompt ยังบอก Muse ไม่ให้สร้างไฟล์ใด ๆ แชตจึงเป็นข้อความล้วน
curl — POST /chats
TOPIC="how a single volcano cooled the whole planet in 1816"
chat script.json "$(jq -n --arg email "$EMAIL" --arg topic "$TOPIC" '{email: $email,
message: "Write a script for a 30-second faceless YouTube Short about: \"\($topic)\". Exactly 3 scenes. Reply with ONLY a JSON object, no prose, no markdown code fences, in this exact shape: {\"title\": string, \"scenes\": [{\"line\": string, \"visual\": string}, {\"line\": string, \"visual\": string}, {\"line\": string, \"visual\": string}]}. \"line\" is what the off-screen narrator says (at most 25 words, about 9 seconds spoken). \"visual\" is a one-sentence description of the 10-second shot, no people talking on camera. Do not create any files, images or videos."}')"
jq -r '[.messages[] | select(.role == "assistant" and .text != "")][-1].text' script.json | sed '/^```/d' > scenes.json
jq . scenes.json
Muse ตอบภายใน 11 วินาทีด้วย JSON อย่างเดียว:
{
"title": "How One Volcano Cooled the Whole Planet in 1816",
"scenes": [
{
"line": "In April 1815, Mount Tambora in Indonesia erupted, the largest explosion in recorded history, blasting ash forty kilometers into the sky.",
"visual": "A massive volcanic eruption at dawn, with a towering ash column rising into the stratosphere above a dark island."
},
{
"line": "That ash veil circled Earth, blocking sunlight and dropping global temperatures, turning summer into winter across North America and Europe.",
"visual": "An animated globe wrapped in a gray haze as sunlight dims and frost spreads across continents."
},
{
"line": "1816 became the Year Without a Summer: crops failed, snow fell in July, and famine spread as the planet shivered.",
"visual": "Snow falling over green farmland in summer, covering withered crops and empty village fields under a pale sun."
}
]
}
เรารัน prompt เดียวกันกับสามหัวข้อ และได้ JSON สะอาดทุกครั้ง ใช้เวลา 11 ถึง 29 วินาที ไม่มี code fence และไม่มีข้อความอื่นเกินมา แต่ตัวอย่างยังน้อย คำสั่ง sed จึงลบบรรทัด ``` ที่หลุดมาไว้ก่อน และสคริปต์บน GitHub จะขอใหม่อีกครั้งเมื่อคำตอบแปลงเป็น JSON ไม่ได้
2. สามฉากพร้อมกัน
แต่ละฉากกลายเป็น POST /jobs/video แบบ async หนึ่งงาน prompt ทั้งสามมีคำอธิบายผู้บรรยายเดียวกันทุกคำ ตามด้วย The narrator says exactly: "<line>" Muse พูดประโยคในเครื่องหมายคำพูดตามที่เขียนไว้ และคำอธิบายที่ใช้ร่วมกันทำให้เสียงคงที่จากคลิปหนึ่งไปอีกคลิป Vertical 9:16 video ได้กลับมาเป็น 720×1280
curl — POST /jobs/video
NARRATOR="Narration: one off-screen narrator only, the same voice throughout: a calm, deep, middle-aged British male documentary narrator, measured pace, warm and authoritative, like a nature documentary. Nobody on screen speaks. No music."
for i in 0 1 2; do
post jobs/video "$(jq --arg email "$EMAIL" --arg narrator "$NARRATOR" --argjson i $i '.scenes[$i] | {email: $email, async: true,
prompt: "Vertical 9:16 video, about 10 seconds. \(.visual) Slow cinematic camera move, photoreal. \($narrator) The narrator says exactly: \"\(.line)\""}' scenes.json)" | jq -r .jobid
done > jobs.txt
POST แต่ละครั้งตอบ 201 ทันทีพร้อม jobid สามงานนี้ใช้สามช่องจาก maxJobs ของบัญชี (ค่าเริ่มต้น 10) จึงรันพร้อมกันได้ ถ้าได้ 429 ตรงนี้ แปลว่าทุกช่องไม่ว่างและยังไม่มีงานใดเริ่ม ให้ส่งงานนั้นใหม่ใน 30 วินาที
3. Poll งาน
GET /jobs/jobid ตอบ status: "started" จนกว่าคลิปจะพร้อม งานรันขนานกัน การอ่านทีละงานต่อกันจึงไม่ทำให้ใช้เวลานานขึ้น:
curl — GET /jobs/jobid
for n in 1 2 3; do
id=$(sed -n "${n}p" jobs.txt)
until job=$(get "jobs/$(enc "$id")"); [ "$(jq -r .status <<< "$job")" != started ]; do sleep 10; done
echo "$job" > clip$n.json
jq '{status, error, text: .result.text, asset: .result.assets[0].assetId}' clip$n.json
done
ทั้งสามงานเสร็จสมบูรณ์ Muse ตอบเรื่องคลิปแรกว่า “Here it is — vertical 9:16, photoreal volcanic eruption at dawn with the narration as specified” แต่ละคลิปพูดประโยคของตัวเองตรงทุกคำ และทุกประโยคที่ยาว 20 ถึง 21 คำพอดีกับ 10 วินาที งานที่ล้มเหลวด้วย 503 ไม่ได้สร้างอะไร และรันใหม่ได้ ความล้มเหลวแบบอื่น เช่น การปฏิเสธ 403 ต้องอ่าน error.message ก่อน
4. รวมคลิปในแชตเดียว
id ของคลิปทั้งสามส่งเข้าแชตเดียวเป็น files ซึ่ง Muse เห็นเป็น video_1, video_2 และ video_3 ข้อความขอให้ใช้ ffmpeg ระบุลำดับ เสียง และชื่อไฟล์ แล้วปิดท้ายด้วย No public links. เมื่อมีประโยคนี้ Muse ไม่หยุดถามขออนุญาต
curl — POST /chats
CLIPS=$(jq -s '[.[].result.assets[0].assetId]' clip1.json clip2.json clip3.json)
chat join.json "$(jq -n --arg email "$EMAIL" --argjson files "$CLIPS" '{email: $email, files: $files,
message: "Concatenate video_1, video_2, video_3 in order into one MP4 with ffmpeg, keep the audio, save it to workspace/your_files/short.mp4 and attach it here. No public links."}')"
SHORT=$(jq -r '[.messages[] | select(.role == "assistant") | .files[] | select(.type == "video")][-1].assetId' join.json)
echo "$SHORT"
# user:12345-email:6578616d706c6540676d61696c2e636f6d-video:ws~your_files~short.mp4
20 วินาทีต่อมา Muse ตอบว่า “Concatenated all three in order — 30 seconds, 720x1280, with audio kept.” และแนบไฟล์มาเป็นข้อความแยก ซึ่งมี video หนึ่งไฟล์ใน files asset id ของไฟล์ตั้งชื่อตาม path ใน workspace จึงควรตั้งชื่อไฟล์ของ Short แต่ละคลิปไม่ให้ซ้ำกัน ffmpeg คัดลอกสตรีมโดยไม่เข้ารหัสใหม่ Short จึงยาว 30.0 วินาทีพอดี และมีทั้งสามประโยคเรียงตามลำดับ
5. ดาวน์โหลด Short
GET /assets/assetId ส่งไฟล์ MP4 กลับมา:
curl — GET /assets/assetId
download "$SHORT" tambora-short.mp4
คลิปและ Short ยังอยู่ใน workspace ของ Muse ในบัญชี ซึ่งแอป muse.ai แสดงให้เห็น และ asset id ของ Short ส่งเข้างานถัดไปเป็น video_1 ได้
ใช้เสียงคงที่แทน: text to speech เป็น audio_1
คำอธิบายที่ใช้ร่วมกันให้เสียงแนวเดียวกัน แต่ไม่ได้ล็อกเสียงไว้ ในคลิป Tambora ทั้งสาม ค่ากลางของระดับเสียงผู้บรรยายอยู่ที่ 105 ถึง 117 Hz ห่างกันไม่ถึงสองครึ่งเสียง แต่ Muse สร้างเสียงใหม่ทุกคลิป ถ้าต้องการเสียงเดียวแน่นอน ให้ Muse อ่านแต่ละประโยคด้วย text to speech ก่อน แล้วส่ง MP3 นั้นเข้างานวิดีโอเป็น audio_1 แชต text to speech ใช้เวลา 20 วินาทีในการทดสอบของเรา
curl — POST /chats และ POST /jobs/video
chat voice1.json "$(jq -n --arg email "$EMAIL" --arg line "$(jq -r '.scenes[0].line' scenes.json)" '{email: $email,
message: "Generate one mp3 file with text to speech: single speaker, voice Aria (avocado_v2:MAI_01), speed 100, language en, clean narration only: no music, no sound effects. Read exactly this text, do not change any word:\n\"\($line)\"\nSave it directly in workspace/your_files/ (not in a subfolder) as line-1.mp3 and attach it here. No public links and no uploads to remote storage."}')"
VOICE1=$(jq -r '[.messages[] | select(.role == "assistant") | .files[] | select(.type == "audio")][-1].assetId' voice1.json)
run clip1.json jobs/video "$(jq --arg email "$EMAIL" --arg voice "$VOICE1" '.scenes[0] | {email: $email, audio_1: $voice,
prompt: "Vertical 9:16 video, about 10 seconds, no people on screen and nobody speaking on camera. \(.visual) Slow cinematic camera move, photoreal. Use audio_1 as the narration soundtrack exactly as it is: the off-screen narrator'\''s voice in audio_1, word for word, with no other voice and no new speech. Quiet ambient sound under it is fine."}' scenes.json)"
jq -r '.result.assets[] | select(.origin == "made") | .assetId' clip1.json
Muse สร้างคลิปของตัวเองก่อน แล้ววาง audio_1 ลงไปด้วย ffmpeg งานแสดงทั้งสองไฟล์ ไฟล์ที่เสร็จแล้วมาก่อนพร้อม origin: "made" และคลิปดิบของ Muse ตามมาพร้อม origin: "generated" ให้ใช้ไฟล์ made เพราะคลิปดิบมีเสียงที่ Muse สร้างขึ้นเองแทนเสียงของคุณ งานวิดีโอนี้ใช้เวลา 108 วินาทีในการทดสอบของเรา ทำซ้ำกับทุกฉาก แล้วรวมคลิป made เหมือนในขั้นตอนที่ 4
คำถามที่พบบ่อย
Meta Muse (muse.ai) มี API ไหม?
ผ่าน useapi.net มี Muse API เป็น API ของบุคคลที่สามที่สั่งงาน Muse บนแพ็กเกจเว็บไซต์ Muse ของคุณ สร้างภาพด้วย POST /jobs/image และวิดีโอด้วย POST /jobs/video ส่วน Model API ทางการของ Meta ขายโมเดล Muse Image ที่ $0.01 ต่อภาพ แต่ ณ ตุลาคม 2026 ยังสร้างวิดีโอไม่ได้ และไม่มี API สำหรับเอเจนต์ Muse ที่ muse.ai ซึ่งเป็นที่สร้างวิดีโอ บทความเปรียบเทียบ Meta Muse video API ของเราพูดถึง muse2api ด้วย
ใช้กับแพ็กเกจ Muse ฟรีได้ไหม?
ผ่าน useapi.net ได้ บทความนี้ทำบนแพ็กเกจฟรี (HATCH_FREE) ซึ่งมีโควตารายสัปดาห์ วิดีโอหนึ่งคลิปใช้ 2 ถึง 3 เปอร์เซ็นต์ และภาพหนึ่งภาพใช้ 0 ถึง 1 เปอร์เซ็นต์ บัญชีฟรีหนึ่งบัญชีจึงสร้างวิดีโอได้ราว 30 ถึง 50 คลิปต่อสัปดาห์ แพ็กเกจเสียเงิน Power ($20 ต่อเดือน) และ Maximum ($100 ต่อเดือน) เพิ่มโควตาให้มากขึ้น (ข้อมูล ณ ตุลาคม 2026)
Muse สร้างวิดีโอยาวเกิน 10 วินาทีได้ไหม?
ผ่าน useapi.net ทำในงานเดียวไม่ได้ วิดีโอทุกคลิปยาวราว 10 วินาที ให้สร้างฉากละหนึ่งคลิป แล้วให้แชตรวมคลิปด้วย ffmpeg เหมือนในทำคลิป Short 30 วินาทีพร้อมเสียงบรรยาย ซึ่งสามคลิปกลายเป็น Short เดียวในราว 2 ถึง 3 นาที (ข้อมูล ณ ตุลาคม 2026) แชตหนึ่งรับวิดีโอได้สูงสุด 3 คลิป
ตั้งอัตราส่วนภาพ ความยาว หรือความละเอียดอย่างไร?
ผ่าน useapi.net ให้เขียนใน prompt เพราะ Muse ไม่มีพารามิเตอร์สำหรับสิ่งเหล่านี้ อัตราส่วนภาพจะได้ตามที่ต้องการเมื่อเขียนว่า in exactly 16:9 aspect ratio และคลิปจากภาพเป็นวิดีโอจะคงรูปทรงของภาพไว้ เว้นแต่ prompt ขอรูปทรงอื่น ความยาวและความละเอียดคงที่ วิดีโอทุกคลิปได้กลับมาราว 720p ยาวราว 10 วินาทีพร้อมเสียง ไม่ว่า prompt จะขออะไร (ข้อมูล ณ ตุลาคม 2026)
ใช้รูปถ่ายและวิดีโอของตัวเองได้ไหม?
ผ่าน useapi.net ได้ อัปโหลดด้วย POST /assets ไฟล์ละไม่เกิน 50 MB แล้วส่ง assetId เป็น image_1..image_9 แบบเดียวกับการส่งผลลัพธ์จากงานก่อนหน้า งานวิดีโอ ยังรับ video_1..video_3 และ audio_1..audio_3 ได้ด้วย อินพุตทั้งหมดของงานหนึ่งต้องอยู่ในบัญชีเดียวกัน
ทำรูปถ่ายให้พูดได้อย่างไร?
ผ่าน useapi.net ส่งรูปเป็น image_1 ไปที่ POST /jobs/video พร้อม prompt แบบ Animate image_1: … she says softly: "…" Muse คงรูปทรงของภาพไว้และพูดประโยคในเครื่องหมายคำพูด เหมือนในขั้นตอนที่ 7 ที่ภาพบุคคลอายุร้อยปีซึ่งบูรณะแล้วเงยหน้าขึ้นและพูดได้ในคลิปเดียว 10 วินาที ใช้เวลา 68 วินาที
เปลี่ยนคนในวิดีโอได้ไหม?
ผ่าน useapi.net ได้ ส่งคลิปเป็น video_1 และรูปของคนใหม่เป็น image_1 แล้วขอให้ Muse เปลี่ยนคนและคงทุกอย่างที่เหลือไว้ เหมือนในขั้นตอนที่ 8 ซึ่งใช้เวลา 138 วินาที บอกให้ชัดว่าอะไรต้องคงเดิม เช่น ฉากขี่ สะพาน และคลื่น และใส่ประโยคในเครื่องหมายคำพูดให้คนใหม่ถ้าต้องการให้พูด
ทำไมคำขอแบบ sync ได้ 202?
ผ่าน useapi.net 202 หมายถึงงานยังทำอยู่หลังผ่านไปราว 100 วินาที และยังทำต่อในฝั่งของเรา ดึงผลด้วย GET /jobs/jobid ส่งงานที่ใช้เวลานานด้วย async: true แล้ว poll หรือเพิ่ม replyUrl เพื่อให้ระบบส่งข้อมูลงานที่เสร็จแล้วมาให้คุณ ในการทดสอบของเรา วิดีโอหนึ่งคลิปใช้เวลา 68 ถึง 138 วินาที
ทำไม Muse ส่งรหัสล็อกอินมาทางอีเมล?
ผ่าน useapi.net API ล็อกอินเข้าบัญชี Muse ของคุณ ซึ่งเกิดขึ้นตอนเพิ่มบัญชี และตอนที่ API ต่ออายุเซสชัน 30 วัน ก่อนเซสชันหมดอายุหรือเมื่อ Muse ขอให้ล็อกอินใหม่ Muse ส่งรหัสล็อกอินทางอีเมลทุกครั้งที่ล็อกอิน และไม่ต้องทำอะไรกับรหัสนั้น ดูตั้งค่า Muse
ต่างจาก muse2api อย่างไร?
ผ่าน useapi.net Muse API เป็นแบบโฮสต์ให้ จึงไม่ต้องติดตั้งอะไรเอง คุณเพิ่มแต่ละบัญชีด้วยอีเมลและรหัสผ่าน และเราดูแลให้บัญชีล็อกอินอยู่เสมอ (เซสชัน 30 วันที่ต่ออายุเอง) ผลลัพธ์ส่งต่อกันด้วย asset id และงานที่เสร็จแล้วเรียก webhook ของคุณได้ คุณยังแชตกับเอเจนต์ Muse ได้ โดยคำตอบสตรีมมาแบบสด ส่วน muse2api เป็นโปรเจกต์ที่คุณต้องติดตั้ง โฮสต์ และดูแลให้ทำงานอยู่เอง
สรุป
แวะมาที่ Discord Server หรือ
Telegram Channel ของเราได้ หากมีคำถามหรือข้อสงสัย
ดูที่เก็บโค้ดบน GitHub ของเราซึ่งมีตัวอย่างโค้ด
คำขอเดียวกันนี้ใช้เป็นเครื่องมือได้บน Muse MCP server แบบโฮสต์ให้ สำหรับ Claude Code, Cursor และ VS Code
เผยแพร่ที่อื่นด้วย
เผยแพร่บน dev.to พูดคุยกันบน Reddit แชร์บน Bluesky และบน YouTube เป็นวิดีโอเดโมทั้ง API ยาว 2:49 (ภาษาอังกฤษ)
เริ่มใช้งาน API
การสมัครสมาชิกเดือนละ $15 ใช้ได้กับทุก API บน useapi.net ใช้ Token เดียวกับทุกบริการ เชื่อมบัญชีของคุณเองได้สูงสุด 3 บัญชีต่อบริการ แต่ละบัญชีใช้แพ็กเกจของเว็บไซต์นั้นเอง ส่วน useapi.net ดูแล REST API การกระจายโหลด และการ polling ให้ ต้องการบัญชีมากกว่านี้? สมัครเพิ่มแต่ละครั้งเดือนละ $10 และได้เพิ่มอีก 3 บัญชีต่อบริการ
ไม่มีบัตรเครดิตที่ใช้จ่ายต่างประเทศได้? สมัครด้วยคริปโตก็ได้ (การชำระด้วยคริปโตขอคืนเงินไม่ได้) ดูราคาและแพ็กเกจสำหรับปริมาณมากได้ที่หน้าการสมัครสมาชิก ถ้าชำระผ่าน Stripe ขอคืนเงินเต็มจำนวนได้ภายใน 14 วันหลังซื้อครั้งแรก หากสร้างงานสำเร็จไม่ถึง 50 ครั้ง สมัครไว้แล้ว? เปลี่ยนจำนวนได้ที่ Stripe Customer Portal โดยไม่ต้องซื้อใหม่





