File size: 1,514 Bytes
1e7709f
c45f0d6
16153ee
9c9026a
1e7709f
a71355d
9c9026a
 
 
a71355d
c45f0d6
9c9026a
 
c45f0d6
16153ee
 
c45f0d6
 
 
 
 
 
587fe4f
16153ee
587fe4f
 
c45f0d6
587fe4f
1e7709f
c45f0d6
1e7709f
c45f0d6
587fe4f
c45f0d6
9c9026a
 
 
 
 
 
c45f0d6
 
 
9c9026a
c45f0d6
 
9c9026a
 
 
 
 
c45f0d6
9c9026a
c45f0d6
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import uuid
from pathlib import Path
from config import GROQ_TTS_API_KEY, GROQ_TTS_MODEL
from gtts import gTTS

def text_to_speech(
    text: str,
    voice: str = "en",
    fmt: str = "mp3",
) -> str:
    """
    Convert text to speech using gTTS (Google Translate, free).
    Only MP3 is supported.
    """
    if not GROQ_TTS_API_KEY:
        raise RuntimeError("GROQ_TTS_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_TTS_API_KEY}",
        "Content-Type": "application/json"
    }
    
    payload = {
        "model": GROQ_TTS_MODEL,
        "input": text.strip(),
        "voice": voice,
        "response_format": fmt
    }
    
    if not text or not text.strip():
        raise ValueError("Text cannot be empty")

    if fmt != "mp3":
        raise ValueError("Only MP3 format is supported by the free TTS backend")

    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

        # gTTS uses language codes; voice kept for compatibility.
        tts = gTTS(text=text.strip(), lang=voice or "en")
        tts.save(str(output_path))

        return str(output_path)

    except Exception as e:
        raise Exception(f"Unexpected error in text_to_speech: {str(e)}")