mirror of
https://github.com/denizsafak/abogen.git
synced 2026-09-20 19:50:59 +02:00
feat: add TTSBackendRegistry for backend registration and creation
- TTSBackendRegistry class with register(), list_backends(), get_metadata(), create_backend() - Global registry singleton with register_backend() and create_backend() convenience functions - Unit tests for registry operations
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
"""
|
||||
TTS Backend Registry
|
||||
|
||||
Provides a global registry for TTS backend factories.
|
||||
Backends register themselves with metadata and a factory callable.
|
||||
The registry is universal and does not know about backend constructors.
|
||||
"""
|
||||
|
||||
from typing import Callable, Any
|
||||
|
||||
from abogen.tts_backend import TTSBackend, TTSBackendMetadata
|
||||
|
||||
|
||||
class TTSBackendRegistry:
|
||||
"""Registry of TTS backend factories.
|
||||
|
||||
Stores metadata and factory callables for registered backends.
|
||||
"""
|
||||
|
||||
def __init__(self) -> None:
|
||||
self._backends: dict[str, TTSBackendMetadata] = {}
|
||||
self._factories: dict[str, Callable[..., TTSBackend]] = {}
|
||||
|
||||
def register(
|
||||
self,
|
||||
metadata: TTSBackendMetadata,
|
||||
factory: Callable[..., TTSBackend],
|
||||
) -> None:
|
||||
"""Register a backend with its metadata and factory callable."""
|
||||
self._backends[metadata.id] = metadata
|
||||
self._factories[metadata.id] = factory
|
||||
|
||||
def list_backends(self) -> list[TTSBackendMetadata]:
|
||||
"""Return metadata for all registered backends."""
|
||||
return list(self._backends.values())
|
||||
|
||||
def get_metadata(self, backend_id: str) -> TTSBackendMetadata:
|
||||
"""Get metadata for a specific backend.
|
||||
|
||||
Raises:
|
||||
KeyError: If backend with given id is not registered.
|
||||
"""
|
||||
if backend_id not in self._backends:
|
||||
raise KeyError(f"Unknown backend: {backend_id}")
|
||||
return self._backends[backend_id]
|
||||
|
||||
def create_backend(self, backend_id: str, **kwargs: Any) -> TTSBackend:
|
||||
"""Create a backend instance by id.
|
||||
|
||||
Raises:
|
||||
KeyError: If backend with given id is not registered.
|
||||
"""
|
||||
if backend_id not in self._factories:
|
||||
raise KeyError(f"Unknown backend: {backend_id}")
|
||||
return self._factories[backend_id](**kwargs)
|
||||
|
||||
|
||||
_registry = TTSBackendRegistry()
|
||||
|
||||
|
||||
def register_backend(
|
||||
metadata: TTSBackendMetadata,
|
||||
factory: Callable[..., TTSBackend],
|
||||
) -> None:
|
||||
"""Register a TTS backend in the global registry."""
|
||||
_registry.register(metadata, factory)
|
||||
|
||||
|
||||
def create_backend(backend_id: str, **kwargs: Any) -> TTSBackend:
|
||||
"""Create a TTS backend instance by provider id."""
|
||||
return _registry.create_backend(backend_id, **kwargs)
|
||||
Reference in New Issue
Block a user