File size: 3,303 Bytes
d82e0f2
 
 
39eeb21
d82e0f2
 
39eeb21
 
 
47928d8
39eeb21
 
d82e0f2
39eeb21
 
 
d82e0f2
 
 
39eeb21
 
 
 
 
 
 
 
 
 
 
 
 
 
d82e0f2
39eeb21
 
 
 
 
 
 
 
 
 
 
 
 
 
d82e0f2
 
39eeb21
 
 
 
 
d82e0f2
39eeb21
 
 
 
d82e0f2
39eeb21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d82e0f2
 
39eeb21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d82e0f2
39eeb21
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import json
import time
import functools
import requests

class APIHandler:
    def __init__(self, api_key: str):
        self.models = {
            "tencent/SongGeneration": "https://api-inference.huggingface.co/models/tencent/SongGeneration",
            "daydreamlive/DreamVAE": "https://api-inference.huggingface.co/models/daydreamlive/DreamVAE"
        }
        self.api_key = api_key

    # -------------------------------
    # SONG GENERATION
    # -------------------------------
    @functools.lru_cache(maxsize=128)
    def call_song_gen(self, model, prompt, lyrics, voice, duration):
        if model not in self.models:
            return {"status": "error", "message": "Invalid model"}

        payload = {
            "prompt": prompt,
            "lyrics": lyrics,
            "voice": voice,
            "duration": duration
        }

        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }

        try:
            response = requests.post(
                self.models[model],
                headers=headers,
                data=json.dumps(payload),
                timeout=60
            )

            if response.status_code != 200:
                return {
                    "status": "error",
                    "code": response.status_code,
                    "details": response.text
                }

            return {
                "status": "success",
                "audio_data": response.content,
                "meta": {
                    "duration": duration,
                    "voice": voice
                }
            }

        except requests.exceptions.Timeout:
            return {"status": "error", "message": "Request timed out"}

        except Exception as e:
            return {"status": "error", "message": str(e)}

    # -------------------------------
    # AUDIO EDITING
    # -------------------------------
    def call_audio_edit(self, model, audio_bytes, action, param=None):
        if model not in self.models:
            return {"status": "error", "message": "Invalid model"}

        if not audio_bytes:
            return {"status": "error", "message": "No audio provided"}

        headers = {
            "Authorization": f"Bearer {self.api_key}"
        }

        files = {
            "audio": ("input.wav", audio_bytes, "audio/wav")
        }

        data = {
            "action": action,
            "param": json.dumps(param) if param else None
        }

        try:
            response = requests.post(
                self.models[model],
                headers=headers,
                files=files,
                data=data,
                timeout=60
            )

            if response.status_code != 200:
                return {
                    "status": "error",
                    "code": response.status_code,
                    "details": response.text
                }

            return {
                "status": "success",
                "edited_audio": response.content
            }

        except requests.exceptions.Timeout:
            return {"status": "error", "message": "Audio edit request timed out"}

        except Exception as e:
            return {"status": "error", "message": str(e)}