Spaces:
Running
Running
import os | |
import sys | |
sys.path.append('/app/SadTalker/src') | |
from flask import Flask, render_template, request, jsonify, send_from_directory | |
app = Flask(__name__) | |
# Initialize SadTalker with proper import | |
sadtalker = None | |
try: | |
# Try different import methods for SadTalker | |
sys.path.append('/app/SadTalker') | |
from src.test_audio2coeff import Audio2Coeff | |
from src.facerender.animate import AnimateFromCoeff | |
from src.generate_batch import get_data | |
from src.generate_facerender_batch import get_facerender_data | |
from src.utils.preprocess import CropAndExtract | |
print("SadTalker components imported successfully") | |
# Create a simple wrapper class | |
class SimpleSadTalker: | |
def __init__(self): | |
self.initialized = True | |
def generate(self, source_image, driven_audio, result_dir, **kwargs): | |
# Placeholder implementation - you may need to implement actual SadTalker logic | |
print(f"Generating video from {source_image} and {driven_audio}") | |
# For now, just copy the source image as a placeholder | |
import shutil | |
output_path = os.path.join(result_dir, 'output.mp4') | |
# Create a dummy video file for testing | |
with open(output_path, 'w') as f: | |
f.write("dummy video content") | |
return output_path | |
sadtalker = SimpleSadTalker() | |
print("SadTalker initialized successfully") | |
except Exception as e: | |
print(f"Warning: SadTalker not properly initialized: {e}") | |
sadtalker = None | |
def home(): | |
return render_template('index.html') | |
def generate(): | |
if 'image' not in request.files: | |
return jsonify({"error": "No image uploaded"}), 400 | |
image = request.files['image'] | |
# text | |
text = request.form.get('text', '') | |
if not text.strip(): | |
return jsonify({"error": "No text provided"}), 400 | |
if not image.filename: | |
return jsonify({"error": "No image selected"}), 400 | |
try: | |
#make sure that file exist | |
# Save files | |
img_path = os.path.join('static/uploads', image.filename) | |
audio_path = os.path.join('static/uploads', 'audio.wav') | |
output_path = os.path.join('static/uploads', 'output.mp4') | |
image.save(img_path) | |
# Text-to-Speech (using gTTS) | |
from gtts import gTTS | |
tts = gTTS(text=text, lang='en') | |
tts.save(audio_path) | |
# Generate video (CPU optimized) | |
if sadtalker: | |
sadtalker.generate( | |
source_image=img_path, | |
driven_audio=audio_path, | |
result_dir='static/uploads', | |
still=True, | |
preprocess='crop', | |
enhancer='none' # Disable for CPU | |
) | |
else: | |
return jsonify({"error": "SadTalker not initialized"}), 500 | |
return jsonify({ | |
"video": f"/static/uploads/{os.path.basename(output_path)}" | |
}) | |
except Exception as e: | |
return jsonify({"error": str(e)}), 500 | |
# Debug route to check static files | |
def debug_static(): | |
static_files = [] | |
for root, dirs, files in os.walk('static'): | |
for file in files: | |
static_files.append(os.path.join(root, file)) | |
return jsonify({"static_files": static_files}) | |
# Explicit static file route for debugging | |
def static_files(filename): | |
return send_from_directory(app.static_folder, filename) | |
if __name__ == '__main__': | |
# Create static directory with proper error handling | |
try: | |
os.makedirs('/app/static/uploads', exist_ok=True) | |
print("Static directories created successfully") | |
except PermissionError as e: | |
print(f"Permission error creating directories: {e}") | |
# Try alternative approach | |
try: | |
import subprocess | |
subprocess.run(['mkdir', '-p', '/app/static/uploads'], check=True) | |
subprocess.run(['chmod', '-R', '777', '/app/static'], check=True) | |
except Exception as mkdir_error: | |
print(f"Alternative directory creation failed: {mkdir_error}") | |
app.run(host='0.0.0.0', port=7860, debug=True) |