marks
commited on
Commit
·
4145430
1
Parent(s):
a7eb60c
Updated
Browse files- api_clients.py +11 -16
- models.py +4 -0
api_clients.py
CHANGED
|
@@ -5,7 +5,7 @@ import elevenlabs
|
|
| 5 |
import time
|
| 6 |
from contextlib import asynccontextmanager
|
| 7 |
from logger import setup_logger, log_execution_time, log_async_execution_time
|
| 8 |
-
from models import OpenRouterModel
|
| 9 |
|
| 10 |
logger = setup_logger("api_clients")
|
| 11 |
|
|
@@ -159,15 +159,13 @@ Focus on making it engaging and natural to listen to."""
|
|
| 159 |
async with self.get_session() as session:
|
| 160 |
async with session.post(
|
| 161 |
f"{self.base_url}/chat/completions",
|
| 162 |
-
json=
|
| 163 |
) as response:
|
| 164 |
-
|
| 165 |
-
error_text = await response.text()
|
| 166 |
-
logger.error(f"OpenRouter API error: {error_text}")
|
| 167 |
-
raise ValueError(f"API request failed: {error_text}")
|
| 168 |
-
|
| 169 |
data = await response.json()
|
| 170 |
-
|
|
|
|
|
|
|
| 171 |
|
| 172 |
except Exception as e:
|
| 173 |
logger.error(f"Script generation failed", exc_info=True)
|
|
@@ -188,17 +186,14 @@ class ElevenLabsClient:
|
|
| 188 |
"""
|
| 189 |
try:
|
| 190 |
voices = elevenlabs.voices()
|
| 191 |
-
return [(
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
(f" - {voice.description[:50]}..." if voice.description else ""),
|
| 195 |
-
voice.voice_id # Value (hidden from user)
|
| 196 |
-
) for voice in voices]
|
| 197 |
except Exception as e:
|
| 198 |
logger.error("Failed to fetch voices from ElevenLabs", exc_info=True)
|
| 199 |
raise
|
| 200 |
|
| 201 |
-
def generate_audio(self, text: str, voice_id: str):
|
| 202 |
"""Generate audio synchronously"""
|
| 203 |
logger.info(f"Starting audio generation with voice: {voice_id}")
|
| 204 |
logger.debug(f"Input text length: {len(text)} chars")
|
|
@@ -208,7 +203,7 @@ class ElevenLabsClient:
|
|
| 208 |
|
| 209 |
try:
|
| 210 |
start_time = time.time()
|
| 211 |
-
audio = elevenlabs.generate(
|
| 212 |
text=text,
|
| 213 |
voice=voice_id,
|
| 214 |
model="eleven_monolingual_v1"
|
|
|
|
| 5 |
import time
|
| 6 |
from contextlib import asynccontextmanager
|
| 7 |
from logger import setup_logger, log_execution_time, log_async_execution_time
|
| 8 |
+
from models import OpenRouterModel, OpenRouterRequest, OpenRouterResponse, Message
|
| 9 |
|
| 10 |
logger = setup_logger("api_clients")
|
| 11 |
|
|
|
|
| 159 |
async with self.get_session() as session:
|
| 160 |
async with session.post(
|
| 161 |
f"{self.base_url}/chat/completions",
|
| 162 |
+
json=request.dict()
|
| 163 |
) as response:
|
| 164 |
+
response.raise_for_status()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
data = await response.json()
|
| 166 |
+
router_response = OpenRouterResponse(**data)
|
| 167 |
+
logger.debug(f"Generated script length: {len(router_response.choices[0].message.content)} chars")
|
| 168 |
+
return router_response.choices[0].message.content
|
| 169 |
|
| 170 |
except Exception as e:
|
| 171 |
logger.error(f"Script generation failed", exc_info=True)
|
|
|
|
| 186 |
"""
|
| 187 |
try:
|
| 188 |
voices = elevenlabs.voices()
|
| 189 |
+
return [(voice.voice_id, f"{voice.name} ({voice.labels.get('accent', 'No accent')})" +
|
| 190 |
+
(f" - {voice.description[:50]}..." if voice.description else ""))
|
| 191 |
+
for voice in voices]
|
|
|
|
|
|
|
|
|
|
| 192 |
except Exception as e:
|
| 193 |
logger.error("Failed to fetch voices from ElevenLabs", exc_info=True)
|
| 194 |
raise
|
| 195 |
|
| 196 |
+
async def generate_audio(self, text: str, voice_id: str):
|
| 197 |
"""Generate audio synchronously"""
|
| 198 |
logger.info(f"Starting audio generation with voice: {voice_id}")
|
| 199 |
logger.debug(f"Input text length: {len(text)} chars")
|
|
|
|
| 203 |
|
| 204 |
try:
|
| 205 |
start_time = time.time()
|
| 206 |
+
audio = await elevenlabs.generate(
|
| 207 |
text=text,
|
| 208 |
voice=voice_id,
|
| 209 |
model="eleven_monolingual_v1"
|
models.py
CHANGED
|
@@ -10,9 +10,13 @@ class OpenRouterRequest(BaseModel):
|
|
| 10 |
messages: List[Message]
|
| 11 |
|
| 12 |
class OpenRouterChoice(BaseModel):
|
|
|
|
| 13 |
message: Message
|
|
|
|
| 14 |
|
| 15 |
class OpenRouterResponse(BaseModel):
|
|
|
|
|
|
|
| 16 |
choices: List[OpenRouterChoice]
|
| 17 |
|
| 18 |
class OpenRouterModel(BaseModel):
|
|
|
|
| 10 |
messages: List[Message]
|
| 11 |
|
| 12 |
class OpenRouterChoice(BaseModel):
|
| 13 |
+
index: int = 0
|
| 14 |
message: Message
|
| 15 |
+
finish_reason: Optional[str] = None
|
| 16 |
|
| 17 |
class OpenRouterResponse(BaseModel):
|
| 18 |
+
id: str
|
| 19 |
+
model: str
|
| 20 |
choices: List[OpenRouterChoice]
|
| 21 |
|
| 22 |
class OpenRouterModel(BaseModel):
|