File size: 2,725 Bytes
a1320d8
134c911
 
 
242a970
a1320d8
4e1bce5
 
a1320d8
134c911
 
 
 
 
 
 
 
 
 
 
a1320d8
 
 
 
 
 
 
 
 
 
 
f22d3ca
a1320d8
 
242a970
 
a1320d8
242a970
 
a1320d8
242a970
7543760
242a970
 
 
 
 
 
 
 
 
4e1bce5
242a970
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f22d3ca
242a970
 
 
 
 
 
 
 
 
a1320d8
 
 
7543760
a1320d8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import os
import sys
sys.path.append('/app/SadTalker/src')

from flask import Flask, render_template, request, jsonify, send_from_directory

# app = Flask(__name__, static_folder='static', static_url_path='/static')
app = Flask(__name__)

# Initialize SadTalker with proper import
try:
    from inference import SadTalker
    sadtalker = SadTalker(
        checkpoint_path="/app/SadTalker/checkpoints",
        config_path="/app/SadTalker/src/config",
        device="cpu"
    )
except ImportError:
    print("Warning: SadTalker not properly initialized")
    sadtalker = None

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/generate', methods=['POST'])
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
@app.route('/debug/static')
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
@app.route('/static/<path:filename>')
def static_files(filename):
    return send_from_directory(app.static_folder, filename)

if __name__ == '__main__':
    os.makedirs('static/uploads', exist_ok=True)

    app.run(host='0.0.0.0', port=7860)