โปรเจกต์ · โอเพนซอร์ส · รู้จำเสียงพูด · AI ในเครื่อง · ตุลาคม 2026

mlsubgen — ซับไตเติลสำหรับทุกวิดีโอในบ้าน ทำเองที่บ้าน และเปิดเป็นโอเพนซอร์สแล้ว

คลังของเรามีหนังและซีรีส์ภาษาญี่ปุ่นที่ไม่เคยมีซับไตเติลมาด้วย และครอบครัวที่ดูเป็นภาษาอังกฤษและภาษาไทย นี่คือเครื่องมือที่เราสร้างบนเครื่อง AI เพื่อแก้ปัญหานั้น: มันฟังวิดีโอ หาว่าพูดภาษาอะไรและตรงไหน ถอดเสียงด้วยเอนจินรู้จำเสียงสองตัวที่ตรวจทานกันเอง แปลผลเป็นภาษาใดก็ได้ใน 45 ภาษาที่คุณติ๊ก แล้ววางไฟล์ซับไตเติลไว้ข้างวิดีโอ — ข้ามคืน โดยไม่ต้องเฝ้า และไม่มีข้อมูลแม้แต่ไบต์เดียวออกนอกบ้าน ตั้งแต่ตุลาคม 2026 มันอยู่บน GitHub ให้ใครก็ตามที่มีการ์ด NVIDIA นำไปรันได้

github.com/dodgypast/mlsubgen Apache-2.0 · Python · Docker หรือติดตั้งบนเครื่อง · GPU ตั้งแต่ 8 GB ขึ้นไป

มันทำอะไร

รันเองได้

Linux ที่มี GPU ของ NVIDIA, ffmpeg, Docker พร้อม NVIDIA Container Toolkit และ Ollama บนเครื่องเดียวกันสำหรับตัวแปล สิ่งเดียวที่ต้องกรอกคือวิดีโอของคุณอยู่ที่ไหน
git clone https://github.com/dodgypast/mlsubgen.git && cd mlsubgen
cp .env.example .env                  # MEDIA_DIR = your videos; your uid/gid; default languages
mkdir -p data models                  # state and the model cache, created by you so the containers can write them
docker compose up -d --build          # ~14 GB image (CUDA torch and the speech stacks), 10-20 minutes the first time
docker compose run --rm worker pull   # the speech models (~8 GB) and the translators your card can hold
docker compose run --rm worker pull speakers   # optional: the two speaker models (33 MB) for --speakers

จากนั้นเปิด http://<host>:8790 ใส่โฟลเดอร์เข้าคิว แล้วดูล็อก มีแบบติดตั้งบนเครื่องโดยตรงด้วย (setup.sh พร้อม user unit สำหรับเวิร์กเกอร์และหน้าเว็บ) คำสั่งบรรทัดคำสั่งสำหรับทุกอย่างที่หน้าเว็บทำได้ และ mlsubgen --help ที่อธิบายตัวเองได้ การ์ดจอเป็นตัวตัดสินส่วนที่เหลือ:

GPUโปรไฟล์อะไรเปลี่ยน
24 GBfullเอนจินรู้จำเสียงทั้งสองอยู่บนการ์ดพร้อมกัน และตัวแปลขนาด 27–31B ที่เราใช้ที่นี่
12–20 GB12gbwhisper แบบ int8 และตัวแปลขนาด 12B (7 GB) สำหรับทุกคู่ภาษา
8 GB8gbเอนจินรู้จำเสียงอยู่บนการ์ดทีละตัว และตัวแปลขนาด 4B สำหรับทุกคู่ภาษา
เลือกจากหน่วยความจำของ GPU ตอนเริ่ม หรือบังคับด้วย MLSUBGEN_PROFILE ตัวแปลที่เล็กกว่าอ่อนกว่าอย่างเห็นได้ชัด โดยเฉพาะญี่ปุ่นเป็นอังกฤษ mlsubgen bench รันขั้นตอนเสียงครั้งเดียวแล้วให้ตัวแปลทุกตัวแปลบรรทัดเดียวกัน วางเทียบกัน คุณจึงเห็นได้ว่าต่างกันแค่ไหนบนเนื้อหาของคุณเองก่อนจะรันยาว ๆ
เกี่ยวกับโค้ด โค้ดเขียนโดยมี Claude (โมเดลของ Anthropic) ช่วย ตรวจทานทีละบรรทัด และใช้งานจริงทุกวันกับคลังของเราเอง — เป็นโปรเจกต์งานอดิเรกที่ดูแลโดยคนคนเดียว ไม่ใช่ผลิตภัณฑ์ issue บน GitHub ได้รับคำตอบ dependency ที่ปักหมุดไว้ในรีโพซิทอรีคือสภาพแวดล้อมอ้างอิง และ “ใช้ได้ที่เครื่องฉัน” หมายถึงใช้ได้ในสภาพแวดล้อมนั้น

ข้อค้นพบที่ทำให้มันได้ผล

เวอร์ชันแรก ๆ ถอดเสียงได้สวยงามแต่ก็ยังพลาดบทสนทนาไปทั้งช่วง ต้องใช้เครื่องมือวัดผล ไม่ใช่โมเดลที่ดีกว่า จึงพบสาเหตุ: ตัวตรวจจับเสียงพูดเป็นผู้ตัดสินว่าส่วนไหนของเสียงที่เอนจินรู้จำเสียงได้รับอนุญาตให้ฟัง และในแอนิเมชันที่มีเพลงประกอบ มันไม่จับบทพูดจำนวนมากเลย การทะเลาะกันสามสิบวินาทีหายไป เพราะตัวตรวจจับเรียกมันว่าเพลง การปรับปรุงทุกอย่างหลังจากนั้น — เอนจินที่ดีกว่า การรวมที่ดีกว่า — ทำงานได้แค่กับสิ่งที่มันได้รับมา

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

ในตอนที่เผยให้เห็นปัญหา การเปลี่ยนแปลงนี้กู้บทสนทนาที่เอนจินไม่เคยได้รับอนุญาตให้ฟังกลับมาได้แปดนาที

สามสิบวินาทีคือกฎ ไม่ใช่ความชอบ การเชื่อมต่อเอนจินภาษาญี่ปุ่นทุกตัวที่เผยแพร่ป้อนชิ้นละสามสิบวินาที และเกณฑ์วัดของมันเองก็รันแบบนั้น ชิ้นที่ยาวกว่าทำให้ตัวถอดรหัสอ่านข้ามหรือเงียบไปบนเพลง และทำให้ forced aligner ของมันยุบคำทั้งแถวลงบนเวลาเดียว — ในหนังที่บทพูดห่าง ๆ คือครึ่งหนึ่งของคำทั้งหมด ชิ้นสั้นที่มีเสียงพูดหนาแน่นทำให้ทั้งสองอยู่ในร่องในรอย และถอดรหัสได้เร็วกว่าเป็นของแถม

การรันหนึ่งรอบทำงานอย่างไร

ชี้มันไปที่โฟลเดอร์ แล้วมันจะทำงานเป็นรอบ รอบละสิบไฟล์ ซับไตเติลจึงปรากฏทุกรอบ แทนที่จะรอจนจบคืน สำหรับแต่ละไฟล์:

กฎที่มาจากการวัด ไม่ใช่ความเห็น

แต่ละข้อคือการเปลี่ยนแปลงที่ทำหลังจากเครื่องมือแสดงให้เห็นขนาดของปัญหา และแต่ละข้อตรวจซ้ำได้กับไฟล์ใดก็ได้ด้วยการรันเครื่องมืออีกครั้ง

มันรันบนอะไรที่นี่

มันอยู่ตรงไหนในภาพรวม

เครื่อง GPU ในแร็กทำหน้าที่ฟัง พี่น้องของมัน N5 AI MAX รันผู้ช่วยเสียงของบ้านบนฮาร์ดแวร์ของตัวเอง งานทำซับข้ามคืนจึงไม่เคยแย่งทรัพยากรกับคนที่สั่งเปิดไฟ การทำซับคือการใช้การ์ด 24 GB ที่ดีที่สุดในตอนที่ทุกคนหลับ และกฎเดียวกันใช้กับทุกอย่างที่เรารัน — วัดก่อนเปลี่ยน แก้ที่ชั้นที่รับการแก้ได้ และอย่าปล่อยให้ส่วนที่ไว้ใจไม่ได้ตัดสินแทนส่วนที่ไว้ใจได้ ถ้าคลังของคุณมีปัญหาเดียวกัน โค้ดอยู่บน GitHub ถ้าบ้านของคุณมีปัญหาเดียวกัน เขียนมาหาเรา