rex/compat.py
Rama master · réplica de lectura del repositorio original.
"""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"]