| import os | |
| import torch | |
| import gc | |
| from config import CACHE_DIR | |
| class ModelSingleton: | |
| _instance = None | |
| _model = None | |
| def __new__(cls): | |
| if cls._instance is None: | |
| cls._instance = super(ModelSingleton, cls).__new__(cls) | |
| return cls._instance | |
| def load_model(self): | |
| if self._model is not None: | |
| return self._model | |
| print("Initializing Chatterbox TTS Model (CPU Only)...") | |
| # Optimize for CPU | |
| torch.set_num_threads(max(1, os.cpu_count() - 1)) # Leave 1 thread for OS | |
| try: | |
| # We are using CPU strictly | |
| device = "cpu" | |
| model_path = os.path.join(CACHE_DIR, "chatterbox") | |
| # If not downloaded, download it | |
| if not os.path.exists(model_path): | |
| print("Model not found locally. Downloading now...") | |
| from download_model import download_model | |
| download_model() | |
| try: | |
| from chatterbox import ChatterboxTTS | |
| except ImportError: | |
| raise ImportError("Could not import chatterbox. Please run install.py") | |
| # Initialize ChatterboxTTS | |
| self._model = ChatterboxTTS.from_local(model_path, device=device) | |
| print("Model loaded successfully.") | |
| return self._model | |
| except Exception as e: | |
| print(f"Failed to load model: {e}") | |
| raise e | |
| def get_model(): | |
| return ModelSingleton().load_model() | |