|
|
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)}") |