| import requests |
| import uuid |
| import os |
| from pathlib import Path |
| from config import GROQ_API_KEY, GROQ_TTS_MODEL |
|
|
| def text_to_speech( |
| text: str, |
| voice: str = "Aaliyah-PlayAI", |
| fmt: str = "wav" |
| ) -> str: |
| """ |
| Convert text to speech using Groq's TTS API (English only) |
| """ |
| if not GROQ_API_KEY: |
| raise RuntimeError("GROQ_API_KEY is not set in config") |
| |
| if not text or not text.strip(): |
| raise ValueError("Text cannot be empty") |
| |
| url = "https://api.groq.com/openai/v1/audio/speech" |
| |
| headers = { |
| "Authorization": f"Bearer {GROQ_API_KEY}", |
| "Content-Type": "application/json" |
| } |
| |
| payload = { |
| "model": GROQ_TTS_MODEL, |
| "input": text.strip(), |
| "voice": voice, |
| "response_format": fmt |
| } |
| |
| try: |
| |
| temp_dir = Path("temp_audio") |
| temp_dir.mkdir(exist_ok=True) |
| |
| |
| output_filename = f"tts_{uuid.uuid4().hex[:8]}.{fmt}" |
| output_path = temp_dir / output_filename |
| |
| |
| response = requests.post(url, headers=headers, json=payload, timeout=30) |
| response.raise_for_status() |
| |
| |
| with open(output_path, "wb") as f: |
| f.write(response.content) |
| |
| return str(output_path) |
| |
| except requests.exceptions.RequestException as e: |
| raise Exception(f"Groq TTS API error: {str(e)}") |
| except Exception as e: |
| raise Exception(f"Unexpected error in text_to_speech: {str(e)}") |