Kategori
Business Automation — subkategori Creative AI
Kompetisi
AI HACKFEST 2026 — Batch 4. Diselenggarakan oleh IDwebhost bersama CloudBaik
Tim
Processing — Steven Chandra, Steven, dan Angky Kurniawan
Infrastruktur
Cloud VPS Linux, tanpa akselerator GPU
Kerangka kerja
Hermes Agent (kerangka kerja resmi penyelenggara) · pipeline ffmpeg + LLM, bukan model video generatif
Volume kode
11.274 baris Python · 52 berkas uji otomatis

Agent yang dirancang agar tidak sanggup mengarang

Content Factory menyusun foto dan video mentah milik pengguna menjadi konten vertikal siap tayang melalui percakapan Telegram. Tantangan sesungguhnya bukan terletak pada proses render, melainkan pada penjaminan bahwa agent tidak pernah menambahkan satu pun keterangan yang tidak terdapat pada bahan.

Abstrak

Artikel ini memaparkan perancangan, implementasi, dan evaluasi Content Factory, sebuah AI agent yang mengolah materi audiovisual milik pengguna menjadi konten vertikal siap tayang atas permintaan melalui percakapan Telegram. Persoalan yang diangkat bukanlah ketidakmampuan teknis dalam memproduksi video, melainkan persoalan yang lebih mendasar dan jarang dibahas: kecenderungan sistem generatif untuk memperlakukan kegagalan pengambilan data sebagai ketiadaan data, sehingga kekosongan informasi diisi dengan keterangan yang terdengar masuk akal namun tidak berdasar.

Pendekatan yang kami tempuh adalah pembagian kewenangan yang ditegakkan pada tingkat struktur data, dengan prinsip model bahasa hanya berwenang mengusulkan, sementara kode yang mengukur, memverifikasi, dan menolak. Setiap keluaran yang berstatus fakta — daftar bahan, data tren, penjadwalan elemen grafis, hingga perhitungan biaya — dihasilkan oleh kode dari sumber aslinya, sedangkan model bahasa dibatasi hanya boleh mengembalikan pilihan berupa nomor dari himpunan yang telah disusun kode.

Evaluasi dilakukan melalui 52 berkas uji otomatis serta pengujian ujung ke ujung pada materi pengguna yang sesungguhnya. Optimasi pipeline menurunkan waktu render dari 332,8 detik menjadi 35,6 detik, dan pemindahan transkripsi ke mesin lokal mencapai kecocokan 0,92 terhadap whisper-1 pada real-time factor 0,76 dengan empat inti prosesor, seluruhnya tanpa akselerator GPU. Artikel ini juga mendokumentasikan lima studi kasus kegagalan beserta remediasinya secara terbuka, karena justru kegagalan tersebut yang membentuk arsitektur akhir sistem.

Kata kunci: AI agent · tata kelola halusinasi · fail-closed design · human-in-the-loop · otomasi produksi konten · ffmpeg · Whisper

01

Pendahuluan dan rumusan masalah

Pada 19 September 2026 pukul 20.00 WIB, sistem yang kami bangun mengirimkan sebuah video kepada pengguna. Secara teknis hasilnya memuaskan: rasio 9:16, subtitel bersih, sulih suara yang nyaman didengar, serta musik latar dengan keseimbangan yang wajar. Satu-satunya persoalan adalah bahwa naskah yang dibacakan suara sintetis itu sepenuhnya karangan, dan naskah tersebut ditempelkan di atas rekaman seseorang yang sesungguhnya sedang berbicara.

Penyebabnya tampak sepele, dan justru karena itulah ia berbahaya. Saldo layanan transkripsi habis; peladen menjawab 403 insufficient_quota dengan saldo tersisa $0,0004 sementara satu permintaan membutuhkan $0,0066. Jumlah transkrip yang kembali adalah nol. Kode kemudian membaca “nol transkrip” sebagai “tidak terdapat ucapan pada bahan ini”, menyimpulkan bahwa videonya bisu, lalu dengan patuh menyusun naskah semata-mata dari citra yang terlihat: “Halo semuanya! Aku di sini dengan energi positif…”

Tidak ada satu pun komponen yang keliru secara teknis. Seluruh sistem berjalan persis sebagaimana dituliskan. Kegagalan pengambilan data semata-mata diperlakukan setara dengan ketiadaan data — dan hal itu sudah memadai untuk menempatkan suara palsu di atas wajah seseorang yang nyata.

Kegagalan bukanlah ketiadaan. “Gagal mengambil data” dan “datanya memang kosong” wajib dibedakan secara eksplisit, dan hanya yang kedua yang boleh memicu jalur “tidak ada apa-apa”.

Aturan 7 · CLAUDE.md · dirumuskan setelah insiden di atas

Dari peristiwa tersebut kami merumuskan persoalan yang sesungguhnya hendak dipecahkan. Kemampuan menghasilkan video bukanlah kelangkaan; perangkat penyunting otomatis telah tersedia luas. Yang langka adalah jaminan bahwa sebuah agent otonom tidak akan menyisipkan keterangan yang tidak berasal dari bahan milik pengguna. Persoalan ini memperoleh bobot etis tersendiri karena keluarannya berupa wajah, suara, dan nama seseorang yang dapat dikenali publik. Kekeliruan pada ranah ini tidak berhenti sebagai cacat mutu, melainkan berubah menjadi pemalsuan.

Artikel ini memaparkan satu keputusan arsitektural yang kami pegang secara konsisten sepanjang pengembangan: model bahasa hanya berwenang mengusulkan, sedangkan kode yang mengukur, memverifikasi, dan menolak. Setiap aturan yang kami tegakkan memiliki insiden nyata sebagai dasarnya, dan seluruhnya kami dokumentasikan apa adanya, termasuk yang tidak mengenakkan untuk diakui.

02

Demonstrasi sistem

Alur kerja dirancang bertahap dan bukan sekali tekan. Pengguna mengunggah bahan melalui Telegram; agent mengukur fakta bahan dan mengajukan pertanyaan seperlunya; kemudian sistem mengirimkan dua varian naskah beserta papan cerita. Video baru dirender setelah pengguna menetapkan pilihan A atau B, atau menyerahkan naskah versinya sendiri.

ISI: tautan video demo

Rekaman demonstrasi memperlihatkan pemahaman per klip yang benar-benar bersumber dari isi rekaman dan bukan dari nama berkas, dua gaya penulisan naskah yang berbeda, penempatan elemen grafis yang jatuh tepat pada saat kata jangkarnya diucapkan, proses kerja pada lingkungan Cloud VPS melalui dasbor dan terminal, serta pemeriksa mutu yang memperbaiki kenyaringan sebelum berkas diserahkan.

03

Arsitektur sistem

Pipeline dijalankan oleh agent Hermes pada kanal Telegram, namun kode Python-nya tidak pernah mengirimkan apa pun ke Telegram secara mandiri. Pertimbangannya bersifat keamanan, bukan kepraktisan: Hermes tidak meneruskan identitas percakapan yang tepercaya kepada proses anak. Menebak percakapan tujuan berarti membuka kemungkinan materi milik seseorang sampai kepada orang lain. Karena itu skrip hanya mengembalikan lokasi berkas hasil melalui JSON pada stdout, dan agent Hermes yang mengirimkannya pada sesi percakapan yang sama.

ALUR GERBANG PENOLAKAN Telegram → Hermes gateway pengguna mengunggah foto / video path di luar cache Hermes setelah realpath inspect_media.py ukur durasi, suara, ucapan · tanpa LLM transkripsi GAGAL → berhenti, laporkan hermes_render.py --draft agent MENONTON 4 momen / klip → 2 varian naskah + papan cerita PENGGUNA MEMILIH A · B · atau naskah sendiri draf milik percakapan lain, kedaluwarsa, atau sudah dipakai --draft-id X --varian A render saja · brief TIDAK disusun ulang di dalam satu flock eksklusif render lain sedang berjalan → render_sibuk qa_video.py kenyaringan, frame beku, teks terpotong JSON {video_path} → stdout agent Hermes yang mengirim ke percakapan SATU LOCK
Gambar 1. Alur kerja dan gerbang penolakan. Kotak bergaris putus-putus di bagian bawah menandai batas kewenangan pipeline: ia berhenti pada stdout dan tidak pernah menyentuh Telegram. Empat garis merah menunjukkan titik ketika sistem memilih menolak alih-alih menebak, sedangkan kotak hijau di tengah adalah satu-satunya titik pengambilan keputusan oleh manusia.

Ketiga tahap dijalankan orchestrator.py sebagai subproses dengan grup proses tersendiri dan batas waktu keras melalui killpg, seluruhnya berada di dalam satu flock eksklusif karena berkas kerja dipakai bersama.

Tabel 1. Tiga tahap pipeline. Tahap ContentInsight sengaja ditetapkan non-kritis: apabila sumber tren tidak tersedia atau lambat, pipeline tetap melanjutkan tanpa data tren alih-alih berhenti.
TahapBerkasTugas
ContentInsightagent5_insight.pyPenurunan kata kunci dari isi bahan, dilanjutkan pengambilan tren nyata dari YouTube dan Google Trends. Non-kritis.
TrendAnalysts + BrainIdeaagent1_2_brief.pyTranskripsi, penyusunan lembar kontak empat momen per klip, dan satu panggilan LLM yang menghasilkan brief serta rencana grafis.
ContentMakersauto_render.pySulih suara, segmentasi ffmpeg, subtitel karaoke, hamparan Remotion, musik dengan ducking, dan sampul JPG. 2.341 baris.
04

Tata kelola anti-halusinasi

Prinsip “LLM mengusulkan, kode mengukur” bukanlah semboyan, melainkan pembagian kewenangan yang ditegakkan pada tingkat struktur data. Pada setiap titik yang berpotensi menghasilkan sebuah fakta, model bahasa hanya diperkenankan mengembalikan pilihan dari himpunan yang disusun kode — pada umumnya berupa sebuah nomor — dan kode yang kemudian menyusun isi sebenarnya dari sumber aslinya.

KODE fetch tren nyata YouTube + Google Trends → kolam bernomor 1..N daftar MODEL BAHASA tidak tepercaya keluaran sah: 3 nomor KODE salin item #3 apa adanya dari data asli → trend_report DILARANG model menulis isi laporan sendiri Model tidak tersedia / tidak yakin → boleh mengembalikan null. Nomor di luar 1..N ditolak kode.
Gambar 2. Mekanisme pembatasan keluaran, dicontohkan pada pemilihan tren. Model bahasa tidak pernah memegang pena atas isi laporan; ia hanya menunjuk. Pola yang sama diterapkan pada pemilihan potongan ucapan dan penjadwalan elemen grafis.
Tabel 2. Pembagian kewenangan. Kolom kiri merupakan keluaran maksimum yang diterima dari model; kolom kanan dihasilkan sepenuhnya oleh kode.
Model bahasa boleh mengusulkanKode yang menentukan
Nomor tren dari kolam yang benar-benar diambil, atau nullSeluruh isi trend_report, disalin dari item aslinya
—Daftar bahan; nama berkas yang dikarang memicu kegagalan eksplisit
Nomor kandidat potongan ucapanPenyusunan kandidat, verifikasi, dan penegakan batas durasi
Usulan elemen grafis beserta kata jangkarnyaKatalog yang sah, penolakan angka yang tidak terdapat pada permintaan pengguna, dan penjadwalan berdasarkan saat kata tersebut benar-benar diucapkan
—Biaya: token nyata dari API dikalikan tarif pada config/pricing.json
—Angka performa: NO_DATA apabila tidak tersedia data asli

Baris terakhir tabel tersebut memiliki riwayat tersendiri. Fungsi estimate_metrics() sebelumnya menggunakan random.randint dan melaporkan status HIGH_PERFORMING padahal belum satu pun unggahan diterbitkan. Saat ini fetch_real_analytics() mengembalikan None dan laporan menuliskan NO_DATA. Kami memilih kolom kosong yang jujur ketimbang angka yang menyenangkan untuk dibaca.

Prinsip yang sama berlaku pada perhitungan biaya. Berkas pricing.json memuat catatan eksplisit bahwa model yang tidak terdaftar di dalamnya tidak akan ditebak; biayanya dilaporkan null dan bukan nol. Nol merupakan sebuah klaim, sedangkan null adalah pengakuan ketidaktahuan.

Rancangan gagal-tertutup

Sistem ini digunakan oleh lebih dari satu orang, dan satu tebakan yang keliru berarti materi milik seseorang sampai kepada orang lain. Oleh sebab itu setiap ketidakpastian berakhir pada penolakan:

  • Percakapan tujuan tidak diketahui; tidak tersedia percakapan cadangan.
  • Lokasi lampiran berada di luar folder masuk setelah realpath. Sistem tidak pernah memindai folder dan tidak pernah menggunakan “berkas terbaru” sebagai cadangan.
  • Bahan tidak disebutkan secara eksplisit; direktori workspace/raw/ memuat materi milik proses dan pengguna lain, sehingga penggunaan seluruh isinya bukan pilihan yang sah.
  • Draf milik percakapan lain, berusia lebih dari 24 jam, bahannya berbeda, atau telah pernah dirender. Klaim sekali pakai ditegakkan melalui O_EXCL dan dilepaskan kembali apabila render gagal.
  • Nilai pengaturan yang salah ketik; ditolak pada titik masuk, sebelum kunci render diambil dan sebelum satu pun panggilan LLM berbayar dilakukan.
05

Studi kasus kegagalan dan remediasinya

Setiap aturan yang dipaparkan di atas lahir dari kegagalan yang dapat ditunjuk tanggalnya. Kami mendokumentasikannya secara lengkap karena aturan tanpa sebab yang jelas akan dilanggar kembali oleh orang berikutnya, termasuk oleh kami sendiri sepekan kemudian.

19 Sep · 20.00 WIB

Suara sintetis ditempelkan di atas rekaman orang yang sedang berbicara

Gejala
Video draf dikirimkan dengan sulih suara berisi naskah yang tidak memiliki keterkaitan dengan rekaman.
Akar
Saldo Whisper habis (403 insufficient_quota) → nol transkrip → resolve_audio_mode menyimpulkan “tidak terdapat ucapan pada bahan”. Docstring kode itu sendiri menempatkan “video bisu, musik saja, atau transkripsi gagal” dalam satu kelompok.
Remediasi
Pemeriksaan yang berpotensi gagal kini mengembalikan alasan kegagalan per bahan, bukan sekadar hasil kosong. Hanya tanpa_ucapan dan tanpa_audio yang diperkenankan memicu jalur kosong; selebihnya pipeline berhenti dengan pesan yang dapat dibaca pengguna, sebelum terjadi panggilan LLM berbayar.
19 Sep · 20.27 WIB

Whisper menghasilkan “Thank you for watching!” pada rekaman keramaian

Gejala
Klip keramaian tanpa ucapan menghasilkan transkrip "You", "Thank you for watching!", dan ".". Tanda titik tersebut lolos sebagai transkrip yang sah, sementara prompt menyebutnya sebagai “sumber kebenaran utama”.
Akar
Aturan bawaan Whisper (no_speech > 0,6 dan logprob < −1,0) tidak menangkapnya: no_speech_prob berada pada 0,81–0,89, tetapi logprob hanya −0,88 dan −0,95.
Remediasi
Fungsi saring_ucapan() membuang segmen tanpa huruf atau dengan no_speech_prob > 0,6. Bahan yang bersuara juga tetap mempertahankan suara aslinya; hanya bahan yang benar-benar hening yang boleh beralih ke suara sintetis.
25 Sep

Model teks-saja mendeskripsikan video yang tidak pernah dilihatnya

Gejala
Naskah menyebutkan “petugas medis memeriksa calon pendonor” untuk rekaman pusat jajanan.
Akar
Model gratis yang biasa digunakan dicabut penyedianya, dan rantai cadangan menempatkan model teks-saja pada putaran pertama sehingga ia menerima pesan bergambar tanpa kemampuan melihat gambarnya.
Remediasi
Model teks-saja ditempatkan pada urutan terakhir rantai dan diberi tahu secara eksplisit bahwa ia tidak melihat video. Brief menandai kondisi tanpa_gambar, dan pesan draf menyatakannya secara terbuka kepada pengguna.
25 Sep

Naskah menjanjikan “cuma 15 menit” yang tidak pernah disebut siapa pun

Gejala
Angka spesifik muncul pada naskah tanpa sumber; tidak terdapat pada permintaan pengguna maupun pada ucapan asli.
Akar
Pemeriksa naskah hanya menilai aspek kebahasaan berupa frasa deskriptif, kalimat panjang, dan huruf non-Latin, tanpa memeriksa klaim faktual.
Remediasi
naskah.periksa(sumber=...) menandai angka yang tidak terdapat pada sumber sebagai masalah dan naskah ditulis ulang. Pemeriksaan huruf non-Latin turut diperluas ke judul dan takarir, setelah aksara Mandarin 报错 sempat lolos ke takarir varian B.
26 Sep

Klip stok “error message” ternyata berupa layar merah polos

Gejala
B-roll yang disisipkan tampil sebagai bidang merah tanpa detail apa pun; sah secara metadata, namun kosong secara visual.
Akar
Pemilihan klip stok semata-mata mengandalkan kecocokan kata kunci, tanpa pemeriksaan apakah citranya benar-benar memuat sesuatu.
Remediasi
Klip dengan detail luma di bawah 12 ditolak. Klip merah tersebut terukur 8,2, sementara kandidat lain pada antrean terukur 42,9 dan digunakan. Judul klip juga diwajibkan berbagi kata bermakna dengan kata kunci yang diusulkan model.

Satu insiden operasional dan aturan yang mengikutinya

Sebuah proses render milik pengguna pernah hilang tanpa jejak. Gateway berjalan sebagai layanan systemd dengan konfigurasi KillMode=mixed, sehingga tindakan restart mengirimkan SIGKILL ke seluruh cgroup, termasuk proses render yang dijalankan secara detached. Render tersebut berhenti pada _combined_text.mp4, satu langkah sebelum mux_audio selesai. Tidak tercatat peristiwa run_finished karena blok finally tidak sempat dieksekusi, dan pengguna tidak menerima pemberitahuan apa pun. Sejak saat itu scripts/check_locks.py wajib dijalankan dan menyatakan status bebas sebelum gateway boleh dimulai ulang.

06

Cakupan fungsional

Content Factory menyunting bahan milik pengguna; ia tidak membangkitkan video sintetis dari nol. Pembedaan ini menentukan keseluruhan rancangannya.

Empat resep, ditetapkan dari permintaan pengguna

  1. Suara asli, subtitel, dan B-roll sisipan. Klip stok tampil sesaat di atas video pada saat kata yang relevan diucapkan, sehingga suara asli dan subtitel tidak bergeser sedikit pun.
  2. Sulih suara sintetis, teks, elemen grafis, dan musik. Klip stok disisipkan di sela bahan pengguna, bukan ditumpuk di atasnya.
  3. Pemecahan video bicara panjang menjadi dua hingga tiga konten pendek yang masing-masing berdiri sendiri.
  4. Klip tanpa percakapan disertai lagu: montase dengan pergantian citra yang jatuh tepat pada ketukan.

Ketentuan yang lahir dari pengujian

  • Pengubahan kecepatan hanya aktif pada mode sulih suara sintetis. Pada mode suara asli ia tidak disentuh sama sekali, agar subtitel yang dipatok pada transkrip asli tidak terlepas dari gerak bibir penutur pada video.
  • Efek zoom Ken Burns hanya diterapkan pada bahan foto; video tidak disentuh.
  • Subtitel dibatasi maksimum 74% lebar layar, karena kolom tombol pada sisi kanan antarmuka TikTok menutupi sisanya.
  • Elemen grafis penjelas ditempatkan di bawah wajah penutur pada mode suara asli, dan dijadwalkan pada detik ketika kata jangkarnya diucapkan, bukan pada posisi tetap.
  • Musik diukur, bukan diberi penguatan tetap. Levelnya dihitung dari kenyaringan video; musik tunggal dibawa ke −16 LUFS.
  • Penempelan elemen grafis menumpang pada proses enkode teks, sehingga tidak menimbulkan enkode tambahan.

Yang sengaja tidak dijanjikan

Deskripsi tool kepada agent menyebutkan batas-batas ini secara eksplisit, agar bot tidak pernah menjanjikan kemampuan yang tidak dimilikinya:

  • Koreksi warna profesional atau LUT, stabilisasi, stiker, dan sulih bahasa.
  • Unggah otomatis ke Instagram, TikTok, maupun YouTube. publish_to_platforms() merupakan stub yang mengembalikan None.
  • Analitik performa asli. fetch_real_analytics() mengembalikan None → NO_DATA.

Pernah terdapat versi deskripsi tool yang tidak menyebutkan batas-batas tersebut, dan akibatnya bot menjanjikan koreksi warna kepada pengguna. Menuliskan ketiadaan ternyata sama pentingnya dengan menuliskan kemampuan.

07

Implementasi pada Cloud VPS tanpa GPU

Keseluruhan sistem berjalan pada satu peladen Linux tanpa kartu grafis, memanfaatkan layanan Cloud VPS dari CloudBaik yang didukung ekosistem AI Hosting IDwebhost sebagaimana disediakan penyelenggara. Pilihan ini bukan kebetulan: dua keputusan teknis yang memungkinkannya sama-sama bersumber dari pengukuran, bukan dari perkiraan.

Optimasi render: 332,8 detik menjadi 35,6 detik

Implementasi awal menggunakan moviepy yang memproses bingkai satu per satu di Python; untuk dua klip video pendek dibutuhkan 332,8 detik. Alih-alih menebak penyebabnya, kami melakukan pemrofilan pada setiap lapisan secara terpisah.

Tabel 3. Pemrofilan per lapisan pada kasus uji yang sama. Setelah seluruh operasi dialihkan ke subproses ffmpeg native, total waktu turun dari 332,8 detik menjadi 35,6 detik, yakni sekitar 9× lebih cepat.
Operasimoviepy (Python)ffmpeg native (C)
Resize dan crop ke 1080×1920 (satu klip)32,1 s3,6 s
Penggabungan dua klip99,1 s8,7 s
Hamparan teks+45 s+5,9 s
9×percepatan render
0,92kecocokan Whisper lokal dengan whisper-1
0,76real-time factor pada 4 inti
$0biaya ContentInsight per proses

Pemindahan transkripsi ke mesin sendiri

Setelah insiden kehabisan saldo, Whisper lokal melalui faster-whisper dengan model small ditetapkan sebagai bawaan. Pengukuran pada enam klip nyata menghasilkan kecocokan 0,92 terhadap whisper-1 dengan real-time factor 0,76 pada empat inti prosesor, yang berarti proses transkripsi berlangsung lebih cepat daripada durasi audionya sendiri. Terdapat manfaat tambahan yang tidak diperkirakan sebelumnya: penanda waktu kata pertama menjadi lebih jujur pada rentang 0,18–0,72 detik, dibandingkan layanan API yang selalu melaporkan 0,00 padahal suara baru dimulai sekitar detik 0,66. Sebuah penyaring sempat membuang kata pertama pada hampir setiap klip akibat penanda waktu yang keliru tersebut.

Pengendalian biaya

Tahap ContentInsight sebelumnya menggunakan model berbayar dengan konsumsi sekitar 25 ribu token per proses. Setelah dialihkan ke model gratis, pengujian nyata menunjukkan kata kunci tetap relevan, selesai dalam 5 detik, dengan biaya $0. Komponen yang masih berbayar hanya pemilihan potongan ucapan, dan itu pun terbatas pada mode suara asli. Setiap panggilan LLM, sulih suara, dan transkripsi dicatat pada run_log.jsonl beserta biayanya, dihitung dari token nyata dan bukan dari estimasi.

08

Evaluasi dan hasil pengujian

Pengujian dilakukan dalam dua lapis dengan pembagian tugas yang jelas. Lapis pertama menjaga agar perbaikan yang telah dicapai tidak mengalami kemunduran; lapis kedua membuktikan bahwa sistem bekerja pada bahan yang sesungguhnya.

Pengujian otomatis yang terisolasi penuh

Berkas tests/conftest.py memblokir urlopen dan requests untuk keseluruhan suite serta mengosongkan variabel lingkungan Telegram. Seluruh lokasi berkas status diarahkan ke tmp_path. Ketentuan ini pun lahir dari kekeliruan: sebuah pengujian pernah memanggil agent5.run() tanpa mengalihkan TREND_POOL_PATH, sehingga setiap kali suite dijalankan ia menimpa workspace/state/ yang asli sekaligus benar-benar mengirimkan permintaan ke Google Trends.

Pengujian ujung ke ujung pada bahan nyata

Tabel 4. Hasil pengujian ujung ke ujung pada materi milik pengguna. Seluruh angka diambil dari catatan proses, bukan dari perkiraan.
Aspek yang diujiHasil terukur
Penyusunan draf (enam klip)122 detik. Pemahaman per klip akurat; papan cerita A/B terkirim.
Render varian A188 detik, menghasilkan dua sisipan Pexels, empat elemen grafis, dan musik latar.
Pemeriksa mutu kenyaringan−24,2 → −17,1 LUFS, −1,9 dBTP. Lolos.
Ketepatan penjadwalan grafisChip “DONOR DARAH” tidak muncul pada detik 4,2, dan baru tampil setelah kata “donor” diucapkan.
Naskah ubahan penggunaDibacakan persis apa adanya; diverifikasi ulang melalui Whisper.
Pemecahan menjadi konten pendekDua konten dari enam video, berdurasi 32 dan 18 detik, masing-masing dengan sisipan dan elemen grafis. Pemeriksaan mutu lolos.
Pengulangan potongan klipDeteksi bingkai kembar berjarak ≥ 2 detik: renderer lama 24 pasangan, renderer baru nol.

Sebagian temuan pada tabel tersebut pada mulanya merupakan kegagalan. Peringatan bahwa baris subtitel memasuki area tombol muncul karena memang demikian keadaannya; pembatasan 74% lebar adalah jawabannya. Pola ini berulang sepanjang proyek: pemeriksa mutu terbukti berguna justru ketika ia menolak hasil kami sendiri.

Hasil kosong bukanlah bukti. Sebelum menyimpulkan apa pun dari hasil kosong, buktikan terlebih dahulu bahwa alat ukurnya sanggup mendeteksi kasus positif.

Aturan 1 · CLAUDE.md

Aturan tersebut dirumuskan setelah perintah journalctl --user menghasilkan keluaran kosong dan kami menyimpulkan bahwa tidak terdapat galat pada log. Kenyataannya, sistem menjawab No journal files were found: perintah itu memang tidak memiliki hak akses, sehingga ia tidak akan pernah menampilkan galat apa pun. Sejak saat itu check_locks.py diuji dengan lebih dahulu memegang kunci yang sesungguhnya, lalu diperiksa kembali statusnya setelah kunci dilepaskan.

09

Dampak yang diharapkan

Pelaku usaha mikro, kreator perorangan, dan pengelola media sosial organisasi menghadapi kendala yang serupa: mereka memiliki bahan rekaman, tetapi tidak memiliki waktu maupun keterampilan penyuntingan untuk mengubahnya menjadi konten yang layak tayang. Jalan pintas yang tersedia saat ini umumnya berupa pembangkitan video sintetis sepenuhnya, yang justru menghilangkan satu-satunya aset yang mereka miliki, yakni keaslian.

Content Factory menempuh arah sebaliknya. Ia mempertahankan wajah, suara, dan tempat yang nyata, lalu mengerjakan bagian yang memakan waktu: pemotongan jeda, penyusunan subtitel, penyeimbangan kenyaringan, dan penempatan elemen penjelas. Pengguna tidak perlu menguasai perangkat penyuntingan; ia cukup mengunggah bahan pada percakapan Telegram dan memilih satu di antara dua naskah.

Kami sengaja tidak mencantumkan angka penghematan waktu, karena kami belum melakukan pengukuran pembanding terhadap penyuntingan manual pada populasi pengguna yang memadai. Menuliskan angka semacam itu tanpa dasar akan melanggar prinsip yang justru diusung artikel ini. Yang dapat kami nyatakan berdasarkan catatan proses adalah bahwa penyusunan draf berlangsung sekitar 122 detik dan render sekitar 188 detik untuk enam klip, seluruhnya berjalan pada VPS tanpa GPU.

Dampak yang kami anggap paling bernilai justru bersifat metodologis. Pola “model mengusulkan, kode mengukur” beserta pembedaan tegas antara kegagalan dan ketiadaan tidak terikat pada ranah video. Pola yang sama berlaku pada agent yang menyusun laporan keuangan, meringkas rekam medis, atau memproses dokumen hukum — yaitu setiap keadaan ketika sebuah sistem otonom menghasilkan keluaran yang akan dipercaya orang lain sebagai fakta. Karena itu pola tersebut kami uraikan di artikel ini selengkap mungkin — beserta insiden yang melatarinya dan angka yang mendasarinya — agar dapat diuji dan ditiru tanpa perlu membaca kode kami.

Pada tataran etika, sistem ini menegaskan satu pendirian: perangkat yang menempelkan kata-kata pada wajah seseorang tidak boleh berjalan tanpa persetujuan manusia. Tidak terdapat penerbitan otomatis, dan tahap pemilihan naskah tidak dapat dilewati.

10

Susunan tim

  • Steven Chandra Lead AI Engineer & Arsitek Sistem

    Perancangan arsitektur pipeline tiga tahap dan tata kelola anti-halusinasi, meliputi pembatasan keluaran model bahasa serta gerbang gagal-tertutup. Menangani mesin render ffmpeg native beserta optimasinya, orkestrasi subproses dengan penguncian eksklusif, penjadwalan elemen grafis terhadap kata terucap, dan integrasi dengan kerangka kerja Hermes.

  • Steven Infrastruktur & Operasional

    Penyediaan dan administrasi Cloud VPS, penerapan layanan systemd untuk gateway, pemasangan Whisper lokal sebagai pengganti layanan berbayar, pemantauan proses latar belakang, penanganan insiden operasional, serta pengendalian biaya melalui pencatatan run log.

  • Angky Kurniawan Pengujian & Jaminan Mutu

    Penyusunan 52 berkas uji otomatis dengan isolasi jaringan dan status, pengujian ujung ke ujung pada bahan pengguna yang sesungguhnya, pengembangan pemeriksa mutu keluaran untuk kenyaringan, bingkai beku, dan teks terpotong, serta dokumentasi studi kasus kegagalan.

11

Keterbatasan dan simpulan

Bagian tersulit dalam membangun agent yang menyentuh materi milik orang lain bukanlah membuatnya cerdas. Justru itulah bagian yang relatif mudah, sebab model bahasa saat ini telah sangat mampu. Yang sulit adalah membuatnya berhenti: berhenti menebak ketika data tidak lengkap, berhenti mengisi kekosongan dengan sesuatu yang terdengar masuk akal, dan berhenti memperlakukan kegagalannya sendiri sebagai informasi.

Setiap kali sistem ini menghasilkan keluaran yang keliru, polanya selalu sama: terdapat satu titik ketika kegagalan secara diam-diam berubah bentuk menjadi kesimpulan. Transkripsi yang gagal menjadi “tidak ada yang berbicara”. Klip merah yang kosong menjadi “ilustrasi galat”. Model yang tidak melihat gambar tetap menjawab seolah-olah melihat. Tidak satu pun di antaranya merupakan kesalahan model; seluruhnya merupakan kesalahan kode yang tidak menyediakan sarana untuk menyatakan “saya tidak tahu”.

Keterbatasan yang diakui

  • Penerbitan otomatis ke Instagram, TikTok, dan YouTube belum tersedia.
  • Analitik performa asli dari platform belum tersedia; laporan menuliskan NO_DATA dan bukan angka perkiraan.
  • Dukungan terbatas pada Linux, karena pipeline memanfaatkan flock dan killpg.
  • Pengukuran penghematan waktu terhadap penyuntingan manual belum dilakukan secara sistematis.

Arah pengembangan berikutnya bukanlah penambahan efek, melainkan perluasan prinsip yang sama ke bagian yang belum tercakup: sumber tren yang lebih beragam dengan verifikasi yang setara ketatnya, serta analitik nyata begitu kredensial platform tersedia — dengan ketentuan yang tidak berubah, bahwa kolom tanpa data tetap dituliskan sebagai NO_DATA.

Pada akhirnya, bentuk akhir sistem ini banyak berisi penolakan, dan menyisakan satu titik keputusan manusia yang tidak dapat dilewati. Pengguna membaca dua naskah, menetapkan pilihan, atau menuliskan naskahnya sendiri; barulah video dibuat. Untuk pekerjaan yang menempelkan kata-kata pada wajah seseorang, kami tidak menemukan alasan yang cukup kuat untuk melewatkan langkah tersebut.