Pendahuluan
YouTube Shorts membutuhkan video vertikal < 60 detik dengan thumbnail menarik. Membuatnya secara manual memakan waktu, terutama bila konten harus diproduksi dalam volume tinggi. Tutorial ini menyajikan arsitektur endâtoâend yang menggabungkan:
- Model bahasa (ChatGPT Plus, Claude Pro, atau Gemini Advanced) untuk menulis skrip 15â30 detik.
- Generator gambar (Midjourney, Canva Pro, atau Adobe Firefly) untuk thumbnail.
- TextâtoâSpeech (gTTS atau layanan cloud) untuk audio.
- ffmpeg untuk merender video.
- YouTube Data API untuk upload otomatis.
Diagram singkat:
[AI Prompt] â Script (ChatGPT) â TTS â Audio
[AI Prompt] â Thumbnail (Midjourney/Canva) â PNG
Audio + Thumbnail + Template â ffmpeg â MP4
MP4 â YouTube Data API â Shorts
Prasyarat & Persiapan
| Item | Keterangan |
|---|---|
| Akun OpenAI (ChatGPT Plus) | https://tools.jartekindo.com/tool/chatgpt-plus/ |
| Akun Anthropic (Claude Pro) | https://tools.jartekindo.com/tool/claude-pro/ |
| Akun Google (Gemini Advanced) | https://tools.jartekindo.com/tool/gemini-advanced/ |
| Akun Midjourney atau Canva Pro | https://tools.jartekindo.com/tool/midjourney/ , https://tools.jartekindo.com/tool/canva-pro/ |
| Python 3.9+ & pip | Sistem operasi Linux/macOS/WSL rekomended |
| ffmpeg (CLI) | sudo apt-get install ffmpeg |
| Google Cloud Project dengan YouTube Data API diâenabled | Buat OAuth 2.0 client ID |
| Token OAuth (refresh token) | Simpan di file .env |
Instalasi dependensi Python
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install openai anthropic google-generativeai google-auth-oauthlib google-api-python-client ffmpeg-python gtts python-dotenv
Langkah Demi Langkah
Step 1 â Konfigurasi Lingkungan
Buat file .env di root proyek:
OPENAI_API_KEY=your_chatgpt_plus_key
ANTHROPIC_API_KEY=your_claude_pro_key
GEMINI_API_KEY=your_gemini_key
YOUTUBE_CLIENT_SECRETS=client_secret.json
YOUTUBE_REFRESH_TOKEN=your_refresh_token
Pastikan client_secret.json didownload dari Google Cloud Console.
Step 2 â Generate Skrip Shorts dengan AI
Berikut contoh fungsi Python yang dapat dipilih antara tiga model AI:
import os, json, random
from dotenv import load_dotenv
load_dotenv()
def generate_script(topic: str) -> str:
# Pilih provider secara acak untuk demo
provider = random.choice(["openai", "anthropic", "gemini"])
if provider == "openai":
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.ChatCompletion.create(
model="gpt-4o-mini",
messages=[{"role": "system", "content": "You are a concise video script writer for YouTube Shorts (max 45 seconds)."},
{"role": "user", "content": f"Buat skrip video Shorts tentang: {topic}. Sertakan hook, poin utama, dan callâtoâaction singkat."}],
temperature=0.7,
)
return response.choices[0].message.content.strip()
elif provider == "anthropic":
from anthropic import Anthropic
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
response = client.messages.create(
model="claude-3-5-sonnet-20240620",
max_tokens=300,
temperature=0.7,
system="You write concise scripts for vertical Shorts (max 45 seconds).",
messages=[{"role": "user", "content": f"Tuliskan skrip Shorts tentang {topic}."}],
)
return response.content[0].text.strip()
else: # gemini
import google.generativeai as genai
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
model = genai.GenerativeModel('gemini-1.5-flash')
response = model.generate_content(
f"Write a 45âsecond YouTube Shorts script about {topic}. Include a hook, main points, and a CTA.")
return response.text.strip()
Panggil fungsi:
script = generate_script("Cara mengoptimalkan SEO di 2024")
print(script)
Step 3 â TextâtoâSpeech (Audio)
Menggunakan gTTS (gratis) atau layanan berbayar untuk kualitas lebih tinggi. Contoh dengan gTTS:
from gtts import gTTS
import pathlib
def tts_to_mp3(text: str, out_path: str = "audio.mp3"):
tts = gTTS(text=text, lang="id", slow=False)
tts.save(out_path)
return out_path
audio_file = tts_to_mp3(script)
Step 4 â Generate Thumbnail dengan AIâImage
Berikut contoh panggilan ke Midjourney melalui Discord webhook (alternatif: Canva Pro API).
import requests, json, base64
def generate_thumbnail(prompt: str) -> str:
webhook_url = "https://discord.com/api/webhooks/your_midjourney_webhook"
payload = {"content": f"/imagine {prompt} --ar 9:16"}
r = requests.post(webhook_url, json=payload)
# Asumsi bot mengirimkan URL gambar kembali ke channel yang sama
# Implementasi polling atau webhook listener diperlukan; disederhanakan di sini
# Simulasi: gambar disimpan sebagai thumbnail.png
return "thumbnail.png"
thumb_prompt = f"A vibrant, highâcontrast thumbnail for a YouTube Shorts about {topic}, vertical 9:16, bold text"
thumbnail_path = generate_thumbnail(thumb_prompt)
Jika menggunakan Canva Pro API, ganti fungsi di atas dengan request ke endpoint /v1/designs.
Step 5 â Render Video dengan ffmpeg
Kita gabungkan audio, thumbnail, dan overlay teks (opsional).
import ffmpeg
def render_video(audio_path: str, thumbnail_path: str, out_path: str = "shorts.mp4"):
# Buat video berdurasi audio dengan gambar statis
video = ffmpeg.input(thumbnail_path, loop=1, t=ffmpeg.probe(audio_path)['format']['duration'])
audio = ffmpeg.input(audio_path)
(
ffmpeg
.output(video, audio, out_path, vcodec='libx264', acodec='aac', pix_fmt='yuv420p', shortest=None)
.overwrite_output()
.run()
)
return out_path
video_file = render_video(audio_file, thumbnail_path)
Step 6 â Upload ke YouTube Shorts via API
Pastikan OAuth token memiliki scope https://www.googleapis.com/auth/youtube.upload.
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
from dotenv import load_dotenv
load_dotenv()
def youtube_upload(video_path: str, title: str, description: str, tags: list):
# Build credentials from refresh token
from google.oauth2.credentials import Credentials
creds = Credentials(
None,
refresh_token=os.getenv("YOUTUBE_REFRESH_TOKEN"),
token_uri="https://oauth2.googleapis.com/token",
client_id=json.load(open('client_secret.json'))['installed']['client_id'],
client_secret=json.load(open('client_secret.json'))['installed']['client_secret'],
scopes=["https://www.googleapis.com/auth/youtube.upload"]
)
youtube = googleapiclient.discovery.build('youtube', 'v3', credentials=creds)
request_body = {
"snippet": {
"title": title,
"description": description,
"tags": tags,
"categoryId": "22" # People & Blogs
},
"status": {
"privacyStatus": "public",
"selfDeclaredMadeForKids": False,
"embeddable": True,
"license": "youtube",
"publishAt": None,
"publicStatsViewable": True,
"madeForKids": False,
"shorts": True # YouTube treats vertical <60s as Shorts automatically
}
}
media = googleapiclient.http.MediaFileUpload(video_path, chunksize=-1, resumable=True, mimetype='video/mp4')
request = youtube.videos().insert(part=",".join(request_body.keys()), body=request_body, media_body=media)
response = request.execute()
return response
response = youtube_upload(
video_file,
title="Cara Optimalkan SEO di 2024 â 45 Detik Tips",
description="Tutorial singkat tentang teknik SEO terbaru, diproduksi otomatis dengan AI.",
tags=["SEO", "2024", "YouTube Shorts", "AI"]
)
print("Uploaded video ID:", response["id"])
Tips Optimasi & Keamanan
- Rate limiting: Batasi panggilan ke OpenAI/Claude/Gemini ⤠60â¯req/min untuk menghindari throttling.
- Cache skrip: Simpan hasil
generate_scriptdi Redis/MongoDB; reuse bila topik serupa. - Credential management: Simpan semua secret di secret manager (AWS Secrets Manager, GCP Secret Manager) bukan di
.envpada produksi. - Video bitrate: Gunakan
-b:v 2Mpada ffmpeg untuk kualitas optimal pada 1080Ã1920. - Thumbnail size: Pastikan PNG ⤠2â¯MB, resolusi 1080Ã1920, warna kontras tinggi.
- Compliance: Pastikan konten tidak melanggar kebijakan YouTube (misâinfo, hak cipta).
Troubleshooting Error Umum
| Error | Penyebab | Solusi |
|---|---|---|
Invalid API key (OpenAI) |
Key tidak aktif atau quota habis | Periksa dashboard OpenAI, aktifkan ChatGPT Plus atau upgrade plan. |
RateLimitError (Claude) |
Terlalu banyak request dalam satu menit | Implementasikan exponential backoff (e.g., time.sleep(2**retry)). |
| `ff |