""" Template: Multi-Provider Factory Use this template to create a factory that supports multiple providers for transcription, LLM, and TTS services. """ from typing import Dict, Any from abc import ABC, abstractmethod import logging logger = logging.getLogger(__name__) # ============================================================================ # Provider Interfaces # ============================================================================ class TranscriberProvider(ABC): """Abstract base class for transcriber providers""" @abstractmethod async def transcribe_stream(self, audio_stream): """Transcribe streaming audio""" pass class LLMProvider(ABC): """Abstract base class for LLM providers""" @abstractmethod async def generate_response(self, messages, stream=True): """Generate response from messages""" pass class TTSProvider(ABC): """Abstract base class for TTS providers""" @abstractmethod async def synthesize_speech(self, text): """Synthesize speech from text""" pass # ============================================================================ # Multi-Provider Factory # ============================================================================ class VoiceComponentFactory: """ Factory for creating voice AI components with multiple provider support Supports: - Multiple transcription providers (Deepgram, AssemblyAI, Azure, Google) - Multiple LLM providers (OpenAI, Gemini, Claude) - Multiple TTS providers (ElevenLabs, Azure, Google, Polly, Play.ht) """ def __init__(self): self.transcriber_providers = { "deepgram": self._create_deepgram_transcriber, "assemblyai": self._create_assemblyai_transcriber, "azure": self._create_azure_transcriber, "google": self._create_google_transcriber, } self.llm_providers = { "openai": self._create_openai_agent, "gemini": self._create_gemini_agent, "claude": self._create_claude_agent, } self.tts_providers = { "elevenlabs": self._create_elevenlabs_synthesizer, "azure": self._create_azure_synthesizer, "google": self._create_google_synthesizer, "polly": self._create_polly_synthesizer, "playht": self._create_playht_synthesizer, } def create_transcriber(self, config: Dict[str, Any]): """ Create transcriber based on configuration Args: config: Configuration dict with 'transcriberProvider' key Returns: Transcriber instance Raises: ValueError: If provider is not supported """ provider = config.get("transcriberProvider", "deepgram").lower() if provider not in self.transcriber_providers: raise ValueError( f"Unknown transcriber provider: {provider}. " f"Supported: {list(self.transcriber_providers.keys())}" ) logger.info(f"🎤 Creating transcriber: {provider}") return self.transcriber_providers[provider](config) def create_agent(self, config: Dict[str, Any]): """ Create LLM agent based on configuration Args: config: Configuration dict with 'llmProvider' key Returns: Agent instance Raises: ValueError: If provider is not supported """ provider = config.get("llmProvider", "openai").lower() if provider not in self.llm_providers: raise ValueError( f"Unknown LLM provider: {provider}. " f"Supported: {list(self.llm_providers.keys())}" ) logger.info(f"🤖 Creating agent: {provider}") return self.llm_providers[provider](config) def create_synthesizer(self, config: Dict[str, Any]): """ Create TTS synthesizer based on configuration Args: config: Configuration dict with 'voiceProvider' key Returns: Synthesizer instance Raises: ValueError: If provider is not supported """ provider = config.get("voiceProvider", "elevenlabs").lower() if provider not in self.tts_providers: raise ValueError( f"Unknown voice provider: {provider}. " f"Supported: {list(self.tts_providers.keys())}" ) logger.info(f"🔊 Creating synthesizer: {provider}") return self.tts_providers[provider](config) # ======================================================================== # Transcriber Implementations # ======================================================================== def _create_deepgram_transcriber(self, config: Dict[str, Any]): """Create Deepgram transcriber""" # TODO: Implement Deepgram transcriber # from .transcribers.deepgram import DeepgramTranscriber # return DeepgramTranscriber( # api_key=config.get("deepgramApiKey"), # model=config.get("deepgramModel", "nova-2"), # language=config.get("language", "en-US") # ) raise NotImplementedError("Deepgram transcriber not implemented") def _create_assemblyai_transcriber(self, config: Dict[str, Any]): """Create AssemblyAI transcriber""" # TODO: Implement AssemblyAI transcriber raise NotImplementedError("AssemblyAI transcriber not implemented") def _create_azure_transcriber(self, config: Dict[str, Any]): """Create Azure Speech transcriber""" # TODO: Implement Azure transcriber raise NotImplementedError("Azure transcriber not implemented") def _create_google_transcriber(self, config: Dict[str, Any]): """Create Google Cloud Speech transcriber""" # TODO: Implement Google transcriber raise NotImplementedError("Google transcriber not implemented") # ======================================================================== # LLM Agent Implementations # ======================================================================== def _create_openai_agent(self, config: Dict[str, Any]): """Create OpenAI agent""" # TODO: Implement OpenAI agent # from .agents.openai import OpenAIAgent # return OpenAIAgent( # api_key=config.get("openaiApiKey"), # model=config.get("openaiModel", "gpt-4"), # system_prompt=config.get("prompt", "You are a helpful assistant.") # ) raise NotImplementedError("OpenAI agent not implemented") def _create_gemini_agent(self, config: Dict[str, Any]): """Create Google Gemini agent""" # TODO: Implement Gemini agent # from .agents.gemini import GeminiAgent # return GeminiAgent( # api_key=config.get("geminiApiKey"), # model=config.get("geminiModel", "gemini-pro"), # system_prompt=config.get("prompt", "You are a helpful assistant.") # ) raise NotImplementedError("Gemini agent not implemented") def _create_claude_agent(self, config: Dict[str, Any]): """Create Anthropic Claude agent""" # TODO: Implement Claude agent raise NotImplementedError("Claude agent not implemented") # ======================================================================== # TTS Synthesizer Implementations # ======================================================================== def _create_elevenlabs_synthesizer(self, config: Dict[str, Any]): """Create ElevenLabs synthesizer""" # TODO: Implement ElevenLabs synthesizer # from .synthesizers.elevenlabs import ElevenLabsSynthesizer # return ElevenLabsSynthesizer( # api_key=config.get("elevenlabsApiKey"), # voice_id=config.get("elevenlabsVoiceId"), # model_id=config.get("elevenlabsModel", "eleven_monolingual_v1") # ) raise NotImplementedError("ElevenLabs synthesizer not implemented") def _create_azure_synthesizer(self, config: Dict[str, Any]): """Create Azure TTS synthesizer""" # TODO: Implement Azure synthesizer raise NotImplementedError("Azure synthesizer not implemented") def _create_google_synthesizer(self, config: Dict[str, Any]): """Create Google Cloud TTS synthesizer""" # TODO: Implement Google synthesizer raise NotImplementedError("Google synthesizer not implemented") def _create_polly_synthesizer(self, config: Dict[str, Any]): """Create Amazon Polly synthesizer""" # TODO: Implement Polly synthesizer raise NotImplementedError("Polly synthesizer not implemented") def _create_playht_synthesizer(self, config: Dict[str, Any]): """Create Play.ht synthesizer""" # TODO: Implement Play.ht synthesizer raise NotImplementedError("Play.ht synthesizer not implemented") # ============================================================================ # Example Usage # ============================================================================ def example_usage(): """Example of how to use the factory""" # Configuration config = { "transcriberProvider": "deepgram", "deepgramApiKey": "your-api-key", "llmProvider": "gemini", "geminiApiKey": "your-api-key", "voiceProvider": "elevenlabs", "elevenlabsApiKey": "your-api-key", "elevenlabsVoiceId": "your-voice-id", "prompt": "You are a helpful AI assistant." } # Create factory factory = VoiceComponentFactory() try: # Create components transcriber = factory.create_transcriber(config) agent = factory.create_agent(config) synthesizer = factory.create_synthesizer(config) print("✅ All components created successfully!") except ValueError as e: print(f"❌ Configuration error: {e}") except NotImplementedError as e: print(f"⚠️ Not implemented: {e}") if __name__ == "__main__": logging.basicConfig(level=logging.INFO) example_usage()