live portrait translations (#705)

This commit is contained in:
BFlat authored and GitHub committed 2024-09-20 18:44:30 +07:00
1 parent cc3a3d1e13
commit fb4b3e1692
19 files changed
+1396 -53

No files matched your search

@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "জুম স্ক্রোল করুন এবং ক্রপ করতে টেনে আনুন",
"cropMobile": "জুম করুন এবং ক্রপ করতে টেনে আনুন",
"motion": "মোশন রেফারেন্স",
"output": "আউটপুট ভিডিও",
"pregeneratedExample": "পূর্ব-উত্পাদিত উদাহরণ",
"source": "সোর্স মিডিয়া"
},
"button": {
"animate": "অ্যানিমেট",
"cropFace": "ক্রপ ফেস",
"done": "সম্পন্ন",
"reanimate": "পুনরায় প্রাণবন্ত",
"signUpToAnimate": "অ্যানিমেট করতে এখন সাইন আপ করুন",
"signUpToUpload": "ছবি/ভিডিও আপলোড করতে সাইন আপ করুন",
"uploadImageVideo": "আপনার ছবি/ভিডিও আপলোড করুন",
"uploadMotionVideo": "আপনার গতি ভিডিও আপলোড করুন",
"uploadToGenerate": "জেনারেট করতে আপনার মিডিয়া আপলোড করুন",
"useWithLipsync": "লিপ সিঙ্কের সাথে ব্যবহার করুন"
},
"check": {
"makePrivate": "ব্যক্তিগত করুন",
"removeWatermark": "ওয়াটারমার্ক সরান"
},
"instruction": {
"animate": "জেনারেট শুরু করতে অ্যানিমেটে ক্লিক করুন"
},
"label": {
"latestOutputs": "সর্বশেষ আউটপুট",
"latestOutputsEmptyText": "আপনার সাম্প্রতিক লাইভ পোর্ট্রেট প্রজন্ম এখানে উপস্থিত হবে৷"
},
"output": {
"label": {
"generating": "ভিডিও তৈরি করা হচ্ছে..."
}
},
"results": {
"label": {
"attemptFailed": "প্রচেষ্টা ব্যর্থ হয়েছে",
"canceled": "ব্যবহারকারী দ্বারা বাতিল",
"completeFailure": "ব্যর্থ হয়েছে",
"completeSuccess": "সম্পন্ন",
"dead": "মৃত",
"pending": "মুলতুবি",
"started": "উৎপন্ন হচ্ছে",
"unknown": "অজানা"
},
"link": {
"details": "আরো বিস্তারিত"
}
},
"step": {
"one": {
"subtitle": "এই ছবিটি বা ভিডিও চূড়ান্ত ভিডিও কেমন হবে।",
"title": "উৎস নির্বাচন করুন"
},
"two": {
"subtitle": "মুখের ভিডিওটি এভাবেই সরবে (অডিও রয়েছে)।",
"title": "মোশন রেফারেন্স নির্বাচন করুন"
}
},
"subtitle": {
"livePortrait": "একটি মুখের ভিডিও থেকে একটি চিত্র বা ভিডিওতে মুখের অভিব্যক্তি, অডিও এবং ভোকাল স্থানান্তর করতে AI ব্যবহার করুন৷"
},
"title": {
"livePortrait": "লাইভ পোর্ট্রেট"
},
"tooltip": {
"download": "ভিডিও ডাউনলোড করুন",
"downloadNoOutput": "ডাউনলোড করতে প্রথমে অ্যানিমেট করুন"
},
"uploadModal": {
"subtitle": {
"motion": "অনুগ্রহ করে পরিষ্কার মুখের অভিব্যক্তি সহ একটি ভিডিও আপলোড করুন যা মাথায় ফোকাস করে অন্তত কাঁধের নড়াচড়া করে বা এটি কাজ নাও করতে পারে। (512 x 512px প্রস্তাবিত)",
"source": "দয়া করে একটি পরিষ্কার মুখ দিয়ে একটি ছবি বা ভিডিও আপলোড করুন বা এটি কাজ নাও করতে পারে৷"
},
"title": {
"motion": "আপলোড মোশন রেফারেন্স ভিডিও",
"source": "সোর্স ইমেজ বা ভিডিও আপলোড করুন"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Scrollen Sie, zoomen Sie und ziehen Sie, um zuzuschneiden",
"cropMobile": "Zum Zuschneiden zoomen und ziehen",
"motion": "Bewegungsreferenz",
"output": "Video ausgeben",
"pregeneratedExample": "Vorgeneriertes Beispiel",
"source": "Quellmedien"
},
"button": {
"animate": "Animieren",
"cropFace": "Gesicht zuschneiden",
"done": "Erledigt",
"reanimate": "Neu animieren",
"signUpToAnimate": "Melden Sie sich jetzt bei Animate an",
"signUpToUpload": "Melden Sie sich an, um Bilder/Videos hochzuladen",
"uploadImageVideo": "Laden Sie Ihr Bild/Video hoch",
"uploadMotionVideo": "Laden Sie Ihr Bewegungsvideo hoch",
"uploadToGenerate": "Laden Sie Ihre Medien hoch, um sie zu generieren",
"useWithLipsync": "Zur Verwendung mit Lip Sync"
},
"check": {
"makePrivate": "Privat machen",
"removeWatermark": "Wasserzeichen entfernen"
},
"instruction": {
"animate": "Klicken Sie auf „Animieren“, um mit der Generierung zu beginnen"
},
"label": {
"latestOutputs": "Neueste Ausgaben",
"latestOutputsEmptyText": "Hier erscheinen Ihre neuesten Live-Porträt-Generationen."
},
"output": {
"label": {
"generating": "Video wird erstellt..."
}
},
"results": {
"label": {
"attemptFailed": "Versuch fehlgeschlagen",
"canceled": "Vom Benutzer storniert",
"completeFailure": "Fehlgeschlagen",
"completeSuccess": "Vollendet",
"dead": "Tot",
"pending": "Ausstehend",
"started": "Generieren",
"unknown": "Unbekannt"
},
"link": {
"details": "Weitere Details"
}
},
"step": {
"one": {
"subtitle": "Dieses Bild oder Video zeigt, wie das endgültige Video aussehen wird.",
"title": "Wählen Sie Quelle"
},
"two": {
"subtitle": "So bewegt sich das Gesichtsvideo (enthält Audio).",
"title": "Wählen Sie Bewegungsreferenz"
}
},
"subtitle": {
"livePortrait": "Verwenden Sie KI, um Gesichtsausdrücke, Audio und Gesang von einem Gesichtsvideo auf ein Bild oder Video zu übertragen."
},
"title": {
"livePortrait": "Live-Porträt"
},
"tooltip": {
"download": "Video herunterladen",
"downloadNoOutput": "Animieren Sie zuerst, um es herunterzuladen"
},
"uploadModal": {
"subtitle": {
"motion": "Bitte laden Sie ein Video mit klarer Mimik hoch, das sich auf den Kopf mit den wenigsten Schulterbewegungen konzentriert, sonst funktioniert es möglicherweise nicht. (512 x 512 Pixel empfohlen)",
"source": "Bitte laden Sie ein Bild oder Video mit klarem Gesicht hoch, sonst funktioniert es möglicherweise nicht."
},
"title": {
"motion": "Laden Sie ein Bewegungsreferenzvideo hoch",
"source": "Laden Sie das Quellbild oder -video hoch"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Scroll zoom and drag to crop",
"cropMobile": "Zoom and drag to crop",
"motion": "Motion Reference",
"output": "Output Video",
"pregeneratedExample": "Pre-generated Example",
"source": "Source Media"
},
"button": {
"animate": "Animate",
"cropFace": "Crop Face",
"done": "Done",
"reanimate": "Re-animate",
"signUpToAnimate": "Sign up now to Animate",
"signUpToUpload": "Sign up to upload image/video",
"uploadImageVideo": "Upload your image/video",
"uploadMotionVideo": "Upload your motion video",
"uploadToGenerate": "Upload your media to generate",
"useWithLipsync": "Use with Lip Sync"
},
"check": {
"makePrivate": "Make Private",
"removeWatermark": "Remove Watermark"
},
"instruction": {
"animate": "Click Animate to start generating"
},
"label": {
"latestOutputs": "Latest Outputs",
"latestOutputsEmptyText": "Your latest live portrait generations will appear here."
},
"output": {
"label": {
"generating": "Generating video..."
}
},
"results": {
"label": {
"attemptFailed": "Attempt Failed",
"canceled": "Canceled by User",
"completeFailure": "Failed",
"completeSuccess": "Completed",
"dead": "Dead",
"pending": "Pending",
"started": "Generating",
"unknown": "Unknown"
},
"link": {
"details": "More Details"
}
},
"step": {
"one": {
"subtitle": "This image or video is what the final video will look like.",
"title": "Select Source"
},
"two": {
"subtitle": "This is what the face video will move like (contains audio).",
"title": "Select Motion Reference"
}
},
"subtitle": {
"livePortrait": "Use AI to transfer facial expressions, audio, and vocals from one face video to an image or video."
},
"title": {
"livePortrait": "Live Portrait"
},
"tooltip": {
"download": "Download video",
"downloadNoOutput": "Animate first to download"
},
"uploadModal": {
"subtitle": {
"motion": "Please upload a video with clear facial expressions that focuses on the head with the least shoulder movements or it may not work. (512 x 512px recommended)",
"source": "Please upload an image or video with a clear face or it may not work."
},
"title": {
"motion": "Upload Motion Reference Video",
"source": "Upload Source Image or Video"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Desplaza el zoom y arrastra para recortar",
"cropMobile": "Haz zoom y arrastra para recortar",
"motion": "Referencia de movimiento",
"output": "Vídeo de salida",
"pregeneratedExample": "Ejemplo pregenerado",
"source": "Medios de origen"
},
"button": {
"animate": "Animar",
"cropFace": "Recortar cara",
"done": "Hecho",
"reanimate": "Reanimar",
"signUpToAnimate": "Regístrate ahora para animar",
"signUpToUpload": "Regístrate para subir imagen/vídeo",
"uploadImageVideo": "Sube tu imagen/video",
"uploadMotionVideo": "Sube tu vídeo en movimiento",
"uploadToGenerate": "Sube tus medios para generar",
"useWithLipsync": "Usar con sincronización de labios"
},
"check": {
"makePrivate": "Hacer privado",
"removeWatermark": "Quitar marca de agua"
},
"instruction": {
"animate": "Haga clic en Animar para comenzar a generar"
},
"label": {
"latestOutputs": "Últimas salidas",
"latestOutputsEmptyText": "Tus últimas generaciones de retratos en vivo aparecerán aquí."
},
"output": {
"label": {
"generating": "Generando vídeo..."
}
},
"results": {
"label": {
"attemptFailed": "Intento fallido",
"canceled": "Cancelado por el usuario",
"completeFailure": "Fallido",
"completeSuccess": "Terminado",
"dead": "Muerto",
"pending": "Pendiente",
"started": "generando",
"unknown": "Desconocido"
},
"link": {
"details": "Más detalles"
}
},
"step": {
"one": {
"subtitle": "Esta imagen o video es como se verá el video final.",
"title": "Seleccionar fuente"
},
"two": {
"subtitle": "Así es como se moverá el video de la cara (contiene audio).",
"title": "Seleccionar referencia de movimiento"
}
},
"subtitle": {
"livePortrait": "Utilice IA para transferir expresiones faciales, audio y voces de un video de rostro a una imagen o video."
},
"title": {
"livePortrait": "Retrato en vivo"
},
"tooltip": {
"download": "Descargar vídeo",
"downloadNoOutput": "Animar primero para descargar."
},
"uploadModal": {
"subtitle": {
"motion": "Sube un vídeo con expresiones faciales claras que se centre en la cabeza con el menor movimiento de hombros o es posible que no funcione. (se recomienda 512 x 512 px)",
"source": "Sube una imagen o un vídeo con una cara clara o es posible que no funcione."
},
"title": {
"motion": "Cargar vídeo de referencia de movimiento",
"source": "Subir imagen o vídeo de origen"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Faites défiler le zoom et faites glisser pour recadrer",
"cropMobile": "Zoomez et faites glisser pour recadrer",
"motion": "Référence de mouvement",
"output": "Sortie vidéo",
"pregeneratedExample": "Exemple pré-généré",
"source": "Média source"
},
"button": {
"animate": "Animer",
"cropFace": "Recadrer le visage",
"done": "Fait",
"reanimate": "Ranimer",
"signUpToAnimate": "Inscrivez-vous maintenant pour animer",
"signUpToUpload": "Inscrivez-vous pour télécharger une image/vidéo",
"uploadImageVideo": "Téléchargez votre image/vidéo",
"uploadMotionVideo": "Téléchargez votre vidéo animée",
"uploadToGenerate": "Téléchargez vos médias pour générer",
"useWithLipsync": "Utiliser avec Lip Sync"
},
"check": {
"makePrivate": "Rendre privé",
"removeWatermark": "Supprimer le filigrane"
},
"instruction": {
"animate": "Cliquez sur Animer pour commencer à générer"
},
"label": {
"latestOutputs": "Dernières sorties",
"latestOutputsEmptyText": "Vos dernières générations de portraits en direct apparaîtront ici."
},
"output": {
"label": {
"generating": "Génération de vidéo..."
}
},
"results": {
"label": {
"attemptFailed": "La tentative a échoué",
"canceled": "Annulé par l'utilisateur",
"completeFailure": "Échoué",
"completeSuccess": "Complété",
"dead": "Mort",
"pending": "En attente",
"started": "Générateur",
"unknown": "Inconnu"
},
"link": {
"details": "Plus de détails"
}
},
"step": {
"one": {
"subtitle": "Cette image ou vidéo correspond à ce à quoi ressemblera la vidéo finale.",
"title": "Sélectionnez la source"
},
"two": {
"subtitle": "C'est à cela que ressemblera la vidéo du visage (contient de l'audio).",
"title": "Sélectionner la référence de mouvement"
}
},
"subtitle": {
"livePortrait": "Utilisez l'IA pour transférer les expressions faciales, l'audio et les voix d'une vidéo de visage vers une image ou une vidéo."
},
"title": {
"livePortrait": "Portrait en direct"
},
"tooltip": {
"download": "Télécharger la vidéo",
"downloadNoOutput": "Animez d'abord pour télécharger"
},
"uploadModal": {
"subtitle": {
"motion": "Veuillez télécharger une vidéo avec des expressions faciales claires qui se concentrent sur la tête avec le moins de mouvements d'épaule, sinon cela pourrait ne pas fonctionner. (512 x 512 px recommandé)",
"source": "Veuillez télécharger une image ou une vidéo avec un visage clair, sinon cela pourrait ne pas fonctionner."
},
"title": {
"motion": "Télécharger une vidéo de référence sur le mouvement",
"source": "Télécharger l'image ou la vidéo source"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "ज़ूम स्क्रॉल करें और क्रॉप करने के लिए खींचें",
"cropMobile": "ज़ूम करें और क्रॉप करने के लिए खींचें",
"motion": "मोशन संदर्भ",
"output": "आउटपुट वीडियो",
"pregeneratedExample": "पूर्व-निर्मित उदाहरण",
"source": "स्रोत मीडिया"
},
"button": {
"animate": "चेतन",
"cropFace": "फसल का चेहरा",
"done": "हो गया",
"reanimate": "पुनः सजीव करें",
"signUpToAnimate": "एनिमेट करने के लिए अभी साइन अप करें",
"signUpToUpload": "छवि/वीडियो अपलोड करने के लिए साइन अप करें",
"uploadImageVideo": "अपनी छवि/वीडियो अपलोड करें",
"uploadMotionVideo": "अपना मोशन वीडियो अपलोड करें",
"uploadToGenerate": "उत्पन्न करने के लिए अपना मीडिया अपलोड करें",
"useWithLipsync": "लिप सिंक के साथ प्रयोग करें"
},
"check": {
"makePrivate": "निजी बनाएं",
"removeWatermark": "पानी के निशान हटाएं"
},
"instruction": {
"animate": "जनरेट करना शुरू करने के लिए एनिमेट पर क्लिक करें"
},
"label": {
"latestOutputs": "नवीनतम आउटपुट",
"latestOutputsEmptyText": "आपकी नवीनतम लाइव पोर्ट्रेट पीढ़ियां यहां दिखाई देंगी।"
},
"output": {
"label": {
"generating": "वीडियो जनरेट किया जा रहा है..."
}
},
"results": {
"label": {
"attemptFailed": "प्रयास विफल",
"canceled": "उपयोगकर्ता द्वारा रद्द किया गया",
"completeFailure": "असफल",
"completeSuccess": "पुरा होना।",
"dead": "मृत",
"pending": "लंबित",
"started": "उत्पादक",
"unknown": "अज्ञात"
},
"link": {
"details": "अधिक जानकारी"
}
},
"step": {
"one": {
"subtitle": "यह छवि या वीडियो अंतिम वीडियो जैसा दिखेगा।",
"title": "स्रोत चुनें"
},
"two": {
"subtitle": "फेस वीडियो इस प्रकार चलेगा (इसमें ऑडियो भी शामिल है)।",
"title": "मोशन संदर्भ चुनें"
}
},
"subtitle": {
"livePortrait": "चेहरे के भाव, ऑडियो और स्वर को एक चेहरे के वीडियो से एक छवि या वीडियो में स्थानांतरित करने के लिए AI का उपयोग करें।"
},
"title": {
"livePortrait": "लाइव पोर्ट्रेट"
},
"tooltip": {
"download": "वीडियो डाउनलोड करें",
"downloadNoOutput": "डाउनलोड करने के लिए पहले चेतन करें"
},
"uploadModal": {
"subtitle": {
"motion": "कृपया स्पष्ट चेहरे के भावों वाला एक वीडियो अपलोड करें जो कम से कम कंधे की गतिविधियों के साथ सिर पर केंद्रित हो, अन्यथा यह काम नहीं करेगा। (512 x 512px अनुशंसित)",
"source": "कृपया स्पष्ट चेहरे वाली छवि या वीडियो अपलोड करें अन्यथा यह काम नहीं करेगा।"
},
"title": {
"motion": "मोशन संदर्भ वीडियो अपलोड करें",
"source": "स्रोत छवि या वीडियो अपलोड करें"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Gulir zoom dan seret untuk memotong",
"cropMobile": "Perbesar dan seret untuk memotong",
"motion": "Referensi Gerakan",
"output": "Video Keluaran",
"pregeneratedExample": "Contoh yang telah dibuat sebelumnya",
"source": "Sumber Media"
},
"button": {
"animate": "Menghidupkan",
"cropFace": "Pangkas Wajah",
"done": "Selesai",
"reanimate": "Menghidupkan kembali",
"signUpToAnimate": "Daftar sekarang ke Animate",
"signUpToUpload": "Daftar untuk mengunggah gambar/video",
"uploadImageVideo": "Unggah gambar/video Anda",
"uploadMotionVideo": "Unggah video gerak Anda",
"uploadToGenerate": "Unggah media Anda untuk menghasilkan",
"useWithLipsync": "Gunakan dengan Sinkronisasi Bibir"
},
"check": {
"makePrivate": "Jadikan Pribadi",
"removeWatermark": "Hapus Tanda Air"
},
"instruction": {
"animate": "Klik Animate untuk mulai membuat"
},
"label": {
"latestOutputs": "Keluaran Terbaru",
"latestOutputsEmptyText": "Generasi potret langsung terbaru Anda akan muncul di sini."
},
"output": {
"label": {
"generating": "Membuat video..."
}
},
"results": {
"label": {
"attemptFailed": "Percobaan Gagal",
"canceled": "Dibatalkan oleh Pengguna",
"completeFailure": "Gagal",
"completeSuccess": "Selesai",
"dead": "Mati",
"pending": "Tertunda",
"started": "Menghasilkan",
"unknown": "Tidak dikenal"
},
"link": {
"details": "Lebih Detail"
}
},
"step": {
"one": {
"subtitle": "Gambar atau video inilah yang akan menjadi tampilan akhir video.",
"title": "Pilih Sumber"
},
"two": {
"subtitle": "Seperti inilah video wajah akan bergerak (berisi audio).",
"title": "Pilih Referensi Gerakan"
}
},
"subtitle": {
"livePortrait": "Gunakan AI untuk mentransfer ekspresi wajah, audio, dan vokal dari satu video wajah ke gambar atau video."
},
"title": {
"livePortrait": "Potret Langsung"
},
"tooltip": {
"download": "Unduh video",
"downloadNoOutput": "Animasikan terlebih dahulu untuk diunduh"
},
"uploadModal": {
"subtitle": {
"motion": "Silakan unggah video dengan ekspresi wajah jelas yang berfokus pada kepala dengan gerakan bahu paling sedikit atau mungkin tidak akan berhasil. (disarankan 512 x 512 piksel)",
"source": "Silakan unggah gambar atau video dengan wajah yang jelas atau mungkin tidak berfungsi."
},
"title": {
"motion": "Unggah Video Referensi Gerakan",
"source": "Unggah Sumber Gambar atau Video"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Scorri lo zoom e trascina per ritagliare",
"cropMobile": "Ingrandisci e trascina per ritagliare",
"motion": "Riferimento al movimento",
"output": "Uscita video",
"pregeneratedExample": "Esempio pregenerato",
"source": "Supporti di origine"
},
"button": {
"animate": "Animare",
"cropFace": "Ritaglia faccia",
"done": "Fatto",
"reanimate": "Rianimare",
"signUpToAnimate": "Iscriviti ora ad Animate",
"signUpToUpload": "Iscriviti per caricare immagini/video",
"uploadImageVideo": "Carica la tua immagine/video",
"uploadMotionVideo": "Carica il tuo video in movimento",
"uploadToGenerate": "Carica i tuoi contenuti multimediali per generare",
"useWithLipsync": "Utilizzare con la sincronizzazione labiale"
},
"check": {
"makePrivate": "Rendi privato",
"removeWatermark": "Rimuovi filigrana"
},
"instruction": {
"animate": "Fai clic su Anima per iniziare a generare"
},
"label": {
"latestOutputs": "Ultime uscite",
"latestOutputsEmptyText": "Le tue ultime generazioni di ritratti dal vivo appariranno qui."
},
"output": {
"label": {
"generating": "Generazione video..."
}
},
"results": {
"label": {
"attemptFailed": "Tentativo fallito",
"canceled": "Annullato dall'utente",
"completeFailure": "Fallito",
"completeSuccess": "Completato",
"dead": "Morto",
"pending": "In attesa di",
"started": "Generazione",
"unknown": "Sconosciuto"
},
"link": {
"details": "Maggiori dettagli"
}
},
"step": {
"one": {
"subtitle": "Questa immagine o video è l'aspetto del video finale.",
"title": "Seleziona Sorgente"
},
"two": {
"subtitle": "Ecco come si sposterà il video del volto (contiene audio).",
"title": "Selezionare Riferimento movimento"
}
},
"subtitle": {
"livePortrait": "Utilizza l'intelligenza artificiale per trasferire le espressioni facciali, l'audio e la voce dal video di un volto a un'immagine o a un video."
},
"title": {
"livePortrait": "Ritratto dal vivo"
},
"tooltip": {
"download": "Scarica video",
"downloadNoOutput": "Animare prima da scaricare"
},
"uploadModal": {
"subtitle": {
"motion": "Carica un video con espressioni facciali chiare che si concentri sulla testa con minimi movimenti delle spalle, altrimenti potrebbe non funzionare. (512 x 512px consigliati)",
"source": "Carica un'immagine o un video con un volto chiaro, altrimenti potrebbe non funzionare."
},
"title": {
"motion": "Carica video di riferimento del movimento",
"source": "Carica immagine o video sorgente"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "スクロールズームしてドラッグして切り抜きます",
"cropMobile": "ズームしてドラッグして切り抜きます",
"motion": "モーションリファレンス",
"output": "出力ビデオ",
"pregeneratedExample": "事前に生成された例",
"source": "ソースメディア"
},
"button": {
"animate": "アニメイト",
"cropFace": "トリミング面",
"done": "終わり",
"reanimate": "再アニメーション化",
"signUpToAnimate": "今すぐアニメイトに登録してください",
"signUpToUpload": "画像/ビデオをアップロードするにはサインアップしてください",
"uploadImageVideo": "画像/ビデオをアップロードする",
"uploadMotionVideo": "モーションビデオをアップロードする",
"uploadToGenerate": "メディアをアップロードして生成します",
"useWithLipsync": "リップシンクと併用する"
},
"check": {
"makePrivate": "非公開にする",
"removeWatermark": "透かしを削除する"
},
"instruction": {
"animate": "「アニメーション」をクリックして生成を開始します"
},
"label": {
"latestOutputs": "最新の成果物",
"latestOutputsEmptyText": "最新のライブ ポートレート世代がここに表示されます。"
},
"output": {
"label": {
"generating": "ビデオを生成中..."
}
},
"results": {
"label": {
"attemptFailed": "失敗しました",
"canceled": "ユーザーによりキャンセルされました",
"completeFailure": "失敗した",
"completeSuccess": "完了しました",
"dead": "死んだ",
"pending": "保留中",
"started": "生成中",
"unknown": "未知"
},
"link": {
"details": "さらに詳しく"
}
},
"step": {
"one": {
"subtitle": "この画像またはビデオが最終的なビデオの外観になります。",
"title": "ソースの選択"
},
"two": {
"subtitle": "顔動画はこんな感じで動きます(音声あり)。",
"title": "モーション参照の選択"
}
},
"subtitle": {
"livePortrait": "AI を使用して、顔の表情、音声、ボーカルを 1 つの顔ビデオから画像またはビデオに転送します。"
},
"title": {
"livePortrait": "ライブポートレート"
},
"tooltip": {
"download": "ビデオをダウンロードする",
"downloadNoOutput": "まずはAnimateをダウンロードしてください"
},
"uploadModal": {
"subtitle": {
"motion": "肩の動きを最小限に抑え、頭に焦点を当てた明確な表情の動画をアップロードしてください。アップロードできない場合があります。 (512×512px推奨)",
"source": "はっきりとした顔の画像や動画をアップロードしてください。アップロードしないと機能しない可能性があります。"
},
"title": {
"motion": "モーションリファレンスビデオをアップロードする",
"source": "ソース画像またはビデオをアップロードする"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "확대/축소 스크롤하고 드래그하여 자르기",
"cropMobile": "확대/축소하고 드래그하여 자르기",
"motion": "모션 레퍼런스",
"output": "출력 비디오",
"pregeneratedExample": "사전 생성된 예",
"source": "소스 미디어"
},
"button": {
"animate": "생기 있게 하다",
"cropFace": "얼굴 자르기",
"done": "완료",
"reanimate": "다시 애니메이션",
"signUpToAnimate": "지금 Animate에 가입하세요",
"signUpToUpload": "이미지/비디오를 업로드하려면 가입하세요",
"uploadImageVideo": "이미지/동영상 업로드",
"uploadMotionVideo": "모션 비디오를 업로드하세요",
"uploadToGenerate": "생성할 미디어를 업로드하세요.",
"useWithLipsync": "립싱크와 함께 사용"
},
"check": {
"makePrivate": "비공개로 설정",
"removeWatermark": "워터마크 제거"
},
"instruction": {
"animate": "생성을 시작하려면 애니메이션을 클릭하세요."
},
"label": {
"latestOutputs": "최신 출력",
"latestOutputsEmptyText": "최신 실시간 인물 사진 세대가 여기에 표시됩니다."
},
"output": {
"label": {
"generating": "동영상 생성 중..."
}
},
"results": {
"label": {
"attemptFailed": "시도 실패",
"canceled": "사용자가 취소함",
"completeFailure": "실패한",
"completeSuccess": "완전한",
"dead": "죽은",
"pending": "보류 중",
"started": "생성 중",
"unknown": "알려지지 않은"
},
"link": {
"details": "자세한 내용"
}
},
"step": {
"one": {
"subtitle": "이 이미지 또는 비디오는 최종 비디오의 모습입니다.",
"title": "소스 선택"
},
"two": {
"subtitle": "이것이 얼굴 비디오가 움직이는 모습입니다(오디오 포함).",
"title": "모션 참조 선택"
}
},
"subtitle": {
"livePortrait": "AI를 사용하여 한 얼굴 비디오의 표정, 오디오, 음성을 이미지나 비디오로 전송합니다."
},
"title": {
"livePortrait": "라이브 초상화"
},
"tooltip": {
"download": "비디오 다운로드",
"downloadNoOutput": "먼저 애니메이션을 다운로드하세요."
},
"uploadModal": {
"subtitle": {
"motion": "어깨 움직임을 최소한으로 하고 머리에 초점을 맞춘 선명한 표정의 영상을 올려주세요. 그렇지 않으면 영상이 나오지 않을 수 있습니다. (512x512px 권장)",
"source": "얼굴이 선명하게 나온 이미지나 동영상을 업로드해 주세요. 그렇지 않으면 작동하지 않을 수 있습니다."
},
"title": {
"motion": "모션 참조 비디오 업로드",
"source": "소스 이미지 또는 비디오 업로드"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Role o zoom e arraste para cortar",
"cropMobile": "Amplie e arraste para cortar",
"motion": "Referência de movimento",
"output": "Vídeo de saída",
"pregeneratedExample": "Exemplo pré-gerado",
"source": "Mídia de origem"
},
"button": {
"animate": "Animar",
"cropFace": "Cortar rosto",
"done": "Feito",
"reanimate": "Reanimar",
"signUpToAnimate": "Inscreva-se agora no Animate",
"signUpToUpload": "Inscreva-se para enviar imagem/vídeo",
"uploadImageVideo": "Envie sua imagem/vídeo",
"uploadMotionVideo": "Envie seu vídeo em movimento",
"uploadToGenerate": "Carregue sua mídia para gerar",
"useWithLipsync": "Use com sincronização labial"
},
"check": {
"makePrivate": "Tornar privado",
"removeWatermark": "Remover marca d’água"
},
"instruction": {
"animate": "Clique em Animar para começar a gerar"
},
"label": {
"latestOutputs": "Últimos resultados",
"latestOutputsEmptyText": "Suas últimas gerações de retratos ao vivo aparecerão aqui."
},
"output": {
"label": {
"generating": "Gerando vídeo..."
}
},
"results": {
"label": {
"attemptFailed": "Tentativa falhada",
"canceled": "Cancelado pelo usuário",
"completeFailure": "Fracassado",
"completeSuccess": "Concluído",
"dead": "Morto",
"pending": "Pendente",
"started": "Gerando",
"unknown": "Desconhecido"
},
"link": {
"details": "Mais detalhes"
}
},
"step": {
"one": {
"subtitle": "Esta imagem ou vídeo é a aparência do vídeo final.",
"title": "Selecione a fonte"
},
"two": {
"subtitle": "É assim que o vídeo do rosto se moverá (contém áudio).",
"title": "Selecione referência de movimento"
}
},
"subtitle": {
"livePortrait": "Use IA para transferir expressões faciais, áudio e vocais de um vídeo facial para uma imagem ou vídeo."
},
"title": {
"livePortrait": "Retrato ao vivo"
},
"tooltip": {
"download": "Baixar vídeo",
"downloadNoOutput": "Animar primeiro para baixar"
},
"uploadModal": {
"subtitle": {
"motion": "Envie um vídeo com expressões faciais claras que enfoquem a cabeça com o mínimo de movimentos dos ombros ou pode não funcionar. (512 x 512px recomendado)",
"source": "Faça upload de uma imagem ou vídeo com um rosto claro ou pode não funcionar."
},
"title": {
"motion": "Carregar vídeo de referência de movimento",
"source": "Carregar imagem ou vídeo de origem"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Прокрутите масштаб и перетащите, чтобы обрезать",
"cropMobile": "Увеличьте масштаб и перетащите, чтобы обрезать",
"motion": "Справочник движения",
"output": "Выходное видео",
"pregeneratedExample": "Предварительно созданный пример",
"source": "Исходные медиа"
},
"button": {
"animate": "Оживить",
"cropFace": "Обрезать лицо",
"done": "Сделанный",
"reanimate": "Реанимировать",
"signUpToAnimate": "Зарегистрируйтесь сейчас в Animate",
"signUpToUpload": "Зарегистрируйтесь, чтобы загрузить изображение/видео",
"uploadImageVideo": "Загрузите свое изображение/видео",
"uploadMotionVideo": "Загрузите свое движущееся видео",
"uploadToGenerate": "Загрузите свои медиафайлы для создания",
"useWithLipsync": "Использование с синхронизацией губ"
},
"check": {
"makePrivate": "Сделать личным",
"removeWatermark": "Удалить водяной знак"
},
"instruction": {
"animate": "Нажмите Animate, чтобы начать создание."
},
"label": {
"latestOutputs": "Последние результаты",
"latestOutputsEmptyText": "Здесь появятся ваши последние поколения живых портретов."
},
"output": {
"label": {
"generating": "Создание видео..."
}
},
"results": {
"label": {
"attemptFailed": "Попытка не удалась",
"canceled": "Отменено пользователем",
"completeFailure": "Неуспешный",
"completeSuccess": "Завершенный",
"dead": "Мертвый",
"pending": "В ожидании",
"started": "Создание",
"unknown": "Неизвестный"
},
"link": {
"details": "Подробнее"
}
},
"step": {
"one": {
"subtitle": "Это изображение или видео — это то, как будет выглядеть окончательное видео.",
"title": "Выберите источник"
},
"two": {
"subtitle": "Вот как будет двигаться видео лица (содержит звук).",
"title": "Выберите ссылку на движение"
}
},
"subtitle": {
"livePortrait": "Используйте искусственный интеллект для переноса мимики, звука и вокала из видео с одним лицом в изображение или видео."
},
"title": {
"livePortrait": "Живой портрет"
},
"tooltip": {
"download": "Скачать видео",
"downloadNoOutput": "Animate скачивается первым"
},
"uploadModal": {
"subtitle": {
"motion": "Пожалуйста, загрузите видео с четкой мимикой, в котором основное внимание уделяется голове с наименьшим количеством движений плеч, иначе это может не сработать. (рекомендуется 512 x 512 пикселей)",
"source": "Пожалуйста, загрузите изображение или видео с четким лицом, иначе оно может не сработать."
},
"title": {
"motion": "Загрузить эталонное видео по движению",
"source": "Загрузите исходное изображение или видео"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "เลื่อนการซูมแล้วลากเพื่อครอบตัด",
"cropMobile": "ซูมและลากเพื่อครอบตัด",
"motion": "การอ้างอิงการเคลื่อนไหว",
"output": "วิดีโอเอาท์พุต",
"pregeneratedExample": "ตัวอย่างที่สร้างไว้ล่วงหน้า",
"source": "แหล่งสื่อ"
},
"button": {
"animate": "เคลื่อนไหว",
"cropFace": "ครอบตัดใบหน้า",
"done": "เสร็จแล้ว",
"reanimate": "สร้างภาพเคลื่อนไหวอีกครั้ง",
"signUpToAnimate": "ลงทะเบียนตอนนี้เพื่อสร้างภาพเคลื่อนไหว",
"signUpToUpload": "ลงทะเบียนเพื่ออัพโหลดภาพ/วิดีโอ",
"uploadImageVideo": "อัปโหลดรูปภาพ/วิดีโอของคุณ",
"uploadMotionVideo": "อัปโหลดวิดีโอภาพเคลื่อนไหวของคุณ",
"uploadToGenerate": "อัปโหลดสื่อของคุณเพื่อสร้าง",
"useWithLipsync": "ใช้กับลิปซิงค์"
},
"check": {
"makePrivate": "ทำให้เป็นส่วนตัว",
"removeWatermark": "ลบลายน้ำ"
},
"instruction": {
"animate": "คลิกเคลื่อนไหวเพื่อเริ่มสร้าง"
},
"label": {
"latestOutputs": "ผลผลิตล่าสุด",
"latestOutputsEmptyText": "Live Portrait รุ่นใหม่ล่าสุดของคุณจะปรากฏที่นี่"
},
"output": {
"label": {
"generating": "กำลังสร้างวิดีโอ..."
}
},
"results": {
"label": {
"attemptFailed": "ความพยายามล้มเหลว",
"canceled": "ยกเลิกโดยผู้ใช้",
"completeFailure": "ล้มเหลว",
"completeSuccess": "สมบูรณ์",
"dead": "ตาย",
"pending": "รอดำเนินการ",
"started": "กำลังสร้าง",
"unknown": "ไม่ทราบ"
},
"link": {
"details": "รายละเอียดเพิ่มเติม"
}
},
"step": {
"one": {
"subtitle": "รูปภาพหรือวิดีโอนี้คือลักษณะของวิดีโอสุดท้าย",
"title": "เลือกแหล่งที่มา"
},
"two": {
"subtitle": "นี่คือลักษณะที่วิดีโอใบหน้าจะเคลื่อนไหว (มีเสียง)",
"title": "เลือก การอ้างอิงการเคลื่อนไหว"
}
},
"subtitle": {
"livePortrait": "ใช้ AI เพื่อถ่ายโอนการแสดงออกทางสีหน้า เสียง และเสียงร้องจากวิดีโอใบหน้าเดียวไปยังรูปภาพหรือวิดีโอ"
},
"title": {
"livePortrait": "ภาพบุคคลแบบสด"
},
"tooltip": {
"download": "ดาวน์โหลดวิดีโอ",
"downloadNoOutput": "เคลื่อนไหวก่อนเพื่อดาวน์โหลด"
},
"uploadModal": {
"subtitle": {
"motion": "โปรดอัปโหลดวิดีโอที่มีการแสดงออกทางสีหน้าที่ชัดเจนโดยเน้นที่ศีรษะโดยขยับไหล่น้อยที่สุด ไม่เช่นนั้นอาจไม่ได้ผล (แนะนำขนาด 512 x 512px)",
"source": "โปรดอัปโหลดรูปภาพหรือวิดีโอที่มีใบหน้าที่ชัดเจน ไม่เช่นนั้นอาจไม่ทำงาน"
},
"title": {
"motion": "อัปโหลดวิดีโออ้างอิงการเคลื่อนไหว",
"source": "อัปโหลดรูปภาพหรือวิดีโอต้นฉบับ"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Yakınlaştırmayı kaydırın ve kırpmak için sürükleyin",
"cropMobile": "Kırpmak için yakınlaştırın ve sürükleyin",
"motion": "Hareket Referansı",
"output": "Çıkış Videosu",
"pregeneratedExample": "Önceden Oluşturulmuş Örnek",
"source": "Kaynak Medya"
},
"button": {
"animate": "Canlandır",
"cropFace": "Yüzü Kırp",
"done": "Tamamlamak",
"reanimate": "Yeniden canlandır",
"signUpToAnimate": "Animate'e şimdi kaydolun",
"signUpToUpload": "Resim/video yüklemek için kaydolun",
"uploadImageVideo": "Resminizi/videonuzu yükleyin",
"uploadMotionVideo": "Hareketli videonuzu yükleyin",
"uploadToGenerate": "Oluşturmak için medyanızı yükleyin",
"useWithLipsync": "Lip Sync ile kullanın"
},
"check": {
"makePrivate": "Özel Yap",
"removeWatermark": "Filigranı Kaldır"
},
"instruction": {
"animate": "Oluşturmaya başlamak için Canlandır'a tıklayın"
},
"label": {
"latestOutputs": "Son Çıktılar",
"latestOutputsEmptyText": "En son canlı portre nesilleriniz burada görünecek."
},
"output": {
"label": {
"generating": "Video oluşturuluyor..."
}
},
"results": {
"label": {
"attemptFailed": "Deneme Başarısız",
"canceled": "Kullanıcı tarafından iptal edildi",
"completeFailure": "Arızalı",
"completeSuccess": "Tamamlanmış",
"dead": "Ölü",
"pending": "Askıda olması",
"started": "Üretiliyor",
"unknown": "Bilinmiyor"
},
"link": {
"details": "Daha Fazla Detay"
}
},
"step": {
"one": {
"subtitle": "Bu resim veya video, son videonun nasıl görüneceğidir.",
"title": "Kaynak Seç"
},
"two": {
"subtitle": "Yüz videosu bu şekilde hareket edecektir (ses içerir).",
"title": "Hareket Referansını Seçin"
}
},
"subtitle": {
"livePortrait": "Yüz ifadelerini, sesi ve vokalleri bir yüz videosundan bir görüntüye veya videoya aktarmak için yapay zekayı kullanın."
},
"title": {
"livePortrait": "Canlı Portre"
},
"tooltip": {
"download": "Videoyu indir",
"downloadNoOutput": "İndirilecek ilk şey Animate"
},
"uploadModal": {
"subtitle": {
"motion": "Lütfen en az omuz hareketi ile kafaya odaklanan net yüz ifadeleri içeren bir video yükleyin, aksi takdirde çalışmayabilir. (512 x 512 piksel önerilir)",
"source": "Lütfen yüzü net olan bir resim veya video yükleyin, aksi takdirde çalışmayabilir."
},
"title": {
"motion": "Hareket Referans Videosu Yükle",
"source": "Kaynak Resim veya Videoyu Yükle"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "Cuộn thu phóng và kéo để cắt",
"cropMobile": "Thu phóng và kéo để cắt",
"motion": "Tham chiếu chuyển động",
"output": "Video đầu ra",
"pregeneratedExample": "Ví dụ được tạo trước",
"source": "Nguồn phương tiện"
},
"button": {
"animate": "hoạt hình",
"cropFace": "Cắt mặt",
"done": "Xong",
"reanimate": "Hoạt hình lại",
"signUpToAnimate": "Đăng ký ngay để Animate",
"signUpToUpload": "Đăng ký để tải lên hình ảnh/video",
"uploadImageVideo": "Tải lên hình ảnh/video của bạn",
"uploadMotionVideo": "Tải lên video chuyển động của bạn",
"uploadToGenerate": "Tải lên phương tiện của bạn để tạo",
"useWithLipsync": "Sử dụng với Lip Sync"
},
"check": {
"makePrivate": "Đặt ở chế độ riêng tư",
"removeWatermark": "Xóa hình mờ"
},
"instruction": {
"animate": "Nhấp vào Animate để bắt đầu tạo"
},
"label": {
"latestOutputs": "Đầu ra mới nhất",
"latestOutputsEmptyText": "Thế hệ chân dung trực tiếp mới nhất của bạn sẽ xuất hiện ở đây."
},
"output": {
"label": {
"generating": "Đang tạo video..."
}
},
"results": {
"label": {
"attemptFailed": "Cố gắng không thành công",
"canceled": "Người dùng đã hủy",
"completeFailure": "Thất bại",
"completeSuccess": "Hoàn thành",
"dead": "Chết",
"pending": "Chưa giải quyết",
"started": "Đang tạo",
"unknown": "Không xác định"
},
"link": {
"details": "Thêm chi tiết"
}
},
"step": {
"one": {
"subtitle": "Hình ảnh hoặc video này chính là hình ảnh của video cuối cùng.",
"title": "Chọn nguồn"
},
"two": {
"subtitle": "Video khuôn mặt sẽ chuyển động như thế này (có chứa âm thanh).",
"title": "Chọn tham chiếu chuyển động"
}
},
"subtitle": {
"livePortrait": "Sử dụng AI để chuyển nét mặt, âm thanh và giọng nói từ video một khuôn mặt sang hình ảnh hoặc video."
},
"title": {
"livePortrait": "Chân dung trực tiếp"
},
"tooltip": {
"download": "Tải video xuống",
"downloadNoOutput": "Hoạt hình đầu tiên để tải xuống"
},
"uploadModal": {
"subtitle": {
"motion": "Vui lòng tải lên một video có nét mặt rõ ràng, tập trung vào phần đầu với ít cử động vai nhất, nếu không video đó có thể không hiệu quả. (khuyên dùng 512 x 512px)",
"source": "Vui lòng tải lên hình ảnh hoặc video có khuôn mặt rõ ràng, nếu không nó có thể không hoạt động."
},
"title": {
"motion": "Tải lên video tham chiếu chuyển động",
"source": "Tải lên hình ảnh hoặc video nguồn"
}
}
}
@@ -0,0 +1,83 @@
{
"badge": {
"cropDesktop": "滚动缩放并拖动进行裁剪",
"cropMobile": "缩放并拖动进行裁剪",
"motion": "运动参考",
"output": "输出视频",
"pregeneratedExample": "预先生成的示例",
"source": "源媒体"
},
"button": {
"animate": "动画",
"cropFace": "裁剪脸",
"done": "完毕",
"reanimate": "复活",
"signUpToAnimate": "立即注册 Animate",
"signUpToUpload": "注册上传图像/视频",
"uploadImageVideo": "上传您的图片/视频",
"uploadMotionVideo": "上传您的动态视频",
"uploadToGenerate": "上传您的媒体以生成",
"useWithLipsync": "与唇形同步一起使用"
},
"check": {
"makePrivate": "设为私有",
"removeWatermark": "删除水印"
},
"instruction": {
"animate": "点击Animate开始生成"
},
"label": {
"latestOutputs": "最新输出",
"latestOutputsEmptyText": "您最新的实时肖像世代将出现在这里。"
},
"output": {
"label": {
"generating": "正在生成视频..."
}
},
"results": {
"label": {
"attemptFailed": "尝试失败",
"canceled": "已被用户取消",
"completeFailure": "失败的",
"completeSuccess": "完全的",
"dead": "死的",
"pending": "待办的",
"started": "生成",
"unknown": "未知"
},
"link": {
"details": "更多详情"
}
},
"step": {
"one": {
"subtitle": "该图像或视频就是最终视频的样子。",
"title": "选择来源"
},
"two": {
"subtitle": "这就是面部视频的移动方式(包含音频)。",
"title": "选择运动参考"
}
},
"subtitle": {
"livePortrait": "使用 AI 将面部表情、音频和声音从一张人脸视频传输到图像或视频。"
},
"title": {
"livePortrait": "实时肖像"
},
"tooltip": {
"download": "下载视频",
"downloadNoOutput": "首先下载动画"
},
"uploadModal": {
"subtitle": {
"motion": "请上传面部表情清晰的视频,重点关注头部且肩膀运动最少,否则可能无法正常工作。 (推荐 512 x 512 像素)",
"source": "请上传脸部清晰的图片或视频,否则可能无法正常工作。"
},
"title": {
"motion": "上传动作参考视频",
"source": "上传源图像或视频"
}
}
}
@@ -34,7 +34,7 @@ import {
import Tippy from "@tippyjs/react";
import "tippy.js/dist/tippy.css";
import { v4 as uuidv4 } from "uuid";
import { useInferenceJobs, useModal, useSession } from "hooks";
import { useInferenceJobs, useLocalize, useModal, useSession } from "hooks";
import {
FrontendInferenceJobType,
InferenceJob,
@@ -137,6 +137,8 @@ export default function LivePortrait() {
const location = useLocation();
const history = useHistory();
const { t, language } = useLocalize("LivePortrait");
const precomputedVideos = useMemo(
() => [
// Source 1: Mona Lisa
@@ -395,8 +397,8 @@ export default function LivePortrait() {
<div className="d-flex flex-column align-items-center gap-3 justify-content-center">
<LoadingSpinner padding={false} />
{currentProgress !== null
? `Generating video... ${currentProgress}%`
: "Generating video..."}
? `${t("output.label.generating")} ${currentProgress}%`
: `${t("output.label.generating")}`}
</div>
</h4>
</div>
@@ -437,12 +439,18 @@ export default function LivePortrait() {
}}
>
<h4 className="fw-medium">
Click{" "}
<b>
<FontAwesomeIcon icon={faSparkles} className="me-2 fs-6" />
Animate
</b>{" "}
to start generating
{language === "en" ? (
<>
Click{" "}
<b>
<FontAwesomeIcon icon={faSparkles} className="me-2 fs-6" />
Animate
</b>{" "}
to start generating
</>
) : (
<>{t("instruction.animate")}</>
)}
</h4>
</div>
<OutputThumbnailImage
@@ -855,14 +863,13 @@ export default function LivePortrait() {
<Panel padding={true}>
<h1 className="fw-bold fs-1 mb-0">
<FontAwesomeIcon icon={faImageUser} className="me-3 fs-2" />
Live Portrait
{t("title.livePortrait")}
</h1>
<p
className="opacity-75 fw-medium"
style={{ marginBottom: "2.5rem" }}
>
Use AI to transfer facial expressions, audio, and vocals from one
face video to an image or video.
{t("subtitle.livePortrait")}
</p>
{!loggedIn && (
@@ -879,17 +886,17 @@ export default function LivePortrait() {
mediaTokens={sourceTokens}
selectedIndex={selectedSourceIndex}
handleThumbnailClick={handleSourceSelect}
title="Select Source"
description="This image or video is what the final video will look like."
badgeLabel="Source Media"
title={t("step.one.title")}
description={t("step.one.subtitle")}
badgeLabel={t("badge.source")}
stepNumber={1}
onUploadClick={handleOpenUploadSourceModal}
onSelectedMediaChange={handleSelectedMediaChange}
uploadFocusPoint={uploadFocusPointSource}
uploadButtonText={
loggedIn
? "Upload your image/video"
: "Sign up to upload image/video"
? t("button.uploadImageVideo")
: t("button.signUpToUpload")
}
/>
</div>
@@ -909,9 +916,9 @@ export default function LivePortrait() {
mediaTokens={motionTokens}
selectedIndex={selectedMotionIndex}
handleThumbnailClick={handleMotionSelect}
title="Select Motion Reference"
description="This is what the face video will move like (contains audio)."
badgeLabel="Motion Reference"
title={t("step.two.title")}
description={t("step.two.subtitle")}
badgeLabel={t("badge.motion")}
cropper={true}
cropArea={cropArea}
setCropArea={setCropArea}
@@ -920,8 +927,8 @@ export default function LivePortrait() {
uploadFocusPoint={uploadFocusPointMotion}
uploadButtonText={
loggedIn
? "Upload your motion video"
: "Sign up to upload image/video"
? t("button.uploadMotionVideo")
: t("button.signUpToUpload")
}
/>
</div>
@@ -944,13 +951,13 @@ export default function LivePortrait() {
<div className="lp-tag">
<div className="d-flex gap-2 w-100">
<Badge
label="Output Video"
label={t("badge.output")}
color="ultramarine"
overlay={true}
/>
{!isUserContent && (
<Badge
label="Pre-generated Example"
label={t("badge.pregeneratedExample")}
color="gray"
overlay={true}
/>
@@ -964,7 +971,7 @@ export default function LivePortrait() {
{generatedVideoSrc && resultTokens[combinationKey] && (
<Button
icon={faLips}
label="Use with Lipsync"
label={t("button.useWithLipsync")}
onClick={() =>
history.push(
`/ai-lip-sync?source=${resultTokens[combinationKey]}`
@@ -980,14 +987,14 @@ export default function LivePortrait() {
icon={isUserContent ? faSparkles : undefined}
label={
!loggedIn && isUserContent
? "Sign Up and Animate"
? t("button.signUpToAnimate")
: isUserContent
? generatedVideoSrc
? "Re-animate"
: "Animate"
? t("button.reanimate")
: t("button.animate")
: !loggedIn
? "Sign up now to Animate"
: "Upload your media to generate"
? t("button.signUpToAnimate")
: t("button.signUpToAnimate")
}
onClick={
loggedIn
@@ -1004,14 +1011,21 @@ export default function LivePortrait() {
variant={generatedVideoSrc ? "action" : "primary"}
/>
<Tippy theme="fakeyou" content="Download video">
<Tippy
theme="fakeyou"
content={
generatedVideoSrc && isUserContent
? t("tooltip.download")
: t("tooltip.downloadNoOutput")
}
>
<div>
<Button
square={true}
icon={faArrowDownToLine}
variant="action"
onClick={handleDownloadClick}
disabled={!loggedIn}
disabled={!generatedVideoSrc}
/>
</div>
</Tippy>
@@ -1026,7 +1040,7 @@ export default function LivePortrait() {
>
<div className="d-flex gap-3">
<Checkbox
label={"Make Private"}
label={t("check.makePrivate")}
onChange={() => {
setVisibility(prevVisibility =>
prevVisibility === "private"
@@ -1039,7 +1053,7 @@ export default function LivePortrait() {
/>
<Checkbox
label={"Remove Watermark"}
label={t("check.removeWatermark")}
onChange={() => {
setRemoveWatermark(
prevRemoveWatermark => !prevRemoveWatermark
@@ -1067,7 +1081,7 @@ export default function LivePortrait() {
{loggedIn && (
<div className="mt-5 pt-3 order-3">
<Label label="Latest Outputs" />
<Label label={t("label.latestOutputs")} />
<div>
<SessionLpInferenceResultsList
onJobTokens={handleJobTokens}
@@ -3,7 +3,7 @@ import {
FrontendInferenceJobType,
InferenceJob,
} from "@storyteller/components/src/jobs/InferenceJob";
import { useInferenceJobs } from "hooks";
import { useInferenceJobs, useLocalize } from "hooks";
import { LivePortraitDetails } from "@storyteller/components/src/api/model_inference/GetModelInferenceJobStatus";
import { GetMedia } from "@storyteller/components/src/api/media_files/GetMedia";
import { BucketConfig } from "@storyteller/components/src/api/BucketConfig";
@@ -39,7 +39,7 @@ export default function SessionLpInferenceResultsList({
onJobStateChange,
}: SessionLpInferenceResultsListProps) {
const history = useHistory();
const { t } = useLocalize("LivePortrait");
const { inferenceJobsByCategory } = useInferenceJobs();
const hasInitialized = useRef(false);
@@ -143,14 +143,14 @@ export default function SessionLpInferenceResultsList({
}, [livePortraitJobs, mediaSrc]);
const jobStateTextMap: { [key in JobState]: string } = {
[JobState.UNKNOWN]: "Unknown",
[JobState.PENDING]: "Pending",
[JobState.STARTED]: "Generating",
[JobState.COMPLETE_SUCCESS]: "Completed",
[JobState.COMPLETE_FAILURE]: "Completed (Failure)",
[JobState.ATTEMPT_FAILED]: "Attempt Failed",
[JobState.DEAD]: "Dead",
[JobState.CANCELED_BY_USER]: "Canceled by User",
[JobState.UNKNOWN]: t("results.label.unknown"),
[JobState.PENDING]: t("results.label.pending"),
[JobState.STARTED]: t("results.label.started"),
[JobState.COMPLETE_SUCCESS]: t("results.label.completeSuccess"),
[JobState.COMPLETE_FAILURE]: t("results.label.completeFailure"),
[JobState.ATTEMPT_FAILED]: t("results.label.attemptFailed"),
[JobState.DEAD]: t("results.label.dead"),
[JobState.CANCELED_BY_USER]: t("results.label.canceled"),
};
const handleLipsyncCTA = (
@@ -234,7 +234,7 @@ export default function SessionLpInferenceResultsList({
className="fs-7 d-flex align-items-center gap-1 mt-1"
to={`/media/${job.maybeResultToken}`}
>
More Details
{t("results.link.details")}
</Link>
) : (
<div className="fs-7 opacity-50 fw-medium mt-1">
@@ -251,7 +251,7 @@ export default function SessionLpInferenceResultsList({
<Button
icon={faLips}
label="Use with Lip Sync"
label={t("button.useWithLipsync")}
small={true}
variant={job.maybeResultToken ? "primary" : "action"}
disabled={!job.maybeResultToken}
@@ -272,7 +272,7 @@ export default function SessionLpInferenceResultsList({
style={{ height: "94px" }}
>
<span className="fw-medium opacity-75">
Your latest live portrait generations will appear here.
{t("label.latestOutputsEmptyText")}
</span>
</div>
)}
@@ -17,7 +17,7 @@ import {
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { isMobile } from "react-device-detect";
import { Area } from "react-easy-crop";
import { useSession } from "hooks";
import { useLocalize, useSession } from "hooks";
interface ThumbnailMediaPickerProps {
mediaTokens: string[];
@@ -85,6 +85,7 @@ const ThumbnailMediaPicker: React.FC<ThumbnailMediaPickerProps> = React.memo(
const itemsPerPage = 8;
const [resetTrigger, setResetTrigger] = useState<number>(0);
const { loggedIn } = useSession();
const { t } = useLocalize("LivePortrait");
useEffect(() => {
const fetchMediaData = async () => {
@@ -185,9 +186,9 @@ const ThumbnailMediaPicker: React.FC<ThumbnailMediaPickerProps> = React.memo(
<Badge label={badgeLabel} color="ultramarine" overlay={true} />
) : (
<Badge
label={`${
isMobile ? "Zoom" : "Scroll zoom"
} and drag to crop`}
label={
isMobile ? t("badge.cropMobile") : t("badge.cropDesktop")
}
color="gray"
overlay={true}
/>
@@ -196,7 +197,7 @@ const ThumbnailMediaPicker: React.FC<ThumbnailMediaPickerProps> = React.memo(
{cropper && showCropButton && (
<div>
<Button
label={isCropping ? "Done" : "Crop Face"}
label={isCropping ? t("button.done") : t("button.cropFace")}
className="py-1 px-2 fs-7"
variant={isCropping ? "primary" : "action"}
onClick={() => setIsCropping(prev => !prev)}