iToverDose/Yazılım· 13 MAYIS 2026 · 04:01

48 Saatte AI Konuşan Avatar ile Kendini Değiştirmek: Deneyimim

Bir pazarlama kampanyası için 50 yerelleştirilmiş video içeriğine ihtiyaç duyan bir geliştirici, kod yazarak ve yerel GPU’larla denedi. Süreç, bellek sızıntılarından ses-senkron bozukluklarına kadar sayısız engel çıkardı. Sonunda, zaman baskısına yenik düşerek harici bir API’ya yöneldi.

DEV Community3 dk okuma0 Yorumlar

Geçen perşembe, pazarlama ekibinden aldığım talimatla neredeyse imkansız bir hedefle karşı karşıya kaldım: Pazartesi sabahı başlayacak bir reklam kampanyası için tam 50 adet yerelleştirilmiş video içeriği hazırlamak. Ben bir arka uç geliştiricisiydim; ışık halkam yoktu, kameraya çıkmak istemiyordum ve zaman kısıtı, aktör kiralamayı ya da stüdyo kiralamayı tamamen devre dışı bırakıyordu. Tek mantıklı çözüm, bir AI Konuşan Avatar aracılığıyla otomatik bir içerik üretim hattı kurmaktı. Basit bir Python betiği, metinden konuşmaya (TTS) hizmetleri ve açık kaynaklı bir görsel model, pazarlama ekibinin baskısından kurtulmak için yeterli olacaktı.

Ancak bu varsayımımda ciddi bir hata vardı. Video işleme, basit bir döngüden ibaret değildi ve bu kısıtlar beni bellek sızıntıları, kod çözme hataları ve hatta kendi onurumla yüzleşmek zorunda bırakacak bir labirente sürükledi.

Yerel Olarak Başlayan İlk Planda Karşılaşılan Engeller

İlk mimarim tamamen yerel bir yapıdaydı. Yeni bir Ubuntu sunucusuna bağlı A100 GPU’suyla çalışmaya başladım. Teknoloji yığını basitti: Python orkestrasyon için, ElevenLabs API yerelleştirilmiş metinler için ses dosyaları üretmek amacıyla, ve Wav2Lip adlı açık kaynaklı bir depo ise sesi statik bir avatar videosuna eşlemek için kullanılıyordu.

Ses üretimi nispeten kolaydı. requests kütüphanesiyle küçük bir Python kılıfı yazarak CSV dosyasındaki yerelleştirilmiş metinleri ElevenLabs API’ına gönderip MP3 dosyalarını yerel dizine kaydettirdim.

import requests

def yerel_ses_üret(metin, yerel_kod, dosya_adı):
    url = f"
    headers = {
        "Accept": "audio/mpeg",
        "Content-Type": "application/json",
        "xi-api-key": "ÇEVRE_DEĞİŞKENİ"
    }
    veri = {
        "text": metin,
        "model_id": "eleven_multilingual_v2",
        "voice_settings": {
            "stability": 0.5,
            "similarity_boost": 0.75
        }
    }
    yanıt = requests.post(url, json=veri, headers=headers)
    with open(f"./ses_çıkış/{dosya_adı}.mp3", 'wb') as f:
        f.write(yanıt.content)

Ses dosyaları indirildikten sonra, bir bash betiğiyle dizindeki tüm MP3 dosyalarını kaynak videoya aktardım ve Wav2Lip’in çıkarım betiğini çalıştırarak nihai MP4 dosyalarını oluşturmasını sağladım. tmux oturumunu açtıktan sonra toplu işi başlattım ve bir kahve molası verdim.

Ancak proje yöneticisi Slack üzerinden bana "Avatarın biraz daha gülümsemesini sağlayabilir miyiz?" diye sorsun ve ben de Python betiğimde insan mutluluğunu kontrol eden bir boolean değeri olmadığını kibarca açıklamak zorunda kalınca, durumun ciddiyeti iyice ortaya çıktı.

Değişken Kare Hızının Sessiz Felaketi

Kahvemden döndüğümde, toplu işin tamamlandığını gördüm. İlk MP4 dosyasını indirip inceledim. Dudaklar hareket ediyordu, ancak ses ciddi şekilde senkron dışıydı. 14 saniyelik klip boyunca ses, tam 214 milisaniye geride kalmıştı. Modelin ağzı kapanırken ses hala heceleri üretmeye devam ediyordu. İkinci dosyayı kontrol ettim: Aynı sorun. Video ne kadar uzun olursa, senkron bozukluğu da o kadar artıyordu.

Altta yatan sorunu anlamak için ffprobe aracını kullanarak ham dosya verilerini inceledim:

ffprobe -v error -select_streams v:0 \
  -show_entries stream=avg_frame_rate,r_frame_rate \
  -of default=noprint_wrappers=1:nokey=1 out.mp4

Çıktı olarak 30000/1001 değeri döndü — yani yaklaşık 29.97 kare/saniye. Sorunun kaynağı açıkça ortadaydı: Kaynak referans videom değişken kare hızına (VFR) sahipti, ancak açık kaynaklı model sabit kare hızını (CFR) tam olarak 30 kare/saniye olarak varsayıyordu. FFmpeg alt işlemi, dudak hareketlerini işledikten sonra sesin uzunluğuna yetişmek için kareleri körü körüne atlayıp kopyaladığından, ses ve video parçaları yavaş yavaş birbirinden uzaklaşmıştı.

Sorunu çözmek için kaynak videoyu, modeli beslemeden önce sabit kare hızına zorladım:

ffmpeg -i kaynak.mp4 -vf mpdecimate -vsync cfr -r 30 normalleştirilmiş_kaynak.mp4

Bu sayede kayma sorunu giderildi, ancak çıktı görüntüsü hala oldukça kötüydü. Ağız çevresindeki çözünürlük ciddi şekilde bozulmuş, sadece 256x256 piksellik bir sınırlama içinde kalmıştı. Yüzü ikinci bir AI yükselticiyle yeniden işlemekse her video için ek dört dakika daha gerektiriyordu.

Toplamda 50 video üretmem gerekiyordu. Çıkarım süresini göz önüne aldığımda, Pazartesi sabahı teslim tarihini kaçırmış olacaktım. Dahası, başarısız denemelerimde zaten 41.38 dolar işlem kredisi harcamıştım.

Dış Kaynaklara Yönelmek Zorunda Kalmak

Zaman kısıtının, sıfırdan bir pipeline kurma arzumdan daha katı olduğunu kabul etmek zorundaydım. Video render işini yönetilen bir hizmete devretmem gerekiyordu.

Dijital avatar oluşturma ve dudak senkronizasyonu konusunda uzmanlaşmış birkaç harici API’yi değerlendirdim. 50 yerelleştirilmiş video üretimini otomatikleştirmek için en önemli gereksinimim, programatik webhook teslimatıydı. Beş dakikalık bir uzak sunucu işlemesi sırasında HTTP bağlantısını açık tutmak, zaman aşımı hatalarına ve bağlantı havuzunun tükenmesine yol açabilecek kötü bir uygulamaydı.

| Platform | Webhook Desteği | Faturalandırma Birimi | Maks. Çözünürlük | |----------|------------------|-----------------------|------------------| | Nextify.ai | Evet | 60 saniye | 1080p | | UGCVideo.ai | Hayır (Sadece polling) | 30 saniye | 720p | | Adsmaker.ai | Evet | 1 saniye | 4K |

Sonunda orkestrasyon betiğimi listede üçüncü sırada yer alan seçeneğe taşıdım. Bunu en gerçekçi insan yüzlerine ya da en iyi arayüze sahip olduğu için seçmedim. Yerelleştirilmiş kliplerimin çoğu 12 ila 14 saniye arasında olduğu için, diğer platformlar 30 saniyelik

Yapay zeka özeti

Geliştirici, pazarlama kampanyası için 50 yerelleştirilmiş video üretmek zorunda kaldı. 48 saatte AI avatarla video oluşturma deneyimi ve karşılaşılan teknik engeller.

Yorumlar

00
YORUM BIRAK
ID #MVIMM8

0 / 1200 KARAKTER

İnsan doğrulaması

6 + 6 = ?

Editör onayı sonrası yayına girer

Moderasyon · Spam koruması aktif

Henüz onaylı yorum yok. İlk yorumu sen bırak.