File size: 6,775 Bytes
22004d7
29ea16c
22004d7
 
 
 
 
29ea16c
22004d7
 
503efd8
22004d7
503efd8
6dde081
503efd8
 
22004d7
 
 
503efd8
6dde081
503efd8
 
 
 
6da832b
22004d7
6da832b
22004d7
0837144
22004d7
 
503efd8
22004d7
503efd8
22004d7
503efd8
22004d7
503efd8
 
22004d7
503efd8
22004d7
 
 
503efd8
 
 
22004d7
 
 
 
503efd8
0837144
22004d7
 
0837144
22004d7
 
503efd8
0837144
22004d7
 
 
 
 
503efd8
22004d7
503efd8
22004d7
 
503efd8
0837144
503efd8
22004d7
 
 
 
 
 
 
 
 
 
 
 
 
 
29ea16c
503efd8
22004d7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
503efd8
22004d7
 
 
503efd8
22004d7
 
 
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# main.py
from fastapi import FastAPI, Query, HTTPException
from fastapi.responses import FileResponse
from gtts import gTTS, gTTSError  # Import gTTSError for specific error handling
import uuid
import os  # Import os module for path operations
import tempfile # Import tempfile for better temporary file handling

# --- Configuration ---
# Use tempfile to get a cross-platform temporary directory
TEMP_DIR = tempfile.gettempdir()
# Ensure the temporary directory exists
os.makedirs(TEMP_DIR, exist_ok=True)

# --- FastAPI App Initialization ---
app = FastAPI(
    title="gTTS API",
    description="A simple API to convert text to speech using Google Text-to-Speech (gTTS). Supports multiple languages including Tamil, Sinhala, and many others.",
    version="1.2.0", # Increment version for documentation changes
)

# --- API Endpoints ---

@app.get("/", tags=["General"])
def read_root():
    """
    Root endpoint providing a welcome message.
    """
    return {"message": "Welcome to the gTTS API. Use the /tts endpoint to generate speech."}

@app.get("/tts", tags=["Text-to-Speech"])
def text_to_speech(
    text: str = Query(
        ..., # Ellipsis makes the parameter required
        min_length=1,
        max_length=500, # Adjust max length as needed
        title="Text to Convert",
        description="The text you want to convert into speech (1-500 characters)."
    ),
    lang: str = Query(
        "en", # Default language is English
        min_length=2,
        max_length=10, # Allow for language codes like 'en-us', 'zh-CN' etc.
        title="Language Code",
        description="The BCP 47 language code for the speech synthesis (e.g., 'en', 'es', 'ta', 'si', 'ja', 'zh-CN'). See gTTS documentation for supported languages."
    )
):
    """
    Converts the provided text into an MP3 audio file using the specified language.

    - **text**: The text to synthesize (required).
    - **lang**: The language code (e.g., 'en', 'es', 'fr', 'ta', 'si'). Defaults to 'en'. **Crucially, gTTS must support this language code.**
    """
    try:
        # Generate a unique filename in the configured temporary directory
        filename = os.path.join(TEMP_DIR, f"{uuid.uuid4().hex}.mp3")

        # Create gTTS object with text and language
        # Use slow=False for normal speed speech
        tts_object = gTTS(text=text, lang=lang, slow=False)

        # Save the audio file
        tts_object.save(filename)

        # Return the audio file as a response
        # The 'filename' parameter sets the download name for the browser
        return FileResponse(
            path=filename,
            media_type="audio/mpeg",
            filename=f"speech_{lang}.mp3" # Suggest a filename like speech_en.mp3 or speech_ta.mp3
            # Consider adding background task for cleanup as mentioned in previous examples
        )

    except gTTSError as e:
        # Handle specific gTTS errors (like invalid language code, network issues)
        detail_message = f"gTTS Error: {str(e)}. Ensure the language code '{lang}' is supported and text is appropriate for the language."
        # Check common error patterns
        if "400 (Bad Request)" in str(e) or "Language not supported" in str(e):
             raise HTTPException(status_code=400, detail=detail_message)
        elif "500 (Internal Server Error)" in str(e) or "Failed to connect" in str(e):
             # Treat these as potential temporary Google service issues
             raise HTTPException(status_code=503, detail=f"Service Error: {str(e)}. Could be a temporary issue with the TTS service.")
        else: # Other gTTS errors
             raise HTTPException(status_code=503, detail=detail_message) # 503 Service Unavailable likely

    except ValueError as e:
        # Potentially handle other value errors if gTTS raises them for certain inputs
         raise HTTPException(status_code=400, detail=f"Input Error: {str(e)}")

    except Exception as e:
        # Catch any other unexpected errors
        # Log the error for debugging
        # import logging
        # logging.exception(f"An unexpected error occurred during TTS generation for lang='{lang}'")
        raise HTTPException(status_code=500, detail=f"Internal Server Error: An unexpected error occurred.")

# --- How to Run (Instructions) ---
# 1. Save this code as `main.py`.
# 2. Install necessary libraries:
#    pip install fastapi "uvicorn[standard]" gTTS
# 3. Run the FastAPI server using Uvicorn:
#    uvicorn main:app --reload
#
# --- How to Use - Examples ---
# Open your browser or use a tool like curl/Postman.
# Access the TTS endpoint with the 'text' and 'lang' query parameters.
# NOTE: Text containing non-ASCII characters needs to be URL-encoded. Most browsers do this automatically.
#
# - English (en - Default):
#   Text: "Hello, world!"
#   URL: http://127.0.0.1:8000/tts?text=Hello%2C%20world%21
#
# - Spanish (es):
#   Text: "Hola Mundo"
#   URL: http://127.0.0.1:8000/tts?text=Hola%20Mundo&lang=es
#
# - French (fr):
#   Text: "Bonjour le monde"
#   URL: http://127.0.0.1:8000/tts?text=Bonjour%20le%20monde&lang=fr
#
# - German (de):
#   Text: "Hallo Welt"
#   URL: http://127.0.0.1:8000/tts?text=Hallo%20Welt&lang=de
#
# - Tamil (ta):
#   Text: "வணக்கம் உலகம்"
#   URL: http://127.0.0.1:8000/tts?text=%E0%AE%B5%E0%AE%A3%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AE%AE%E0%AF%8D%20%E0%AE%89%E0%AE%B2%E0%AE%95%E0%AE%AE%E0%AF%8D&lang=ta
#
# - Sinhala (si):
#   Text: "හෙලෝ ලෝකය"
#   URL: http://127.0.0.1:8000/tts?text=%E0%B7%84%E0%B7%99%E0%B6%BD%E0%B7%9D%20%E0%B6%BD%E0%B7%9D%E0%B6%9A%E0%B6%BA&lang=si
#
# - Japanese (ja):
#   Text: "こんにちは世界"
#   URL: http://127.0.0.1:8000/tts?text=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E4%B8%96%E7%95%8C&lang=ja
#
# - Chinese (Mandarin, Simplified) (zh-CN):
#   Text: "你好世界"
#   URL: http://127.0.0.1:8000/tts?text=%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C&lang=zh-CN
#
# - Russian (ru):
#   Text: "Привет мир"
#   URL: http://127.0.0.1:8000/tts?text=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80&lang=ru
#
# - Hindi (hi):
#   Text: "नमस्ते दुनिया"
#   URL: http://127.0.0.1:8000/tts?text=%E0%A4%A8%E0%A4%AE%E0%A4%B8%E0%A5%8D%E0%A4%A4%E0%A5%87%20%E0%A4%A6%E0%A5%81%E0%A4%A8%E0%A4%BF%E0%A4%AF%E0%A4%BE&lang=hi
#
# - Arabic (ar):
#   Text: "مرحبا بالعالم"
#   URL: http://127.0.0.1:8000/tts?text=%D9%85%D8%B1%D8%AD%D8%A8%D8%A7%20%D8%A8%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%85&lang=ar
#
# Find more supported language codes in the gTTS documentation or common lists of BCP 47 codes.
# The API will return an MP3 file download or playback depending on your browser/client.
# If you provide an unsupported language code, you should get a 400 Bad Request error.