File size: 2,402 Bytes
d3fb87a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import random
import shutil
import os

import asyncio
import random

import edge_tts
from edge_tts import VoicesManager
import uuid
import shutil
# # How to use this api
# #!/usr/bin/env python3
# """
# Example of dynamic voice selection using VoicesManager.
# """
# import asyncio
# import random
# import edge_tts
# from edge_tts import VoicesManager
# TEXT = "Hoy es un buen día."
# OUTPUT_FILE = "spanish.mp3"
# async def amain() -> None:
#     """Main function"""
#     voices = await VoicesManager.create()
#     voice = voices.find(Gender="Male", Language="es")
#     # Also supports Locales
#     # voice = voices.find(Gender="Female", Locale="es-AR")
#     communicate = edge_tts.Communicate(TEXT, random.choice(voice)["Name"])
#     await communicate.save(OUTPUT_FILE)
# if __name__ == "__main__":
#     loop = asyncio.get_event_loop_policy().get_event_loop()
#     try:
#         loop.run_until_complete(amain())
#     finally:
#         loop.close()




class TTSTalker():
    def __init__(self, selected_voice, gender, language) -> None:
        self.selected_voice = selected_voice
        self.gender = gender
        self.language = language
        self.voice = asyncio.run(self.get_voice(gender, language))
        
    async def get_voice(self, gender, language):
        voices = await VoicesManager.create()
        voices = voices.find(Gender=gender, Language=language)
        voice = random.choice(voices)["Name"]
        return voice

    async def amain(self, text, file, voice) -> None:
        """Main function"""

        # Also supports Locales
        # voice = voices.find(Gender="Female", Locale="es-AR")
        communicate = edge_tts.Communicate(text, voice)
        await communicate.save(file)

        
    def test(self, text,  audio_path=None):
        if not os.path.exists(audio_path):
            os.mkdir(audio_path)
        voice_uuid = str(uuid.uuid4())[:5] + '.wav'
        audio_file = os.path.join(audio_path, voice_uuid)
        asyncio.run(self.amain(text, audio_file, self.voice))
        return audio_file

        
if __name__ == "__main__":
    audio_dir = 'test'
    tts_talker = TTSTalker('', 'Male', 'en').test('hello', audio_dir)
    tts_talker = TTSTalker('', 'Male', 'zh').test('hello', audio_dir)
    tts_talker = TTSTalker('', 'Female', 'en').test('hello',audio_dir)
    tts_talker = TTSTalker('', 'Female', 'zh').test('hello', audio_dir)