File size: 2,608 Bytes
ab709a8
03bbabb
 
ab709a8
 
 
 
03bbabb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab709a8
03bbabb
 
ab709a8
 
 
03bbabb
ab709a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
03bbabb
 
 
 
 
ab709a8
 
03bbabb
 
 
 
 
 
 
 
ab709a8
 
 
03bbabb
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
from fastapi import FastAPI, HTTPException, Response
from pydantic import BaseModel, Field
from typing import Optional
from elevenlabs import generate_speech

app = FastAPI()

VOICE_MAPPING = {
    "charlottee": "XB0fDUnXU5powFXDhCwa",
    "daniel": "onwK4e9ZLuTAKqWW03F9",
    "callum": "N2lVS1w4EtoT3dr4eOWO",
    "charlie": "IKne3meq5aSn9XLyUdCD",
    "clyde": "2EiwWnXFnvU5JabPnv8n",
    "dave": "CYw3kZ02Hs0563khs1Fj",
    "emily": "LcfcDJNUP1GQjkzn1xUU",
    "ethan": "g5CIjZEefAph4nQFvHAz",
    "fin": "D38z5RcWu1voky8WS1ja",
    "freya": "jsCqWAovK2LkecY7zXl4",
    "gigi": "jBpfuIE2acCO8z3wKNLl",
    "giovanni": "zcAOhNBS3c14rBihAFp1",
    "glinda": "z9fAnlkpzviPz146aGWa",
    "grace": "oWAxZDx7w5VEj9dCyTzz",
    "harry": "SOYHLrjzK2X1ezoPC6cr",
    "james": "ZQe5CZNOzWyzPSCn5a3c",
    "jeremy": "bVMeCyTHy58xNoL34h3p"
}

class SpeechRequest(BaseModel):
    model: Optional[str] = Field(default="eleven_multilingual_v2")
    input: str = Field(..., max_length=500)
    voice: str

@app.post("/v1/audio/speech")
@app.get("/v1/audio/speech")
async def create_speech(request: SpeechRequest):
    try:
        result = generate_speech(
            model=request.model,
            voice=request.voice,
            input_text=request.input
        )
        
        if isinstance(result, list):
            raise HTTPException(status_code=result[0], detail=result[1])
        
        return Response(content=result, media_type="audio/mpeg")
    
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.post("/v1/voices")
@app.get("/v1/voices")
async def get_voices():
    return {"voices": list(VOICE_MAPPING.keys())}

@app.get("/")
async def root():
    return {
        "message": "Welcome to the Elevenlabs Text-to-Speech API",
        "usage": "Send a POST or GET request to /v1/audio/speech with the following JSON body: {'model': 'eleven_multilingual_v2', 'input': 'Your text here', 'voice': 'voice_name'}",
        "openai_compatibility": "This API is designed to be compatible with OpenAI's text-to-speech endpoint structure.",
        "sample_url": "https://devsdocode-elevenlabs.hf.space/v1/audio/speech?model=eleven_multilingual_v2&input=Hello+world&voice=charlottee",
        "character_limit": "The API supports up to 500 characters at a time in the input text parameter.",
        "available_voices": "To get a list of available voices, send a POST or GET request to /v1/voices"
    }

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=7860)