lollms-client 1.6.4__py3-none-any.whl → 1.6.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of lollms-client might be problematic. Click here for more details.
- lollms_client/__init__.py +1 -1
- lollms_client/lollms_core.py +3 -1
- lollms_client/tti_bindings/diffusers/__init__.py +129 -59
- lollms_client/tti_bindings/diffusers/server/main.py +354 -118
- lollms_client/tti_bindings/gemini/__init__.py +179 -239
- lollms_client/tts_bindings/xtts/__init__.py +106 -81
- lollms_client/tts_bindings/xtts/server/main.py +128 -183
- {lollms_client-1.6.4.dist-info → lollms_client-1.6.6.dist-info}/METADATA +1 -1
- {lollms_client-1.6.4.dist-info → lollms_client-1.6.6.dist-info}/RECORD +12 -12
- {lollms_client-1.6.4.dist-info → lollms_client-1.6.6.dist-info}/WHEEL +0 -0
- {lollms_client-1.6.4.dist-info → lollms_client-1.6.6.dist-info}/licenses/LICENSE +0 -0
- {lollms_client-1.6.4.dist-info → lollms_client-1.6.6.dist-info}/top_level.txt +0 -0
|
@@ -13,24 +13,26 @@ try:
|
|
|
13
13
|
import wave
|
|
14
14
|
import numpy as np
|
|
15
15
|
import tempfile
|
|
16
|
+
|
|
17
|
+
# Use ascii_colors for logging
|
|
18
|
+
from ascii_colors import ASCIIColors
|
|
16
19
|
|
|
17
20
|
# --- XTTS Implementation ---
|
|
18
21
|
try:
|
|
19
|
-
|
|
22
|
+
ASCIIColors.info("Server: Loading XTTS dependencies...")
|
|
20
23
|
import torch
|
|
21
|
-
import torchaudio
|
|
22
24
|
from TTS.api import TTS
|
|
23
|
-
|
|
25
|
+
ASCIIColors.green("Server: XTTS dependencies loaded successfully")
|
|
24
26
|
|
|
25
27
|
# Check for CUDA availability
|
|
26
28
|
device = "cuda" if torch.cuda.is_available() else "cpu"
|
|
27
|
-
|
|
29
|
+
ASCIIColors.info(f"Server: Using device: {device}")
|
|
28
30
|
|
|
29
31
|
xtts_available = True
|
|
30
32
|
|
|
31
33
|
except Exception as e:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
ASCIIColors.error(f"Server: Failed to load XTTS dependencies: {e}")
|
|
35
|
+
ASCIIColors.error(f"Server: Traceback:\n{traceback.format_exc()}")
|
|
34
36
|
xtts_available = False
|
|
35
37
|
|
|
36
38
|
# --- API Models ---
|
|
@@ -38,18 +40,21 @@ try:
|
|
|
38
40
|
text: str
|
|
39
41
|
voice: Optional[str] = None
|
|
40
42
|
language: Optional[str] = "en"
|
|
41
|
-
speaker_wav
|
|
43
|
+
# speaker_wav is kept for backward compatibility but voice is preferred
|
|
44
|
+
speaker_wav: Optional[str] = None
|
|
45
|
+
split_sentences: Optional[bool] = True
|
|
42
46
|
|
|
43
47
|
class XTTSServer:
|
|
44
48
|
def __init__(self):
|
|
45
49
|
self.model = None
|
|
46
50
|
self.model_loaded = False
|
|
47
51
|
self.model_loading = False # Flag to prevent concurrent loading
|
|
52
|
+
self.available_models = ["tts_models/multilingual/multi-dataset/xtts_v2"]
|
|
53
|
+
self.voices_dir = Path(__file__).parent / "voices"
|
|
54
|
+
self.voices_dir.mkdir(exist_ok=True)
|
|
48
55
|
self.available_voices = self._load_available_voices()
|
|
49
|
-
self.available_models = ["xtts_v2"]
|
|
50
56
|
|
|
51
|
-
|
|
52
|
-
print("Server: XTTS server initialized (model will be loaded on first request)")
|
|
57
|
+
ASCIIColors.info("Server: XTTS server initialized (model will be loaded on first request)")
|
|
53
58
|
|
|
54
59
|
async def _ensure_model_loaded(self):
|
|
55
60
|
"""Ensure the XTTS model is loaded (lazy loading)"""
|
|
@@ -63,171 +68,130 @@ try:
|
|
|
63
68
|
return
|
|
64
69
|
|
|
65
70
|
if not xtts_available:
|
|
66
|
-
raise RuntimeError("XTTS library not available")
|
|
71
|
+
raise RuntimeError("XTTS library not available. Please ensure all dependencies are installed correctly in the venv.")
|
|
67
72
|
|
|
68
73
|
try:
|
|
69
74
|
self.model_loading = True
|
|
70
|
-
|
|
75
|
+
ASCIIColors.yellow("Server: Loading XTTS model for the first time (this may take a few minutes)...")
|
|
71
76
|
|
|
72
77
|
# Initialize XTTS model
|
|
73
|
-
self.model = TTS(
|
|
78
|
+
self.model = TTS(self.available_models[0]).to(device)
|
|
74
79
|
|
|
75
80
|
self.model_loaded = True
|
|
76
|
-
|
|
81
|
+
ASCIIColors.green("Server: XTTS model loaded successfully")
|
|
77
82
|
|
|
78
83
|
except Exception as e:
|
|
79
|
-
|
|
80
|
-
|
|
84
|
+
ASCIIColors.error(f"Server: Error loading XTTS model: {e}")
|
|
85
|
+
ASCIIColors.error(f"Server: Traceback:\n{traceback.format_exc()}")
|
|
81
86
|
self.model_loaded = False
|
|
82
87
|
raise
|
|
83
88
|
finally:
|
|
84
89
|
self.model_loading = False
|
|
85
90
|
|
|
86
91
|
def _load_available_voices(self) -> List[str]:
|
|
87
|
-
"""Load and return available voices"""
|
|
92
|
+
"""Load and return available voices, ensuring 'default_voice' is always present."""
|
|
88
93
|
try:
|
|
89
|
-
|
|
90
|
-
voices_dir = Path(__file__).parent / "voices"
|
|
91
|
-
voices = []
|
|
94
|
+
self.voices_dir.mkdir(exist_ok=True)
|
|
92
95
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
voices.append(voice_file.stem)
|
|
96
|
+
# Scan for case-insensitive .wav and .mp3 files and get their stems
|
|
97
|
+
found_voices = {p.stem for p in self.voices_dir.glob("*.[wW][aA][vV]")}
|
|
98
|
+
found_voices.update({p.stem for p in self.voices_dir.glob("*.[mM][pP]3")})
|
|
97
99
|
|
|
98
|
-
#
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
# GUARANTEE 'default_voice' is in the list for UI consistency.
|
|
101
|
+
all_voices = {"default_voice"}.union(found_voices)
|
|
102
|
+
|
|
103
|
+
sorted_voices = sorted(list(all_voices))
|
|
104
|
+
ASCIIColors.info(f"Discovered voices: {sorted_voices}")
|
|
105
|
+
return sorted_voices
|
|
103
106
|
|
|
104
107
|
except Exception as e:
|
|
105
|
-
|
|
106
|
-
return
|
|
108
|
+
ASCIIColors.error(f"Server: Error scanning voices directory: {e}")
|
|
109
|
+
# If scanning fails, it's crucial to still return the default.
|
|
110
|
+
return ["default_voice"]
|
|
107
111
|
|
|
108
|
-
|
|
109
|
-
|
|
112
|
+
def _get_speaker_wav_path(self, voice_name: str) -> Optional[str]:
|
|
113
|
+
"""Find the path to a speaker wav/mp3 file from its name."""
|
|
114
|
+
if not voice_name:
|
|
115
|
+
return None
|
|
116
|
+
|
|
117
|
+
# Case 1: voice_name is an absolute path that exists
|
|
118
|
+
if os.path.isabs(voice_name) and os.path.exists(voice_name):
|
|
119
|
+
return voice_name
|
|
120
|
+
|
|
121
|
+
# Case 2: voice_name is a name in the voices directory (check for .mp3 then .wav)
|
|
122
|
+
mp3_path = self.voices_dir / f"{voice_name}.mp3"
|
|
123
|
+
if mp3_path.exists():
|
|
124
|
+
return str(mp3_path)
|
|
125
|
+
|
|
126
|
+
wav_path = self.voices_dir / f"{voice_name}.wav"
|
|
127
|
+
if wav_path.exists():
|
|
128
|
+
return str(wav_path)
|
|
129
|
+
|
|
130
|
+
return None
|
|
131
|
+
|
|
132
|
+
async def generate_audio(self, req: GenerationRequest) -> bytes:
|
|
110
133
|
"""Generate audio from text using XTTS"""
|
|
111
|
-
# Ensure model is loaded before proceeding
|
|
112
134
|
await self._ensure_model_loaded()
|
|
113
135
|
|
|
114
136
|
if not self.model_loaded or self.model is None:
|
|
115
|
-
raise RuntimeError("XTTS model failed to load")
|
|
137
|
+
raise RuntimeError("XTTS model failed to load or is not available.")
|
|
116
138
|
|
|
117
139
|
try:
|
|
118
|
-
|
|
119
|
-
|
|
140
|
+
text_to_generate = req.text
|
|
141
|
+
ASCIIColors.info(f"Server: Generating audio for: '{text_to_generate[:50]}{'...' if len(text_to_generate) > 50 else ''}'")
|
|
142
|
+
ASCIIColors.info(f"Server: Language: {req.language}, Requested Voice: {req.voice}")
|
|
143
|
+
|
|
144
|
+
# Determine which voice name to use. Priority: speaker_wav > voice > 'default_voice'
|
|
145
|
+
voice_to_find = req.speaker_wav or req.voice or "default_voice"
|
|
146
|
+
speaker_wav_path = self._get_speaker_wav_path(voice_to_find)
|
|
147
|
+
|
|
148
|
+
# If the chosen voice wasn't found and it wasn't the default, try the default as a fallback.
|
|
149
|
+
if not speaker_wav_path and voice_to_find != "default_voice":
|
|
150
|
+
ASCIIColors.warning(f"Voice '{voice_to_find}' not found. Falling back to 'default_voice'.")
|
|
151
|
+
speaker_wav_path = self._get_speaker_wav_path("default_voice")
|
|
152
|
+
|
|
153
|
+
# If still no path, it's a critical error because even the default is missing.
|
|
154
|
+
if not speaker_wav_path:
|
|
155
|
+
available = self._get_all_available_voice_files()
|
|
156
|
+
raise RuntimeError(
|
|
157
|
+
f"XTTS requires a speaker reference file, but none could be found.\n"
|
|
158
|
+
f"Attempted to use '{voice_to_find}' but it was not found, and the fallback 'default_voice.mp3' is also missing from the voices folder.\n"
|
|
159
|
+
f"Please add audio files to the '{self.voices_dir.resolve()}' directory. Available files: {available or 'None'}"
|
|
160
|
+
)
|
|
120
161
|
|
|
121
|
-
|
|
122
|
-
|
|
162
|
+
ASCIIColors.info(f"Server: Using speaker reference: {speaker_wav_path}")
|
|
163
|
+
|
|
164
|
+
# Generate audio using XTTS
|
|
165
|
+
wav_chunks = self.model.tts(
|
|
166
|
+
text=text_to_generate,
|
|
167
|
+
speaker_wav=speaker_wav_path,
|
|
168
|
+
language=req.language,
|
|
169
|
+
split_sentences=req.split_sentences
|
|
170
|
+
)
|
|
123
171
|
|
|
124
|
-
#
|
|
125
|
-
|
|
126
|
-
speaker_wav_path = speaker_wav
|
|
127
|
-
print(f"Server: Using provided speaker_wav: {speaker_wav_path}")
|
|
172
|
+
# Combine chunks into a single audio stream
|
|
173
|
+
audio_data = np.array(wav_chunks, dtype=np.float32)
|
|
128
174
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
else:
|
|
136
|
-
# Look for voice file in voices directory
|
|
137
|
-
voices_dir = Path(__file__).parent / "voices"
|
|
138
|
-
potential_voice_path = voices_dir / f"{voice}.wav"
|
|
139
|
-
if potential_voice_path.exists():
|
|
140
|
-
speaker_wav_path = str(potential_voice_path)
|
|
141
|
-
print(f"Server: Using custom voice file: {speaker_wav_path}")
|
|
142
|
-
else:
|
|
143
|
-
print(f"Server: Voice '{voice}' not found in voices directory")
|
|
144
|
-
else:
|
|
145
|
-
voice = "default_voice"
|
|
146
|
-
# Look for voice file in voices directory
|
|
147
|
-
voices_dir = Path(__file__).parent / "voices"
|
|
148
|
-
potential_voice_path = voices_dir / f"{voice}.mp3"
|
|
149
|
-
if potential_voice_path.exists():
|
|
150
|
-
speaker_wav_path = str(potential_voice_path)
|
|
151
|
-
print(f"Server: Using custom voice file: {speaker_wav_path}")
|
|
152
|
-
else:
|
|
153
|
-
print(f"Server: Voice '{voice}' not found in voices directory")
|
|
154
|
-
# Create a temporary file for output
|
|
155
|
-
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_file:
|
|
156
|
-
temp_output_path = temp_file.name
|
|
175
|
+
buffer = io.BytesIO()
|
|
176
|
+
with wave.open(buffer, 'wb') as wf:
|
|
177
|
+
wf.setnchannels(1)
|
|
178
|
+
wf.setsampwidth(2) # 16-bit
|
|
179
|
+
wf.setframerate(self.model.synthesizer.output_sample_rate)
|
|
180
|
+
wf.writeframes((audio_data * 32767).astype(np.int16).tobytes())
|
|
157
181
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
self.model.tts_to_file(
|
|
163
|
-
text=text,
|
|
164
|
-
speaker_wav=speaker_wav_path,
|
|
165
|
-
language=language,
|
|
166
|
-
file_path=temp_output_path
|
|
167
|
-
)
|
|
168
|
-
else:
|
|
169
|
-
print("Server: No valid speaker reference found, trying default")
|
|
170
|
-
# For XTTS without speaker reference, try to find a default
|
|
171
|
-
default_speaker = self._get_default_speaker_file()
|
|
172
|
-
if default_speaker and os.path.exists(default_speaker):
|
|
173
|
-
print(f"Server: Using default speaker: {default_speaker}")
|
|
174
|
-
self.model.tts_to_file(
|
|
175
|
-
text=text,
|
|
176
|
-
speaker_wav=default_speaker,
|
|
177
|
-
language=language,
|
|
178
|
-
file_path=temp_output_path
|
|
179
|
-
)
|
|
180
|
-
else:
|
|
181
|
-
# Create a more helpful error message
|
|
182
|
-
available_voices = self._get_all_available_voice_files()
|
|
183
|
-
error_msg = f"No speaker reference available. XTTS requires a speaker reference file.\n"
|
|
184
|
-
error_msg += f"Attempted to use: {speaker_wav_path if speaker_wav_path else 'None'}\n"
|
|
185
|
-
error_msg += f"Available voice files: {available_voices}"
|
|
186
|
-
raise RuntimeError(error_msg)
|
|
187
|
-
|
|
188
|
-
# Read the generated audio file
|
|
189
|
-
with open(temp_output_path, 'rb') as f:
|
|
190
|
-
audio_bytes = f.read()
|
|
191
|
-
|
|
192
|
-
print(f"Server: Generated {len(audio_bytes)} bytes of audio")
|
|
193
|
-
return audio_bytes
|
|
194
|
-
|
|
195
|
-
finally:
|
|
196
|
-
# Clean up temporary file
|
|
197
|
-
if os.path.exists(temp_output_path):
|
|
198
|
-
os.unlink(temp_output_path)
|
|
182
|
+
audio_bytes = buffer.getvalue()
|
|
183
|
+
|
|
184
|
+
ASCIIColors.green(f"Server: Generated {len(audio_bytes)} bytes of audio.")
|
|
185
|
+
return audio_bytes
|
|
199
186
|
|
|
200
187
|
except Exception as e:
|
|
201
|
-
|
|
202
|
-
|
|
188
|
+
ASCIIColors.error(f"Server: Error generating audio: {e}")
|
|
189
|
+
ASCIIColors.error(f"Server: Traceback:\n{traceback.format_exc()}")
|
|
203
190
|
raise
|
|
204
191
|
|
|
205
192
|
def _get_all_available_voice_files(self) -> List[str]:
|
|
206
193
|
"""Get list of all available voice files for debugging"""
|
|
207
|
-
|
|
208
|
-
voice_files = []
|
|
209
|
-
|
|
210
|
-
if voices_dir.exists():
|
|
211
|
-
voice_files = [str(f) for f in voices_dir.glob("*.wav")]
|
|
212
|
-
|
|
213
|
-
return voice_files
|
|
214
|
-
|
|
215
|
-
def _get_default_speaker_file(self) -> Optional[str]:
|
|
216
|
-
"""Get path to default speaker file"""
|
|
217
|
-
voices_dir = Path(__file__).parent / "voices"
|
|
218
|
-
|
|
219
|
-
# Look for a default speaker file
|
|
220
|
-
for filename in ["default.wav", "speaker.wav", "reference.wav"]:
|
|
221
|
-
potential_path = voices_dir / filename
|
|
222
|
-
if potential_path.exists():
|
|
223
|
-
return str(potential_path)
|
|
224
|
-
|
|
225
|
-
# If no default found, look for any wav file
|
|
226
|
-
wav_files = list(voices_dir.glob("*.wav"))
|
|
227
|
-
if wav_files:
|
|
228
|
-
return str(wav_files[0])
|
|
229
|
-
|
|
230
|
-
return None
|
|
194
|
+
return [f.name for f in self.voices_dir.glob("*.*")]
|
|
231
195
|
|
|
232
196
|
def list_voices(self) -> List[str]:
|
|
233
197
|
"""Return list of available voices"""
|
|
@@ -241,47 +205,36 @@ try:
|
|
|
241
205
|
app = FastAPI(title="XTTS Server")
|
|
242
206
|
router = APIRouter()
|
|
243
207
|
xtts_server = XTTSServer()
|
|
244
|
-
model_lock = asyncio.Lock() # Ensure
|
|
208
|
+
model_lock = asyncio.Lock() # Ensure only one generation happens at a time on the model
|
|
245
209
|
|
|
246
210
|
# --- API Endpoints ---
|
|
247
211
|
@router.post("/generate_audio")
|
|
248
|
-
async def
|
|
212
|
+
async def api_generate_audio(request: GenerationRequest):
|
|
249
213
|
async with model_lock:
|
|
250
214
|
try:
|
|
251
|
-
print(f"request.language:{request.language}")
|
|
252
|
-
audio_bytes = await xtts_server.generate_audio(
|
|
253
|
-
text=request.text,
|
|
254
|
-
voice=request.voice,
|
|
255
|
-
language=request.language,
|
|
256
|
-
speaker_wav=request.speaker_wav
|
|
257
|
-
)
|
|
258
215
|
from fastapi.responses import Response
|
|
216
|
+
audio_bytes = await xtts_server.generate_audio(request)
|
|
259
217
|
return Response(content=audio_bytes, media_type="audio/wav")
|
|
260
218
|
except Exception as e:
|
|
261
|
-
|
|
262
|
-
print(f"Server: ERROR traceback:\n{traceback.format_exc()}")
|
|
219
|
+
ASCIIColors.error(f"Server: ERROR in generate_audio endpoint: {e}")
|
|
263
220
|
raise HTTPException(status_code=500, detail=str(e))
|
|
264
221
|
|
|
265
222
|
@router.get("/list_voices")
|
|
266
|
-
async def
|
|
223
|
+
async def api_list_voices():
|
|
267
224
|
try:
|
|
268
225
|
voices = xtts_server.list_voices()
|
|
269
|
-
print(f"Server: Returning {len(voices)} voices: {voices}")
|
|
270
226
|
return {"voices": voices}
|
|
271
227
|
except Exception as e:
|
|
272
|
-
|
|
273
|
-
print(f"Server: ERROR traceback:\n{traceback.format_exc()}")
|
|
228
|
+
ASCIIColors.error(f"Server: ERROR in list_voices endpoint: {e}")
|
|
274
229
|
raise HTTPException(status_code=500, detail=str(e))
|
|
275
230
|
|
|
276
231
|
@router.get("/list_models")
|
|
277
|
-
async def
|
|
232
|
+
async def api_list_models():
|
|
278
233
|
try:
|
|
279
234
|
models = xtts_server.list_models()
|
|
280
|
-
print(f"Server: Returning {len(models)} models: {models}")
|
|
281
235
|
return {"models": models}
|
|
282
236
|
except Exception as e:
|
|
283
|
-
|
|
284
|
-
print(f"Server: ERROR traceback:\n{traceback.format_exc()}")
|
|
237
|
+
ASCIIColors.error(f"Server: ERROR in list_models endpoint: {e}")
|
|
285
238
|
raise HTTPException(status_code=500, detail=str(e))
|
|
286
239
|
|
|
287
240
|
@router.get("/status")
|
|
@@ -290,41 +243,33 @@ try:
|
|
|
290
243
|
"status": "running",
|
|
291
244
|
"xtts_available": xtts_available,
|
|
292
245
|
"model_loaded": xtts_server.model_loaded,
|
|
293
|
-
"
|
|
294
|
-
"voices_count": len(xtts_server.available_voices),
|
|
295
|
-
"device": torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU"
|
|
246
|
+
"device": device if xtts_available else "N/A"
|
|
296
247
|
}
|
|
297
248
|
|
|
298
|
-
# Add a health check endpoint that responds immediately
|
|
299
|
-
@router.get("/health")
|
|
300
|
-
async def health_check():
|
|
301
|
-
return {"status": "healthy", "ready": True}
|
|
302
|
-
|
|
303
249
|
app.include_router(router)
|
|
304
250
|
|
|
305
251
|
# --- Server Startup ---
|
|
306
252
|
if __name__ == '__main__':
|
|
307
|
-
parser = argparse.ArgumentParser(description="XTTS
|
|
253
|
+
parser = argparse.ArgumentParser(description="LoLLMs XTTS Server")
|
|
308
254
|
parser.add_argument("--host", type=str, default="localhost", help="Host to bind the server to.")
|
|
309
|
-
parser.add_argument("--port", type=int, default=
|
|
255
|
+
parser.add_argument("--port", type=int, default=8081, help="Port to bind the server to.")
|
|
310
256
|
|
|
311
257
|
args = parser.parse_args()
|
|
312
258
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
print(f"Server: Available voices: {len(xtts_server.available_voices)}")
|
|
317
|
-
if xtts_available:
|
|
318
|
-
print(f"Server: Device: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'CPU'}")
|
|
259
|
+
ASCIIColors.cyan("--- LoLLMs XTTS Server ---")
|
|
260
|
+
ASCIIColors.green(f"Starting server on http://{args.host}:{args.port}")
|
|
261
|
+
ASCIIColors.info(f"Voices directory: {xtts_server.voices_dir.resolve()}")
|
|
319
262
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
print(f"Server: CRITICAL ERROR running server: {e}")
|
|
328
|
-
print(f"Server: Traceback:\n{traceback.format_exc()}")
|
|
263
|
+
if not xtts_available:
|
|
264
|
+
ASCIIColors.red("Warning: XTTS dependencies not found. Server will run but generation will fail.")
|
|
265
|
+
else:
|
|
266
|
+
ASCIIColors.info(f"Detected device: {device}")
|
|
267
|
+
|
|
268
|
+
uvicorn.run(app, host=args.host, port=args.port)
|
|
269
|
+
|
|
329
270
|
except Exception as e:
|
|
330
|
-
|
|
271
|
+
# This will catch errors during initial imports
|
|
272
|
+
from ascii_colors import ASCIIColors
|
|
273
|
+
ASCIIColors.red(f"Server: CRITICAL ERROR during startup: {e}")
|
|
274
|
+
import traceback
|
|
275
|
+
ASCIIColors.red(f"Server: Traceback:\n{traceback.format_exc()}")```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
lollms_client/__init__.py,sha256=
|
|
1
|
+
lollms_client/__init__.py,sha256=51YtCHNJCmroyA9htiIgjui1ZSFfkn_zhhe0USpE8nc,1146
|
|
2
2
|
lollms_client/lollms_agentic.py,sha256=pQiMEuB_XkG29-SW6u4KTaMFPr6eKqacInggcCuCW3k,13914
|
|
3
3
|
lollms_client/lollms_config.py,sha256=goEseDwDxYJf3WkYJ4IrLXwg3Tfw73CXV2Avg45M_hE,21876
|
|
4
|
-
lollms_client/lollms_core.py,sha256=
|
|
4
|
+
lollms_client/lollms_core.py,sha256=Un74iLbnnn2yZYH6HBNRz1mTZ454NEMBEndS4nvh3ZI,244887
|
|
5
5
|
lollms_client/lollms_discussion.py,sha256=LZc9jYbUMRTovehiFJKEp-NXuCl_WnrqUtT3t4Nzayk,123922
|
|
6
6
|
lollms_client/lollms_js_analyzer.py,sha256=01zUvuO2F_lnUe_0NLxe1MF5aHE1hO8RZi48mNPv-aw,8361
|
|
7
7
|
lollms_client/lollms_llm_binding.py,sha256=_6d0q9g9lk8FRZ1oYnLpuqG7Y_WLyBJBn4ANdk-C8gU,25020
|
|
@@ -52,9 +52,9 @@ lollms_client/stt_bindings/lollms/__init__.py,sha256=9Vmn1sQQZKLGLe7nZnc-0LnNeSY
|
|
|
52
52
|
lollms_client/stt_bindings/whisper/__init__.py,sha256=1Ej67GdRKBy1bba14jMaYDYHiZkxJASkWm5eF07ztDQ,15363
|
|
53
53
|
lollms_client/stt_bindings/whispercpp/__init__.py,sha256=xSAQRjAhljak3vWCpkP0Vmdb6WmwTzPjXyaIB85KLGU,21439
|
|
54
54
|
lollms_client/tti_bindings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
|
-
lollms_client/tti_bindings/diffusers/__init__.py,sha256=
|
|
56
|
-
lollms_client/tti_bindings/diffusers/server/main.py,sha256=
|
|
57
|
-
lollms_client/tti_bindings/gemini/__init__.py,sha256=
|
|
55
|
+
lollms_client/tti_bindings/diffusers/__init__.py,sha256=esrcyy_z_6HVCFKMVXl1h_qY_pX3kMHwO81M2C8hSIg,17706
|
|
56
|
+
lollms_client/tti_bindings/diffusers/server/main.py,sha256=PQ3WXhkQzEzyT100k7nu1ZHQtkGphvpWNGl7Bcg26eY,49593
|
|
57
|
+
lollms_client/tti_bindings/gemini/__init__.py,sha256=eYGz6gnOxWGdJu2O0H-EwGG-Hg7Yo3Hzsgn4neqx29Q,12963
|
|
58
58
|
lollms_client/tti_bindings/leonardo_ai/__init__.py,sha256=pUbF1rKPZib1x0Kn2Bk1A7sTFWmZzNG02kmW6Iu1j2w,5885
|
|
59
59
|
lollms_client/tti_bindings/lollms/__init__.py,sha256=5Tnsn4b17djvieQkcjtIDBm3qf0pg5ZWWov-4_2wmo0,8762
|
|
60
60
|
lollms_client/tti_bindings/novita_ai/__init__.py,sha256=n4TeukArJ6gRaDZpXcbs1mrOpE6rsQ2RfYmr_QvAltY,4803
|
|
@@ -76,13 +76,13 @@ lollms_client/tts_bindings/piper_tts/__init__.py,sha256=7LQUuWV8I3IEdacc65NRHmDf
|
|
|
76
76
|
lollms_client/tts_bindings/piper_tts/server/install_piper.py,sha256=g71Ne2T18wAytOPipfQ9DNeTAOD9PrII5qC-vr9DtLA,3256
|
|
77
77
|
lollms_client/tts_bindings/piper_tts/server/main.py,sha256=DMozfSR1aCbrlmOXltRFjtXhYhXajsGcNKQjsWgRwZk,17402
|
|
78
78
|
lollms_client/tts_bindings/piper_tts/server/setup_voices.py,sha256=UdHaPa5aNcw8dR-aRGkZr2OfSFFejH79lXgfwT0P3ss,1964
|
|
79
|
-
lollms_client/tts_bindings/xtts/__init__.py,sha256=
|
|
80
|
-
lollms_client/tts_bindings/xtts/server/main.py,sha256=
|
|
79
|
+
lollms_client/tts_bindings/xtts/__init__.py,sha256=lTlExBPZ97FPaf9DoqxE4ilwwO5y88dPOHeRaR5BCnc,8002
|
|
80
|
+
lollms_client/tts_bindings/xtts/server/main.py,sha256=JYKUzg4qFOGW8O_QDb9ChEdhcPRSccdwOlR3q-kJX7I,12306
|
|
81
81
|
lollms_client/tts_bindings/xtts/server/setup_voices.py,sha256=UdHaPa5aNcw8dR-aRGkZr2OfSFFejH79lXgfwT0P3ss,1964
|
|
82
82
|
lollms_client/ttv_bindings/__init__.py,sha256=UZ8o2izQOJLQgtZ1D1cXoNST7rzqW22rL2Vufc7ddRc,3141
|
|
83
83
|
lollms_client/ttv_bindings/lollms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
84
|
-
lollms_client-1.6.
|
|
85
|
-
lollms_client-1.6.
|
|
86
|
-
lollms_client-1.6.
|
|
87
|
-
lollms_client-1.6.
|
|
88
|
-
lollms_client-1.6.
|
|
84
|
+
lollms_client-1.6.6.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
|
|
85
|
+
lollms_client-1.6.6.dist-info/METADATA,sha256=i6Gb5wKrXNF6OPUCz41s5YbpBY5HEvLdAD5a6ONZV84,76835
|
|
86
|
+
lollms_client-1.6.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
87
|
+
lollms_client-1.6.6.dist-info/top_level.txt,sha256=Bk_kz-ri6Arwsk7YG-T5VsRorV66uVhcHGvb_g2WqgE,14
|
|
88
|
+
lollms_client-1.6.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|