Spaces:
Running
Running
| """ | |
| OpenAI client for Pip. | |
| Handles: GPT-4o image generation, Whisper speech-to-text. | |
| """ | |
| import os | |
| import base64 | |
| from typing import Optional | |
| from openai import AsyncOpenAI | |
| import httpx | |
| class OpenAIClient: | |
| """OpenAI-powered image generation and speech recognition for Pip.""" | |
| def __init__(self): | |
| self.client = AsyncOpenAI( | |
| api_key=os.getenv("OPENAI_API_KEY") | |
| ) | |
| async def generate_image(self, prompt: str, style: str = "vivid") -> Optional[str]: | |
| """ | |
| Generate an image using GPT-4o / DALL-E 3. | |
| Returns base64 encoded image or URL. | |
| """ | |
| if not self.available or not self.client: | |
| return None | |
| try: | |
| response = await self.client.images.generate( | |
| model="dall-e-3", | |
| prompt=prompt, | |
| size="1024x1024", | |
| quality="standard", | |
| style=style, # "vivid" or "natural" | |
| n=1, | |
| response_format="url" | |
| ) | |
| return response.data[0].url | |
| except Exception as e: | |
| print(f"OpenAI image generation error: {e}") | |
| return None | |
| async def transcribe_audio(self, audio_file_path: str) -> str: | |
| """ | |
| Transcribe audio using Whisper. | |
| """ | |
| if not self.available or not self.client: | |
| return "" | |
| try: | |
| with open(audio_file_path, "rb") as audio_file: | |
| response = await self.client.audio.transcriptions.create( | |
| model="whisper-1", | |
| file=audio_file, | |
| response_format="text" | |
| ) | |
| return response | |
| except Exception as e: | |
| print(f"Whisper transcription error: {e}") | |
| return "" | |
| async def transcribe_audio_bytes(self, audio_bytes: bytes, filename: str = "audio.wav") -> str: | |
| """ | |
| Transcribe audio from bytes using Whisper. | |
| """ | |
| if not self.available or not self.client: | |
| return "" | |
| try: | |
| # Create a file-like object from bytes | |
| response = await self.client.audio.transcriptions.create( | |
| model="whisper-1", | |
| file=(filename, audio_bytes), | |
| response_format="text" | |
| ) | |
| return response | |
| except Exception as e: | |
| print(f"Whisper transcription error: {e}") | |
| return "" | |
| async def download_image_as_base64(self, url: str) -> Optional[str]: | |
| """ | |
| Download an image from URL and convert to base64. | |
| """ | |
| try: | |
| async with httpx.AsyncClient() as client: | |
| response = await client.get(url) | |
| if response.status_code == 200: | |
| return base64.b64encode(response.content).decode('utf-8') | |
| except Exception as e: | |
| print(f"Image download error: {e}") | |
| return None | |