← โปรเจกต์ทั้งหมด

Platform · 2026

ShotPrompt

เครื่องมือ local-first ที่เปลี่ยนวิดีโอไลฟ์คอมเมิร์ซภาษาไทยและอังกฤษแบบยาวให้เป็นคลิปสั้นพร้อมซับไตเติล สัดส่วน 9:16

TypeScriptBunNext.jsffmpegWhisper

โจทย์

ไลฟ์คอมเมิร์ซยาวหลายชั่วโมง และช่วงที่ดีที่สุดมักซ่อนอยู่ข้างใน การหาช่วงเหล่านั้น ตัดเป็น 9:16 และใส่ซับไตเติลภาษาไทยให้ถูกต้องเป็นงานมือที่ช้า และการอัปโหลดฟุตเทจส่วนตัวขึ้น cloud ก็ไม่ใช่ทางเลือกเสมอไป

สิ่งที่ทำ

ShotPrompt ทำการถอดเสียง วิเคราะห์ไฮไลต์ ตัด และ export ทั้งหมดบนเครื่องของผู้ใช้ pipeline จะ normalize ไฟล์ที่อัปโหลด แยกเสียง ถอดเสียงด้วย whisper.cpp และตรวจจับฉาก จากนั้นมี timeline editor พร้อมแก้ซับระดับคำ ให้เปลี่ยน candidate หรือช่วงที่ลากเลือกเป็นคลิป และตอน export จะฝังซับไทยลงวิดีโอ 9:16 พร้อมปรับระดับเสียง

AI highlight engine เสนอคลิปจากทรานสคริปต์ โดยใช้โมเดลที่ผู้ใช้ตั้งค่าเอง ได้แก่ OpenRouter, Gemini, Ollama หรือ endpoint ที่เข้ากันได้กับ OpenAI บนเครื่อง และหน้า setup จะตรวจ ffmpeg, ffprobe, libx264, libass และ whisper-cli แล้วแสดงคำสั่งติดตั้งให้ แทนที่จะรันติดตั้งเอง

เทคนิค

  • แบ่งเป็น package ชัดเจน Bun workspaces แยก logic ล้วน (core), schema ของ Drizzle + SQLite (db), API ด้วย Elysia (server) และแอป Next.js 16 (web) ที่เรียก API ผ่าน Eden Treaty แบบ type-safe
  • Candidate ทิ้งได้ แต่ clip ทิ้งไม่ได้ Candidate ถูกล้างเมื่อตรวจจับใหม่ ส่วน clip อ้างอิงผ่าน candidateId แบบหลวม ๆ ไม่มี foreign key การวิเคราะห์ซ้ำจึงไม่ทำให้งานที่แก้ไว้เสียหาย
  • Render ตอน export เท่านั้น pipeline ไม่ตัดวิดีโอ พรีวิวเล่นไฟล์ที่ normalize แล้วโดยจำกัดช่วงเวลา และ export กับ SRT ทุกอย่างผ่าน clampToClip ตัวเดียวกัน
  • โมเดลไม่ให้คะแนนตัวเอง LLM คืนชื่อ เหตุผล และหลักฐาน ส่วนเซิร์ฟเวอร์ตรวจหลักฐานกับ subtitle ID จริงและคำนวณคะแนนจาก rubric ที่กำหนดไว้ ถ้ารันล้มเหลวจะไม่เผยแพร่อะไรเลย ไม่ fallback เป็นคะแนนแบบ keyword แบบเงียบ ๆ
  • ปลอดภัยทั้งไฟล์และความลับ ไฟล์ผลลัพธ์เขียนเป็น .tmp ก่อนแล้วค่อย rename และตอนเริ่มระบบจะ recovery job ที่ค้างและเก็บกวาดไฟล์เหลือ API key เข้ารหัสด้วย AES-256-GCM และทั้งสองเซิร์ฟเวอร์ bind ที่ 127.0.0.1 เท่านั้น

ผลลัพธ์

ShotPrompt ทำงานครบตั้งแต่ต้นจนจบบน macOS, Linux และ Windows โดย CI รันเทสต์และ type check ครบทั้งสามระบบ มีโค้ด TypeScript ราว 6,400 บรรทัด และไฟล์เทสต์ประมาณ 56 ไฟล์ข้ามทุก package เป็นเครื่องมือ local ไม่มี deployment หรือ URL สด โค้ดจึงเป็นตัวเดโม ผมยังไม่ได้ประเมินว่าการจัดอันดับของ AI ตรงกับผลงานจริงบนแพลตฟอร์มแค่ไหน และคะแนนมีไว้จัดอันดับคลิปภายในการรันครั้งเดียวเท่านั้น

สิ่งที่ได้เรียนรู้

Media pipeline มักพังกลางทาง การเขียนไฟล์แบบ atomic และ recovery ตอนเริ่มระบบจึงสำคัญไม่แพ้เส้นทางปกติ การให้ผลลัพธ์จากโมเดลเป็นแค่คำแนะนำและให้เซิร์ฟเวอร์เป็นผู้ให้คะแนนทำให้ฟีเจอร์ AI ทดสอบได้ นอกจากนี้ผมสร้างโปรเจ็กต์นี้แบบ spec-first ร่วมกับ AI agents โดยมี spec 7 ฉบับและ plan 7 ฉบับใน repo เป็นตัวนำทาง