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