File size: 4,463 Bytes
32989ce
 
 
200d685
 
 
 
 
 
 
d8bf43a
0d7df26
c4ed5be
200d685
32989ce
1c49e44
c4ed5be
f259f51
32989ce
200d685
32989ce
c4ed5be
 
 
0d7df26
 
b407c2c
0d7df26
32989ce
 
 
1c49e44
 
 
6ab5444
1c49e44
f259f51
200d685
1c49e44
c4ed5be
32989ce
 
 
 
 
 
 
 
1c49e44
 
 
 
 
200d685
f259f51
 
 
 
 
 
 
 
 
200d685
d8bf43a
 
 
 
 
f259f51
 
 
 
200d685
d8bf43a
 
 
 
 
 
f259f51
 
 
 
 
 
 
 
1c49e44
5b595ef
 
 
200d685
 
5b595ef
 
32989ce
 
 
0d7df26
 
c4ed5be
 
 
d0a7224
 
c4ed5be
 
 
 
 
 
 
0d7df26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b407c2c
 
 
 
 
 
 
 
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
from fastapi import APIRouter


from .Schemas import (
    StatusRequest,
    TTSGenerateRequest,
    HeyGenTTSRequest,
    DescriptRequest,
    DescriptStatusRequest,
    DescriptSfxRequest,
    DescriptTranscript,
    PiTTSRequest,
    CharacterTTSRequest,
)
from .utils.Podcastle import PodcastleAPI
from .utils.HeyGen import HeygenAPI
from .utils.CharacterAi import CharacterTTS
from .utils.Descript import DescriptTTS
import os
import asyncio

# from .utils.Pi import PiAIClient

from fastapi import Request, HTTPException
from fastapi.responses import StreamingResponse, FileResponse
import os
import aiofiles

tts_router = APIRouter(tags=["TTS"])
data = {"username": os.environ.get("USERNAME"), "password": os.environ.get("PASSWORD")}
tts = PodcastleAPI(**data)
data = {
    "account": os.environ.get("HEYGEN_USERNAME"),
    "password": os.environ.get("HEYGEN_PASSWORD"),
    "token": os.environ.get("HEYGEN_TOKEN"),
}

descript_tts = DescriptTTS()
heyGentts = HeygenAPI(**data)
# pi = PiAIClient(headless=True)


@tts_router.post("/generate_tts")
async def generate_voice(req: TTSGenerateRequest):
    print("here --entered!")
    return await tts.make_request(req)


@tts_router.post("/heygen_tts")
async def generate_heygen_voice(req: HeyGenTTSRequest):
    print("hey gen here")
    return await heyGentts.tts_request(req)


@tts_router.post("/descript_tts")
async def generate_descript_voice(req: DescriptRequest):
    return await descript_tts.overdub_text(**req.__dict__)


@tts_router.post("/descript_status")
async def status_descript(req: DescriptStatusRequest):
    return await descript_tts.request_status(req.id)


@tts_router.post("/descript_music")
async def descript_music(req: DescriptSfxRequest):
    return await descript_tts.search_music(req.query)


@tts_router.post("/descript_sfx")
async def descript_sfx(req: DescriptSfxRequest):
    return await descript_tts.search_sound_effects(req.query)


@tts_router.post("/descript_transcript")
async def descript_transcript(req: DescriptTranscript):
    return await descript_tts.get_transcription(req)
    # return await descript_tts.search_sound_effects(req.query)


@tts_router.post("/descript_unsplash")
async def descript_unsplash(req: DescriptSfxRequest):
    return await descript_tts.search_unsplash_images(req.query)


@tts_router.get("/descript_voices")
async def voices_descript():
    return await descript_tts.get_voices()


@tts_router.get("/descript_auto_refresh")
async def auto_refresh():
    asyncio.create_task(descript_tts.start_token_refresh_schedule())
    return {"message": "Token refresh schedule started in the background."}


@tts_router.post("/status")
async def search_id(req: StatusRequest):
    return await tts.check_status(req)


@tts_router.post("/cai_tts")
async def cai_tts(req: CharacterTTSRequest):
    cai = CharacterTTS()
    url = await cai.say(req)
    return {"audio": url}


# @tts_router.post("/pi_tts")
# async def pi_tts(req: PiTTSRequest):
#     if not pi.initialized:
#         await pi.setup()
#     return await pi.say(req.text, voice=req.voice)


@tts_router.get("/audio/{audio_name}")
async def serve_audio(request: Request, audio_name: str):
    audio_directory = "/tmp/Audio"
    audio_path = os.path.join(audio_directory, audio_name)
    if not os.path.isfile(audio_path):
        raise HTTPException(status_code=404, detail="Audio not found")

    range_header = request.headers.get("Range", None)
    audio_size = os.path.getsize(audio_path)

    if range_header:
        start, end = range_header.strip().split("=")[1].split("-")
        start = int(start)
        end = audio_size if end == "" else int(end)

        headers = {
            "Content-Range": f"bytes {start}-{end}/{audio_size}",
            "Accept-Ranges": "bytes",
            # Optionally, you might want to force download by uncommenting the next line:
            # "Content-Disposition": f"attachment; filename={audio_name}",
        }

        content = read_file_range(audio_path, start, end)
        return StreamingResponse(content, media_type="audio/mpeg", headers=headers)

    return FileResponse(audio_path, media_type="audio/mpeg")


async def read_file_range(path, start, end):
    async with aiofiles.open(path, "rb") as file:
        await file.seek(start)
        while True:
            data = await file.read(1024 * 1024)  # read in chunks of 1MB
            if not data or await file.tell() > end:
                break
            yield data