Ctrl K
ComunidadGuías…

rex/compat.py

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Compatibility shims for third-party library incompatibilities.

This module patches known issues between library versions used in Rex.
Call :func:`ensure_transformers_compatibility` before importing libraries that
expect legacy transformers exports (e.g., Coqui TTS).
"""

from __future__ import annotations

import sys


def ensure_transformers_compatibility() -> None:
    """Ensure transformers compatibility with Coqui TTS.

    Coqui TTS 0.22.0 tries to import BeamSearchScorer from transformers,
    but transformers 4.57.3 moved it to transformers.generation.
    This shim makes it available at the old location.
    """
    try:
        import transformers

        # Check if BeamSearchScorer is already available (might be an older version)
        if hasattr(transformers, "BeamSearchScorer"):
            return

        # Try multiple import locations (transformers has moved it around in different versions)
        BeamSearchScorer = None

        # Try transformers.generation.beam_search (4.38+)
        try:
            from transformers.generation.beam_search import BeamSearchScorer
        except (ImportError, AttributeError):
            pass

        # Try transformers.generation (older 4.x versions)
        if BeamSearchScorer is None:
            try:
                from transformers.generation import BeamSearchScorer
            except (ImportError, AttributeError):
                pass

        # Try transformers.generation_utils (very old versions)
        if BeamSearchScorer is None:
            try:
                from transformers.generation_utils import BeamSearchScorer
            except (ImportError, AttributeError):
                pass

        if BeamSearchScorer is None:
            # Couldn't find it anywhere, give up
            return

        # Patch it into the transformers module namespace (multiple methods for robustness)
        transformers.BeamSearchScorer = BeamSearchScorer
        transformers.__dict__["BeamSearchScorer"] = BeamSearchScorer

        # Also patch it into sys.modules['transformers'] to ensure it's visible to all imports
        if "transformers" in sys.modules:
            sys.modules["transformers"].BeamSearchScorer = BeamSearchScorer
            sys.modules["transformers"].__dict__["BeamSearchScorer"] = BeamSearchScorer

    except (ImportError, AttributeError):
        # If transformers isn't installed or BeamSearchScorer doesn't exist,
        # skip the patch - TTS will fail later with a clearer error
        pass


__all__ = ["ensure_transformers_compatibility"]