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.

@@ -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
- print("Server: Loading XTTS dependencies...")
22
+ ASCIIColors.info("Server: Loading XTTS dependencies...")
20
23
  import torch
21
- import torchaudio
22
24
  from TTS.api import TTS
23
- print("Server: XTTS dependencies loaded successfully")
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
- print(f"Server: Using device: {device}")
29
+ ASCIIColors.info(f"Server: Using device: {device}")
28
30
 
29
31
  xtts_available = True
30
32
 
31
33
  except Exception as e:
32
- print(f"Server: Failed to load XTTS dependencies: {e}")
33
- print(f"Server: Traceback:\n{traceback.format_exc()}")
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: Optional[str] = None
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
- # Don't initialize model here - do it lazily on first request
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
- print("Server: Loading XTTS model for the first time (this may take a few minutes)...")
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("tts_models/multilingual/multi-dataset/xtts_v2").to(device)
78
+ self.model = TTS(self.available_models[0]).to(device)
74
79
 
75
80
  self.model_loaded = True
76
- print("Server: XTTS model loaded successfully")
81
+ ASCIIColors.green("Server: XTTS model loaded successfully")
77
82
 
78
83
  except Exception as e:
79
- print(f"Server: Error loading XTTS model: {e}")
80
- print(f"Server: Traceback:\n{traceback.format_exc()}")
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
- # Look for voice files in voices directory
90
- voices_dir = Path(__file__).parent / "voices"
91
- voices = []
94
+ self.voices_dir.mkdir(exist_ok=True)
92
95
 
93
- if voices_dir.exists():
94
- # Look for WAV files in voices directory
95
- for voice_file in voices_dir.glob("*.wav"):
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
- # If no custom voices found, provide some default names
99
- if not voices:
100
- voices = ["default", "female", "male"]
101
-
102
- return voices
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
- print(f"Server: Error loading voices: {e}")
106
- return ["default"]
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
- async def generate_audio(self, text: str, voice: Optional[str] = None,
109
- language: str = "en", speaker_wav: Optional[str] = None) -> bytes:
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
- print(f"Server: Generating audio for: '{text[:50]}{'...' if len(text) > 50 else ''}'")
119
- print(f"Server: Using voice: {voice}, language: {language}")
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
- # Handle voice/speaker selection
122
- speaker_wav_path = None
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
- # First priority: use provided speaker_wav parameter
125
- if speaker_wav:
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
- # Second priority: check if voice parameter is a file path
130
- elif voice and voice != "default":
131
- if os.path.exists(voice):
132
- # Voice parameter is a full file path
133
- speaker_wav_path = voice
134
- print(f"Server: Using voice as file path: {speaker_wav_path}")
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
- try:
159
- # Generate audio using XTTS
160
- if speaker_wav_path and os.path.exists(speaker_wav_path):
161
- print(f"Server: Generating with speaker reference: {speaker_wav_path}")
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
- print(f"Server: Error generating audio: {e}")
202
- print(f"Server: Traceback:\n{traceback.format_exc()}")
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
- voices_dir = Path(__file__).parent / "voices"
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 thread-safe access
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 generate_audio(request: GenerationRequest):
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
- print(f"Server: ERROR in generate_audio endpoint: {e}")
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 list_voices():
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
- print(f"Server: ERROR in list_voices endpoint: {e}")
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 list_models():
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
- print(f"Server: ERROR in list_models endpoint: {e}")
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
- "model_loading": xtts_server.model_loading,
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 TTS Server")
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="96", help="Port to bind the server to.")
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
- print(f"Server: Starting XTTS server on {args.host}:{args.port}")
314
- print(f"Server: XTTS available: {xtts_available}")
315
- print(f"Server: Model will be loaded on first audio generation request")
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
- # Create voices directory if it doesn't exist
321
- voices_dir = Path(__file__).parent / "voices"
322
- voices_dir.mkdir(exist_ok=True)
323
- print(f"Server: Voices directory: {voices_dir}")
324
- try:
325
- uvicorn.run(app, host=args.host, port=args.port)
326
- except Exception as e:
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
- print(f"Server: CRITICAL ERROR during startup: {e}")
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lollms_client
3
- Version: 1.6.4
3
+ Version: 1.6.6
4
4
  Summary: A client library for LoLLMs generate endpoint
5
5
  Author-email: ParisNeo <parisneoai@gmail.com>
6
6
  License: Apache License
@@ -1,7 +1,7 @@
1
- lollms_client/__init__.py,sha256=gFkjENeiIoW_NasMfgSWPG65fsmlej9UM-3IkIhsxyI,1146
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=ls-AF3H_36Qil8kxz-dJL9QIGAID7meDt0Ft55Yt7b0,244761
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=0MHzC1Qr4wURLdlwEwMc4MRvJoJVqPLfobWkM_YspKg,14214
56
- lollms_client/tti_bindings/diffusers/server/main.py,sha256=BJHb24ZH8vMlba2SbMJgPDlHARJl3d44A1mcCcKjfPw,36346
57
- lollms_client/tti_bindings/gemini/__init__.py,sha256=tVVY7owy_VoYNUsDlAXzKrWKRHYO9t4TgwgkmFIKwAU,16708
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=ktIZawgvNTX9mICmbA2paOH9T76bupLPuDqW4zzOBMk,6504
80
- lollms_client/tts_bindings/xtts/server/main.py,sha256=zIGYd-1HQWjNMJ97LVIge6wU8fF5mA0LFK06nV-3mwQ,14905
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.4.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
85
- lollms_client-1.6.4.dist-info/METADATA,sha256=RQsL6d1AD7QxvGIFjBZIkPHcyTUnCa9YcirIQyefB34,76835
86
- lollms_client-1.6.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
87
- lollms_client-1.6.4.dist-info/top_level.txt,sha256=Bk_kz-ri6Arwsk7YG-T5VsRorV66uVhcHGvb_g2WqgE,14
88
- lollms_client-1.6.4.dist-info/RECORD,,
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,,