290 lines
10 KiB
Python
290 lines
10 KiB
Python
"""
|
|
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()
|