This pull request should solve the issue: https://github.com/rany2/edge-tts/issues/194
The implementation is a bit more complicated than the simplest asyncio.run() of the save and stream methods.
That's because I've wanted to use this synchronous interface in my Fastapi app, and simple asyncio.run() would give me errors that the event loop is alread running. That's because Fastapi is itself async, and I would run synchronous function inside async fastapi handler, and then from this synchronous function I wanted to call edge-tts generation. I've reproduced similar scenario in two example files: examples/sync_audio_generation_in_async_context.py and examples/sync_audio_stream_in_async_context.py.
I've roughly checked the performance of my solution and from what I've saw there should be no visible performance hit when using ThreadPoolExecutor instead of just asyncio.run().
This pull request should solve the issue: https://github.com/rany2/edge-tts/issues/194 The implementation is a bit more complicated than the simplest asyncio.run() of the save and stream methods. That's because I've wanted to use this synchronous interface in my Fastapi app, and simple asyncio.run() would give me errors that the event loop is alread running. That's because Fastapi is itself async, and I would run synchronous function inside async fastapi handler, and then from this synchronous function I wanted to call edge-tts generation. I've reproduced similar scenario in two example files: examples/sync_audio_generation_in_async_context.py and examples/sync_audio_stream_in_async_context.py. I've roughly checked the performance of my solution and from what I've saw there should be no visible performance hit when using ThreadPoolExecutor instead of just asyncio.run().