เข้าใจเลยครับ คำว่า “Infographic Motion” ฟังดูแล้วนึกถึง After Effects ที่ต้องมานั่งดัดกราฟิกทีละเส้น ซึ่ง “ผิดวัตถุประสงค์” ของเราที่ต้องการความไวและประสิทธิภาพ
ในฐานะ Tech Lead ผมขอเปลี่ยนโมเดลงานวันอังคารใหม่ เป็นระบบ “The 3-Step Power Slide”
Concept: คลิป Shorts 60 วินาที ที่แบ่งเป็น 3 ท่อนชัดเจน (ตาม 3 ประเด็นหลักจากคลิปวันจันทร์) โดยใช้ Python ประกอบร่างให้เสร็จ 90% เหลือแค่คุณเติม Text สวยๆ
เราจะเปลี่ยนงานตัดต่อให้เป็น “งานประกอบเลโก้” ครับ
🛠️ Workflow ใหม่: “ง่ายแต่แพง” (Simple but Premium)
เราจะไม่ทำกราฟิกวิ่งวุ่นวาย แต่จะใช้ “ภาพนิ่งพลังสูง (High-End AI Images)” ที่ขยับได้นิดหน่อย (Ken Burns Effect) + “เสียงสรุปที่กระชับ”
ขั้นตอนการทำงาน (Pipeline):
-
Input (จาก Gemini): ขอ 3 ประโยคเด็ด สรุปคลิปวันจันทร์
-
Visual (จาก 4060 Ti): เจนฯ ภาพสวยๆ 3 ภาพ ที่สื่อถึง 3 ประโยคนั้น (ใช้ Stable Diffusion)
-
Audio (จาก Gemini TTS): เจนฯ เสียงพูด 3 ไฟล์
-
Assembly (ใช้ Python): รันโค้ดเพื่อเอา ภาพ+เสียง มาชนกัน ใส่ Effect ซูมเข้า (Zoom) ให้ดูแพง แล้วคายออกมาเป็นไฟล์วิดีโอ
-
Final Touch (CapCut): โยนไฟล์เข้า CapCut กดปุ่ม “Auto Caption” เพื่อขึ้นตัวหนังสือ จบ!
💻 Python Code: The Shorts Assembler (ตัวประกอบร่าง)
โค้ดนี้จะทำหน้าที่เป็น “Editor ส่วนตัว” ให้คุณ มันจะ:
-
อ่านไฟล์เสียง 3 ไฟล์
-
อ่านรูป 3 รูป
-
ปรับรูปเป็นแนวตั้ง (9:16)
-
ใส่ Effect ซูมเข้าช้าๆ (Cinematic Pan/Zoom)
-
ตัดต่อชนกันให้เป๊ะตามความยาวเสียง
สิ่งที่ต้องลงเพิ่ม: pip install moviepy
import os
from moviepy.editor import *
from moviepy.video.fx.all import resize, crop
# ================= CONFIG =================
# โฟลเดอร์เก็บวัตถุดิบ
ASSETS_FOLDER = r"E:\DaVinci_Cache\TokPaluk\Tuesday_Shorts_Assets"
OUTPUT_FILE = "Tuesday_Short_Rendered.mp4"
# ชื่อไฟล์ (ต้องเรียงกัน 1-2-3)
IMAGES = ["img1.png", "img2.png", "img3.png"]
AUDIOS = ["voice1.wav", "voice2.wav", "voice3.wav"]
# ความละเอียด Shorts (1080x1920)
TARGET_RES = (1080, 1920)
ZOOM_FACTOR = 0.04 # ซูมเข้า 4% (กำลังสวย ไม่เวียนหัว)
# ==========================================
def zoom_effect(clip, zoom_ratio=0.04):
# ฟังก์ชันทำภาพซูมเข้า (Ken Burns Effect)
def effect(get_frame, t):
img = get_frame(t)
h, w = img.shape[:2]
# คำนวณขนาดใหม่ตามเวลา
scale = 1 + zoom_ratio * (t / clip.duration)
new_w, new_h = int(w * scale), int(h * scale)
# ใช้ PIL หรือ OpenCV ในการ Resize (MoviePy จัดการให้)
# หมายเหตุ: การเขียน effect สดใน moviepy อาจช้า
# แต่วิธีนี้ง่ายสุดสำหรับการปรับ scale
return img # (ในโค้ดจริง moviepy จะจัดการเรื่อง resize ให้ถ้าใช้ built-in fx)
# ใช้ Built-in scroll/resize ของ moviepy จะเนียนกว่าเขียนเอง
return clip.resize(lambda t : 1 + zoom_ratio * (t / clip.duration))
def create_short():
print("🎬 Starting Shorts Assembler...")
clips = []
for i in range(3):
img_path = os.path.join(ASSETS_FOLDER, IMAGES[i])
aud_path = os.path.join(ASSETS_FOLDER, AUDIOS[i])
print(f" -> Processing Part {i+1}...")
# 1. โหลดเสียง
audio = AudioFileClip(aud_path)
duration = audio.duration + 0.5 # เผื่อหัวท้ายนิดหน่อย
# 2. โหลดภาพ
img_clip = ImageClip(img_path).set_duration(duration)
# 3. จัดองค์ประกอบภาพ (Crop Centerให้เป็นแนวตั้ง)
# สมมติภาพมาเป็น 16:9 หรือ 1:1 ต้อง Crop ให้เต็มจอ 9:16
img_w, img_h = img_clip.size
target_ratio = TARGET_RES[0] / TARGET_RES[1]
# Logic การ Crop พื้นฐาน
if img_w / img_h > target_ratio:
# ภาพกว้างไป ตัดด้านข้างออก
new_w = int(img_h * target_ratio)
img_clip = img_clip.crop(x1=img_w//2 - new_w//2, width=new_w, height=img_h)
else:
# ภาพสูงไป (ไม่ค่อยเกิด) หรือพอดี
pass
img_clip = img_clip.resize(height=TARGET_RES[1]) # ปรับความสูงให้เต็มจอ
# Center Crop อีกทีเพื่อความชัวร์
img_clip = img_clip.crop(x_center=img_clip.w/2, y_center=img_clip.h/2,
width=TARGET_RES[0], height=TARGET_RES[1])
# 4. ใส่ Effect Zoom
# ใช้ method resize ของ moviepy
# เทคนิค: ทำให้ภาพใหญ่ขึ้นนิดนึง แล้วค่อยตัดกลับมาขนาดเดิม (Pan/Zoom)
# เพื่อความง่ายและเร็ว เราจะใช้ภาพนิ่งก่อน ถ้าอยากได้ Zoom จริงต้องใช้ vfx.scroll
# (แบบง่ายที่สุดและเรนเดอร์ไว)
# เราจะไม่ใช้ Zoom สดเพราะกิน Resource สูงใน Python
# เราจะใช้ภาพนิ่งคุณภาพสูงแทน แล้วไปใส่ Animation ใน CapCut (แนะนำ)
# แต่ถ้าคุณอยากให้จบใน Python เลย ใช้บรรทัดนี้:
# img_clip = img_clip.resize(lambda t : 1 + 0.05*(t/duration)) # Zoom In Effect
# img_clip = img_clip.set_position('center')
# *** แนะนำ ***: ปล่อยภาพนิ่งคมๆ แล้วไปใส่ Effect "Pro Zoom" ใน CapCut สวยกว่ามาก
# ดังนั้นโค้ดนี้จะ Output ภาพนิ่งที่ Sync เสียงเป๊ะๆ ให้
img_clip = img_clip.set_audio(audio)
clips.append(img_clip)
# รวมร่าง
print(" -> Concatenating Clips...")
final_video = concatenate_videoclips(clips, method="compose")
# Export
output_path = os.path.join(ASSETS_FOLDER, OUTPUT_FILE)
print(f" 💾 Rendering to {output_path}...")
# ใช้ GPU เรนเดอร์ (h264_nvenc)
final_video.write_videofile(
output_path,
fps=30,
codec="h264_nvenc",
audio_codec="aac",
bitrate="5000k",
ffmpeg_params=["-preset", "p4"]
)
print("✅ Done! Open CapCut and add captions.")
if __name__ == "__main__":
create_short()
📝 คู่มือการใช้งาน (Routine วันอังคาร)
-
เตรียมของ (5 นาที):
-
Prompt Gemini: “สรุปบทความนี้เป็น 3 ข้อคิดสั้นๆ กระแทกใจ สำหรับทำคลิป TikTok” -> เอามาเจรฯ เสียง (
voice1.wav,voice2.wav,voice3.wav) -
Prompt SDXL (4060 Ti): เจนฯ ภาพ 3 ภาพที่สื่ออารมณ์ (
img1.png,img2.png,img3.png)
-
-
รัน Python (1 นาที):
-
กดรันปุ๊บ คุณจะได้ไฟล์
Tuesday_Short_Rendered.mp4ที่มีภาพและเสียงต่อกันเป๊ะๆ ตามเวลาพูด
-
-
จบงานที่ CapCut (5 นาที) – สำคัญมาก:
-
ลากไฟล์วิดีโอที่ได้ลง CapCut
-
กดเมนู Text -> Auto Captions (เลือกภาษาไทย)
-
เลือก Template ตัวหนังสือที่ “ใหญ่ เป้ง กระแทกตา” (แนะนำสีเหลือง หรือ ขาวขอบดำ)
-
Export!
-
ทำไมวิธีนี้ถึงเวิร์คกว่า?
-
ไม่ต้อง Sync ปาก: AI พูดจบ ภาพเปลี่ยนทันที ดูลื่นไหล
-
ภาพชัดระดับ 4K: เพราะเรารันภาพนิ่งมาจาก SDXL ไม่ใช่วิดีโอเบลอๆ
-
CapCut ทำ Text สวยกว่า Python: อย่าเสียเวลาเขียนโค้ดทำตัวหนังสือเลยครับ CapCut มี Template ระดับโลกให้ใช้ฟรี
สรุป: วันอังคารคุณมีหน้าที่แค่ “หา 3 ประโยค” และ “หา 3 ภาพ” ที่เหลือให้ Python กับ CapCut จัดการครับ ง่ายขึ้นไหมครับ?