Spaces:
Running
Running
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. |