import io | |
import edge_tts | |
import asyncio | |
def get_voices(): | |
voices = asyncio.run(edge_tts.list_voices()) | |
return voices | |
async def _iterate_chunks(audio): | |
async for chunk in audio.stream(): | |
if chunk["type"] == "audio": | |
yield chunk["data"] | |
async def _async_generator_to_list(async_gen): | |
result = [] | |
async for item in async_gen: | |
result.append(item) | |
return result | |
def generate_audio(text: str, voice: str, rate: int) -> bytes: | |
sign = '+' if rate > 0 else '-' | |
rate = f'{sign}{abs(rate)}%' | |
audio = edge_tts.Communicate(text=text, voice=voice, rate=rate) | |
chunks = asyncio.run(_async_generator_to_list(_iterate_chunks(audio))) | |
buffer = io.BytesIO() | |
for chunk in chunks: | |
buffer.write(chunk) | |
return buffer.getvalue() | |