Tutorial Membuat YouTube Shorts Otomatis dengan AI

Tutorial Membuat YouTube Shorts Otomatis dengan AI

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

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
🏷️ Topik Terkait: