# 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))