diff --git a/README.md b/README.md index 53d71fb..5c9dfea 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,8 @@ In addition, it is required to use `--pitch=-10Hz` instead of `--pitch -10Hz` ot It is possible to use the `edge-tts` module directly from Python. For a list of example applications: -* https://github.com/rany2/edge-tts/blob/master/examples/input_example.py +* https://github.com/rany2/edge-tts/blob/master/examples/example.py +* https://github.com/rany2/edge-tts/blob/master/examples/dynamic_voice_selection.py * https://github.com/rany2/edge-tts/blob/master/src/edge_tts/util.py * https://github.com/rany2/edge-srt-to-speech/blob/master/src/edge_srt_to_speech/__main__.py * https://github.com/hasscc/hass-edge-tts/blob/main/custom_components/edge_tts/tts.py diff --git a/examples/dynamic_voice_selection.py b/examples/dynamic_voice_selection.py new file mode 100644 index 0000000..fb85a1c --- /dev/null +++ b/examples/dynamic_voice_selection.py @@ -0,0 +1,26 @@ +import asyncio +import edge_tts +from edge_tts import VoicesManager +import random + +async def main(): + """ + Main function + """ + voices = await VoicesManager.create() + voice = voices.find(Gender="Male", Language="es") + # Also supports Locales + # voice = voices.find(Gender="Female", Locale="es-AR") + VOICE = random.choice(voice)["ShortName"] + TEXT = "Hoy es un buen día." + OUTPUT_FILE = "spanish.mp3" + + communicate = edge_tts.Communicate() + + with open(OUTPUT_FILE, "wb") as f: + async for i in communicate.run(TEXT, voice=VOICE): + if i[2] is not None: + f.write(i[2]) + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/example.py b/examples/example.py new file mode 100644 index 0000000..14ce848 --- /dev/null +++ b/examples/example.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +""" +Example Python script that shows how to use edge-tts as a module +""" + +import asyncio +import edge_tts + +async def main(): + """ + Main function + """ + TEXT = "Hello World!" + VOICE = "en-GB-SoniaNeural" + OUTPUT_FILE = "test.mp3" + + communicate = edge_tts.Communicate() + with open(OUTPUT_FILE, "wb") as f: + async for i in communicate.run(TEXT, voice=VOICE): + if i[2] is not None: + f.write(i[2]) + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file diff --git a/examples/input_example.py b/examples/input_example.py deleted file mode 100755 index dacea62..0000000 --- a/examples/input_example.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 -""" -Example Python script that shows how to use edge-tts as a module -""" - -import asyncio -import tempfile - -from playsound import playsound - -import edge_tts - - -async def main(): - """ - Main function - """ - communicate = edge_tts.Communicate() - ask = input("What do you want TTS to say? ") - with tempfile.NamedTemporaryFile() as temporary_file: - async for i in communicate.run(ask): - if i[2] is not None: - temporary_file.write(i[2]) - playsound(temporary_file.name) - - -if __name__ == "__main__": - asyncio.get_event_loop().run_until_complete(main()) diff --git a/src/edge_tts/__init__.py b/src/edge_tts/__init__.py index 3880896..24b4e77 100644 --- a/src/edge_tts/__init__.py +++ b/src/edge_tts/__init__.py @@ -3,5 +3,5 @@ __init__ for edge_tts """ from .communicate import Communicate -from .list_voices import list_voices -from .submaker import SubMaker +from .list_voices import list_voices, VoicesManager +from .submaker import SubMaker \ No newline at end of file diff --git a/src/edge_tts/list_voices.py b/src/edge_tts/list_voices.py index 73bc6dc..f1d50a3 100644 --- a/src/edge_tts/list_voices.py +++ b/src/edge_tts/list_voices.py @@ -40,3 +40,29 @@ async def list_voices(proxy=None): ) as url: data = json.loads(await url.text()) return data + + +class VoicesManager: + """ + A class to find the correct voice based on their attributes. + """ + + @classmethod + async def create(cls): + self = VoicesManager() + self.voices = await list_voices() + self.voices = [ + {**voice, **{"Language": voice["Locale"].split("-")[0]}} + for voice in self.voices + ] + return self + + def find(self, **kwargs): + """ + Finds all matching voices based on the provided attributes. + """ + + matching_voices = [ + voice for voice in self.voices if kwargs.items() <= voice.items() + ] + return matching_voices