Spaces:
Sleeping
Sleeping
# application/utils/text_to_speech.py - NEW FILE | |
import asyncio | |
import edge_tts | |
from aiohttp import web # Import aiohttp | |
async def generate_tts(text: str) -> bytes: | |
""" | |
Generates speech from text using edge-tts and returns the audio as a byte stream. | |
""" | |
try: | |
communicate = edge_tts.Communicate(text, "en-US-GuyNeural") # Or any other preferred voice | |
return await communicate.stream() | |
except Exception as e: | |
print(f"Error in TTS generation: {e}") | |
return b"" # Return empty bytes on error | |
async def tts_handler(request: web.Request) -> web.Response: | |
""" | |
aiohttp handler for the /tts endpoint. This is the correct way to handle | |
streaming with aiohttp (and thus edge-tts). | |
""" | |
text = request.query.get('text') | |
if not text: | |
return web.Response(status=400, text="No text provided") | |
try: | |
response = web.StreamResponse() | |
response.content_type = 'audio/mpeg' | |
await response.prepare(request) | |
async for chunk in generate_tts(text): | |
await response.write(chunk) | |
await response.write_eof() | |
return response | |
except Exception as e: | |
print(f"Error in TTS handler: {e}") | |
return web.Response(status=500, text=str(e)) |