@@ -130,6 +130,9 @@ def load_model(self, device: str = None) -> bool:
130130 return True
131131 except DirectCSMError as e :
132132 logger .warning (f"Failed to load Direct CSM implementation: { e } " )
133+ if not config .DIRECT_CSM_FALLBACK_TO_STANDARD :
134+ logger .error ("Direct CSM fallback is disabled, failing" )
135+ raise RuntimeError (f"Failed to load Direct CSM and fallback is disabled: { e } " )
133136 logger .info ("Falling back to standard CSM model" )
134137 self .direct_csm = None
135138
@@ -161,6 +164,9 @@ def load_model(self, device: str = None) -> bool:
161164 return True
162165 except DirectCSMError as e :
163166 logger .warning (f"Failed to load Direct CSM implementation on CPU: { e } " )
167+ if not config .DIRECT_CSM_FALLBACK_TO_STANDARD :
168+ logger .error ("Direct CSM fallback is disabled, failing" )
169+ raise RuntimeError (f"Failed to load Direct CSM on CPU and fallback is disabled: { e } " )
164170 logger .info ("Falling back to standard CSM model on CPU" )
165171 self .direct_csm = None
166172
@@ -252,6 +258,7 @@ def generate(
252258 if self .direct_csm is not None :
253259 try :
254260 # Generate speech using direct CSM
261+ logger .info ("Using Direct CSM for voice generation" )
255262 audio , sample_rate = self .direct_csm .generate_speech (
256263 text = text ,
257264 speaker_id = speaker_id ,
@@ -277,12 +284,16 @@ def generate(
277284 return output_path , url
278285
279286 except DirectCSMError as e :
280- logger .warning (f"Direct CSM failed: { e } , falling back to standard CSM model" )
281- # Fall back to standard CSM model
287+ logger .warning (f"Direct CSM failed: { e } " )
288+ if not config .DIRECT_CSM_FALLBACK_TO_STANDARD :
289+ logger .error ("Direct CSM fallback is disabled, failing" )
290+ return None , None
291+ logger .info ("Falling back to standard CSM model" )
282292
283293 # If direct CSM failed or is not available, use the standard CSM model
284294 if self .model is not None :
285295 # Generate speech
296+ logger .info ("Using standard CSM model for voice generation" )
286297 audio , sample_rate = self .model .generate_speech (
287298 text = text ,
288299 speaker_id = speaker_id ,
@@ -309,77 +320,9 @@ def generate(
309320 else :
310321 logger .error ("No model available for voice generation" )
311322 return None , None
312-
323+
313324 except Exception as e :
314- logger .error (f"Error generating voice: { e } " )
315-
316- # Try again with CPU if we were using CUDA and it failed
317- if device == "cuda" or device == "auto" :
318- logger .info ("Attempting to fall back to CPU after error" )
319- try :
320- # Try direct CSM on CPU if available
321- if self .direct_csm is not None :
322- try :
323- # Generate speech using direct CSM on CPU
324- audio , sample_rate = self .direct_csm .generate_speech (
325- text = text ,
326- speaker_id = speaker_id ,
327- temperature = temperature ,
328- top_k = top_k ,
329- device = "cpu"
330- )
331-
332- # Save the audio
333- self .direct_csm .save_audio (audio , sample_rate , output_path )
334-
335- # Check if file was created
336- if not os .path .exists (output_path ):
337- logger .error (f"Output file not created: { output_path } " )
338- raise DirectCSMError ("Output file not created" )
339-
340- # Create URL for accessing the file
341- relative_path = os .path .relpath (output_path , self .output_dir )
342- url = f"/voices/{ relative_path } "
343-
344- logger .info (f"Voice generated successfully with Direct CSM on CPU: { output_path } " )
345- return output_path , url
346-
347- except DirectCSMError as cpu_e :
348- logger .warning (f"Direct CSM on CPU failed: { cpu_e } , falling back to standard CSM model on CPU" )
349-
350- # If direct CSM failed or is not available, use the standard CSM model on CPU
351- if self .model is not None :
352- # Generate speech on CPU
353- audio , sample_rate = self .model .generate_speech (
354- text = text ,
355- speaker_id = speaker_id ,
356- temperature = temperature ,
357- top_k = top_k ,
358- device = "cpu"
359- )
360-
361- # Save the audio
362- self .model .save_audio (audio , sample_rate , output_path )
363-
364- # Check if file was created
365- if not os .path .exists (output_path ):
366- logger .error (f"Output file not created: { output_path } " )
367- return None , None
368-
369- # Create URL for accessing the file
370- relative_path = os .path .relpath (output_path , self .output_dir )
371- url = f"/voices/{ relative_path } "
372-
373- logger .info (f"Voice generated successfully with standard CSM on CPU: { output_path } " )
374- return output_path , url
375- else :
376- logger .error ("No model available for voice generation on CPU" )
377- return None , None
378-
379- except Exception as cpu_e :
380- logger .error (f"Error generating voice on CPU: { cpu_e } " )
381- return None , None
382-
325+ logger .error (f"Error generating voice: { str (e )} " )
383326 return None , None
384327
385328 def list_available_voices (self ) -> List [Dict [str , Any ]]:
0 commit comments