Skip to content

Commit eeac235

Browse files
committed
add edgetts
1 parent afde27a commit eeac235

File tree

3 files changed

+358
-1
lines changed

3 files changed

+358
-1
lines changed

edgetts/tts.py

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import asyncio
2+
import random
3+
import sys
4+
5+
import edge_tts
6+
from edge_tts import VoicesManager
7+
from langdetect import DetectorFactory, detect
8+
9+
DetectorFactory.seed = 0
10+
11+
TEXT = sys.argv[1]
12+
LANG = detect(TEXT) if sys.argv[2] == "Auto" else sys.argv[2]
13+
RATE = sys.argv[3]
14+
VOLUME = sys.argv[4]
15+
GENDER = sys.argv[5]
16+
OUTPUT_FILE = sys.argv[6]
17+
18+
print("Running TTS...")
19+
print(f"Text: {TEXT}, Language: {LANG}, Gender: {GENDER}, Rate: {RATE}, Volume: {VOLUME}")
20+
21+
async def _main() -> None:
22+
voices = await VoicesManager.create()
23+
if GENDER is not None:
24+
# From "zh-cn" to "zh-CN" etc.
25+
if LANG == "zh-cn" or LANG == "zh-tw":
26+
LOCALE = LANG[:-2] + LANG[-2:].upper()
27+
voice = voices.find(Gender=GENDER, Locale=LOCALE)
28+
else:
29+
voice = voices.find(Gender=GENDER, Language=LANG)
30+
# VOICE = random.choice(voice)["Name"]
31+
VOICE = voice[0]['Name'] # 固定一个声线
32+
print(f"Using random {LANG} voice: {VOICE}")
33+
else:
34+
VOICE = LANG
35+
36+
communicate = edge_tts.Communicate(text = TEXT, voice = VOICE, rate = RATE, volume = VOLUME)
37+
await communicate.save(OUTPUT_FILE)
38+
39+
if __name__ == "__main__":
40+
if sys.platform.startswith("win"):
41+
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
42+
asyncio.run(_main())
43+
else:
44+
loop = asyncio.get_event_loop_policy().get_event_loop()
45+
try:
46+
loop.run_until_complete(_main())
47+
finally:
48+
loop.close()

edgetts/tts_voices.py

+306
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,306 @@
1+
#List of Supported Voices for edge_TTS
2+
SUPPORTED_VOICES = {
3+
'zh-CN-XiaoxiaoNeural': 'zh-CN',
4+
'zh-CN-XiaoyiNeural': 'zh-CN',
5+
'zh-CN-YunjianNeural': 'zh-CN',
6+
'zh-CN-YunxiNeural': 'zh-CN',
7+
'zh-CN-YunxiaNeural': 'zh-CN',
8+
'zh-CN-YunyangNeural': 'zh-CN',
9+
'zh-HK-HiuGaaiNeural': 'zh-HK',
10+
'zh-HK-HiuMaanNeural': 'zh-HK',
11+
'zh-HK-WanLungNeural': 'zh-HK',
12+
'zh-TW-HsiaoChenNeural': 'zh-TW',
13+
'zh-TW-YunJheNeural': 'zh-TW',
14+
'zh-TW-HsiaoYuNeural': 'zh-TW',
15+
'af-ZA-AdriNeural': 'af-ZA',
16+
'af-ZA-WillemNeural': 'af-ZA',
17+
'am-ET-AmehaNeural': 'am-ET',
18+
'am-ET-MekdesNeural': 'am-ET',
19+
'ar-AE-FatimaNeural': 'ar-AE',
20+
'ar-AE-HamdanNeural': 'ar-AE',
21+
'ar-BH-AliNeural': 'ar-BH',
22+
'ar-BH-LailaNeural': 'ar-BH',
23+
'ar-DZ-AminaNeural': 'ar-DZ',
24+
'ar-DZ-IsmaelNeural': 'ar-DZ',
25+
'ar-EG-SalmaNeural': 'ar-EG',
26+
'ar-EG-ShakirNeural': 'ar-EG',
27+
'ar-IQ-BasselNeural': 'ar-IQ',
28+
'ar-IQ-RanaNeural': 'ar-IQ',
29+
'ar-JO-SanaNeural': 'ar-JO',
30+
'ar-JO-TaimNeural': 'ar-JO',
31+
'ar-KW-FahedNeural': 'ar-KW',
32+
'ar-KW-NouraNeural': 'ar-KW',
33+
'ar-LB-LaylaNeural': 'ar-LB',
34+
'ar-LB-RamiNeural': 'ar-LB',
35+
'ar-LY-ImanNeural': 'ar-LY',
36+
'ar-LY-OmarNeural': 'ar-LY',
37+
'ar-MA-JamalNeural': 'ar-MA',
38+
'ar-MA-MounaNeural': 'ar-MA',
39+
'ar-OM-AbdullahNeural': 'ar-OM',
40+
'ar-OM-AyshaNeural': 'ar-OM',
41+
'ar-QA-AmalNeural': 'ar-QA',
42+
'ar-QA-MoazNeural': 'ar-QA',
43+
'ar-SA-HamedNeural': 'ar-SA',
44+
'ar-SA-ZariyahNeural': 'ar-SA',
45+
'ar-SY-AmanyNeural': 'ar-SY',
46+
'ar-SY-LaithNeural': 'ar-SY',
47+
'ar-TN-HediNeural': 'ar-TN',
48+
'ar-TN-ReemNeural': 'ar-TN',
49+
'ar-YE-MaryamNeural': 'ar-YE',
50+
'ar-YE-SalehNeural': 'ar-YE',
51+
'az-AZ-BabekNeural': 'az-AZ',
52+
'az-AZ-BanuNeural': 'az-AZ',
53+
'bg-BG-BorislavNeural': 'bg-BG',
54+
'bg-BG-KalinaNeural': 'bg-BG',
55+
'bn-BD-NabanitaNeural': 'bn-BD',
56+
'bn-BD-PradeepNeural': 'bn-BD',
57+
'bn-IN-BashkarNeural': 'bn-IN',
58+
'bn-IN-TanishaaNeural': 'bn-IN',
59+
'bs-BA-GoranNeural': 'bs-BA',
60+
'bs-BA-VesnaNeural': 'bs-BA',
61+
'ca-ES-EnricNeural': 'ca-ES',
62+
'ca-ES-JoanaNeural': 'ca-ES',
63+
'cs-CZ-AntoninNeural': 'cs-CZ',
64+
'cs-CZ-VlastaNeural': 'cs-CZ',
65+
'cy-GB-AledNeural': 'cy-GB',
66+
'cy-GB-NiaNeural': 'cy-GB',
67+
'da-DK-ChristelNeural': 'da-DK',
68+
'da-DK-JeppeNeural': 'da-DK',
69+
'de-AT-IngridNeural': 'de-AT',
70+
'de-AT-JonasNeural': 'de-AT',
71+
'de-CH-JanNeural': 'de-CH',
72+
'de-CH-LeniNeural': 'de-CH',
73+
'de-DE-AmalaNeural': 'de-DE',
74+
'de-DE-ConradNeural': 'de-DE',
75+
'de-DE-KatjaNeural': 'de-DE',
76+
'de-DE-KillianNeural': 'de-DE',
77+
'el-GR-AthinaNeural': 'el-GR',
78+
'el-GR-NestorasNeural': 'el-GR',
79+
'en-AU-NatashaNeural': 'en-AU',
80+
'en-AU-WilliamNeural': 'en-AU',
81+
'en-CA-ClaraNeural': 'en-CA',
82+
'en-CA-LiamNeural': 'en-CA',
83+
'en-GB-LibbyNeural': 'en-GB',
84+
'en-GB-MaisieNeural': 'en-GB',
85+
'en-GB-RyanNeural': 'en-GB',
86+
'en-GB-SoniaNeural': 'en-GB',
87+
'en-GB-ThomasNeural': 'en-GB',
88+
'en-HK-SamNeural': 'en-HK',
89+
'en-HK-YanNeural': 'en-HK',
90+
'en-IE-ConnorNeural': 'en-IE',
91+
'en-IE-EmilyNeural': 'en-IE',
92+
'en-IN-NeerjaNeural': 'en-IN',
93+
'en-IN-PrabhatNeural': 'en-IN',
94+
'en-KE-AsiliaNeural': 'en-KE',
95+
'en-KE-ChilembaNeural': 'en-KE',
96+
'en-NG-AbeoNeural': 'en-NG',
97+
'en-NG-EzinneNeural': 'en-NG',
98+
'en-NZ-MitchellNeural': 'en-NZ',
99+
'en-NZ-MollyNeural': 'en-NZ',
100+
'en-PH-JamesNeural': 'en-PH',
101+
'en-PH-RosaNeural': 'en-PH',
102+
'en-SG-LunaNeural': 'en-SG',
103+
'en-SG-WayneNeural': 'en-SG',
104+
'en-TZ-ElimuNeural': 'en-TZ',
105+
'en-TZ-ImaniNeural': 'en-TZ',
106+
'en-US-AnaNeural': 'en-US',
107+
'en-US-AriaNeural': 'en-US',
108+
'en-US-ChristopherNeural': 'en-US',
109+
'en-US-EricNeural': 'en-US',
110+
'en-US-GuyNeural': 'en-US',
111+
'en-US-JennyNeural': 'en-US',
112+
'en-US-MichelleNeural': 'en-US',
113+
'en-ZA-LeahNeural': 'en-ZA',
114+
'en-ZA-LukeNeural': 'en-ZA',
115+
'es-AR-ElenaNeural': 'es-AR',
116+
'es-AR-TomasNeural': 'es-AR',
117+
'es-BO-MarceloNeural': 'es-BO',
118+
'es-BO-SofiaNeural': 'es-BO',
119+
'es-CL-CatalinaNeural': 'es-CL',
120+
'es-CL-LorenzoNeural': 'es-CL',
121+
'es-CO-GonzaloNeural': 'es-CO',
122+
'es-CO-SalomeNeural': 'es-CO',
123+
'es-CR-JuanNeural': 'es-CR',
124+
'es-CR-MariaNeural': 'es-CR',
125+
'es-CU-BelkysNeural': 'es-CU',
126+
'es-CU-ManuelNeural': 'es-CU',
127+
'es-DO-EmilioNeural': 'es-DO',
128+
'es-DO-RamonaNeural': 'es-DO',
129+
'es-EC-AndreaNeural': 'es-EC',
130+
'es-EC-LuisNeural': 'es-EC',
131+
'es-ES-AlvaroNeural': 'es-ES',
132+
'es-ES-ElviraNeural': 'es-ES',
133+
'es-ES-ManuelEsCUNeural': 'es-ES',
134+
'es-GQ-JavierNeural': 'es-GQ',
135+
'es-GQ-TeresaNeural': 'es-GQ',
136+
'es-GT-AndresNeural': 'es-GT',
137+
'es-GT-MartaNeural': 'es-GT',
138+
'es-HN-CarlosNeural': 'es-HN',
139+
'es-HN-KarlaNeural': 'es-HN',
140+
'es-MX-DaliaNeural': 'es-MX',
141+
'es-MX-JorgeNeural': 'es-MX',
142+
'es-MX-LorenzoEsCLNeural': 'es-MX',
143+
'es-NI-FedericoNeural': 'es-NI',
144+
'es-NI-YolandaNeural': 'es-NI',
145+
'es-PA-MargaritaNeural': 'es-PA',
146+
'es-PA-RobertoNeural': 'es-PA',
147+
'es-PE-AlexNeural': 'es-PE',
148+
'es-PE-CamilaNeural': 'es-PE',
149+
'es-PR-KarinaNeural': 'es-PR',
150+
'es-PR-VictorNeural': 'es-PR',
151+
'es-PY-MarioNeural': 'es-PY',
152+
'es-PY-TaniaNeural': 'es-PY',
153+
'es-SV-LorenaNeural': 'es-SV',
154+
'es-SV-RodrigoNeural': 'es-SV',
155+
'es-US-AlonsoNeural': 'es-US',
156+
'es-US-PalomaNeural': 'es-US',
157+
'es-UY-MateoNeural': 'es-UY',
158+
'es-UY-ValentinaNeural': 'es-UY',
159+
'es-VE-PaolaNeural': 'es-VE',
160+
'es-VE-SebastianNeural': 'es-VE',
161+
'et-EE-AnuNeural': 'et-EE',
162+
'et-EE-KertNeural': 'et-EE',
163+
'fa-IR-DilaraNeural': 'fa-IR',
164+
'fa-IR-FaridNeural': 'fa-IR',
165+
'fi-FI-HarriNeural': 'fi-FI',
166+
'fi-FI-NooraNeural': 'fi-FI',
167+
'fil-PH-AngeloNeural': 'fil-PH',
168+
'fil-PH-BlessicaNeural': 'fil-PH',
169+
'fr-BE-CharlineNeural': 'fr-BE',
170+
'fr-BE-GerardNeural': 'fr-BE',
171+
'fr-CA-AntoineNeural': 'fr-CA',
172+
'fr-CA-JeanNeural': 'fr-CA',
173+
'fr-CA-SylvieNeural': 'fr-CA',
174+
'fr-CH-ArianeNeural': 'fr-CH',
175+
'fr-CH-FabriceNeural': 'fr-CH',
176+
'fr-FR-DeniseNeural': 'fr-FR',
177+
'fr-FR-EloiseNeural': 'fr-FR',
178+
'fr-FR-HenriNeural': 'fr-FR',
179+
'ga-IE-ColmNeural': 'ga-IE',
180+
'ga-IE-OrlaNeural': 'ga-IE',
181+
'gl-ES-RoiNeural': 'gl-ES',
182+
'gl-ES-SabelaNeural': 'gl-ES',
183+
'gu-IN-DhwaniNeural': 'gu-IN',
184+
'gu-IN-NiranjanNeural': 'gu-IN',
185+
'he-IL-AvriNeural': 'he-IL',
186+
'he-IL-HilaNeural': 'he-IL',
187+
'hi-IN-MadhurNeural': 'hi-IN',
188+
'hi-IN-SwaraNeural': 'hi-IN',
189+
'hr-HR-GabrijelaNeural': 'hr-HR',
190+
'hr-HR-SreckoNeural': 'hr-HR',
191+
'hu-HU-NoemiNeural': 'hu-HU',
192+
'hu-HU-TamasNeural': 'hu-HU',
193+
'id-ID-ArdiNeural': 'id-ID',
194+
'id-ID-GadisNeural': 'id-ID',
195+
'is-IS-GudrunNeural': 'is-IS',
196+
'is-IS-GunnarNeural': 'is-IS',
197+
'it-IT-DiegoNeural': 'it-IT',
198+
'it-IT-ElsaNeural': 'it-IT',
199+
'it-IT-IsabellaNeural': 'it-IT',
200+
'ja-JP-KeitaNeural': 'ja-JP',
201+
'ja-JP-NanamiNeural': 'ja-JP',
202+
'jv-ID-DimasNeural': 'jv-ID',
203+
'jv-ID-SitiNeural': 'jv-ID',
204+
'ka-GE-EkaNeural': 'ka-GE',
205+
'ka-GE-GiorgiNeural': 'ka-GE',
206+
'kk-KZ-AigulNeural': 'kk-KZ',
207+
'kk-KZ-DauletNeural': 'kk-KZ',
208+
'km-KH-PisethNeural': 'km-KH',
209+
'km-KH-SreymomNeural': 'km-KH',
210+
'kn-IN-GaganNeural': 'kn-IN',
211+
'kn-IN-SapnaNeural': 'kn-IN',
212+
'ko-KR-InJoonNeural': 'ko-KR',
213+
'ko-KR-SunHiNeural': 'ko-KR',
214+
'lo-LA-ChanthavongNeural': 'lo-LA',
215+
'lo-LA-KeomanyNeural': 'lo-LA',
216+
'lt-LT-LeonasNeural': 'lt-LT',
217+
'lt-LT-OnaNeural': 'lt-LT',
218+
'lv-LV-EveritaNeural': 'lv-LV',
219+
'lv-LV-NilsNeural': 'lv-LV',
220+
'mk-MK-AleksandarNeural': 'mk-MK',
221+
'mk-MK-MarijaNeural': 'mk-MK',
222+
'ml-IN-MidhunNeural': 'ml-IN',
223+
'ml-IN-SobhanaNeural': 'ml-IN',
224+
'mn-MN-BataaNeural': 'mn-MN',
225+
'mn-MN-YesuiNeural': 'mn-MN',
226+
'mr-IN-AarohiNeural': 'mr-IN',
227+
'mr-IN-ManoharNeural': 'mr-IN',
228+
'ms-MY-OsmanNeural': 'ms-MY',
229+
'ms-MY-YasminNeural': 'ms-MY',
230+
'mt-MT-GraceNeural': 'mt-MT',
231+
'mt-MT-JosephNeural': 'mt-MT',
232+
'my-MM-NilarNeural': 'my-MM',
233+
'my-MM-ThihaNeural': 'my-MM',
234+
'nb-NO-FinnNeural': 'nb-NO',
235+
'nb-NO-PernilleNeural': 'nb-NO',
236+
'ne-NP-HemkalaNeural': 'ne-NP',
237+
'ne-NP-SagarNeural': 'ne-NP',
238+
'nl-BE-ArnaudNeural': 'nl-BE',
239+
'nl-BE-DenaNeural': 'nl-BE',
240+
'nl-NL-ColetteNeural': 'nl-NL',
241+
'nl-NL-FennaNeural': 'nl-NL',
242+
'nl-NL-MaartenNeural': 'nl-NL',
243+
'pl-PL-MarekNeural': 'pl-PL',
244+
'pl-PL-ZofiaNeural': 'pl-PL',
245+
'ps-AF-GulNawazNeural': 'ps-AF',
246+
'ps-AF-LatifaNeural': 'ps-AF',
247+
'pt-BR-AntonioNeural': 'pt-BR',
248+
'pt-BR-FranciscaNeural': 'pt-BR',
249+
'pt-PT-DuarteNeural': 'pt-PT',
250+
'pt-PT-RaquelNeural': 'pt-PT',
251+
'ro-RO-AlinaNeural': 'ro-RO',
252+
'ro-RO-EmilNeural': 'ro-RO',
253+
'ru-RU-DmitryNeural': 'ru-RU',
254+
'ru-RU-SvetlanaNeural': 'ru-RU',
255+
'si-LK-SameeraNeural': 'si-LK',
256+
'si-LK-ThiliniNeural': 'si-LK',
257+
'sk-SK-LukasNeural': 'sk-SK',
258+
'sk-SK-ViktoriaNeural': 'sk-SK',
259+
'sl-SI-PetraNeural': 'sl-SI',
260+
'sl-SI-RokNeural': 'sl-SI',
261+
'so-SO-MuuseNeural': 'so-SO',
262+
'so-SO-UbaxNeural': 'so-SO',
263+
'sq-AL-AnilaNeural': 'sq-AL',
264+
'sq-AL-IlirNeural': 'sq-AL',
265+
'sr-RS-NicholasNeural': 'sr-RS',
266+
'sr-RS-SophieNeural': 'sr-RS',
267+
'su-ID-JajangNeural': 'su-ID',
268+
'su-ID-TutiNeural': 'su-ID',
269+
'sv-SE-MattiasNeural': 'sv-SE',
270+
'sv-SE-SofieNeural': 'sv-SE',
271+
'sw-KE-RafikiNeural': 'sw-KE',
272+
'sw-KE-ZuriNeural': 'sw-KE',
273+
'sw-TZ-DaudiNeural': 'sw-TZ',
274+
'sw-TZ-RehemaNeural': 'sw-TZ',
275+
'ta-IN-PallaviNeural': 'ta-IN',
276+
'ta-IN-ValluvarNeural': 'ta-IN',
277+
'ta-LK-KumarNeural': 'ta-LK',
278+
'ta-LK-SaranyaNeural': 'ta-LK',
279+
'ta-MY-KaniNeural': 'ta-MY',
280+
'ta-MY-SuryaNeural': 'ta-MY',
281+
'ta-SG-AnbuNeural': 'ta-SG',
282+
'ta-SG-VenbaNeural': 'ta-SG',
283+
'te-IN-MohanNeural': 'te-IN',
284+
'te-IN-ShrutiNeural': 'te-IN',
285+
'th-TH-NiwatNeural': 'th-TH',
286+
'th-TH-PremwadeeNeural': 'th-TH',
287+
'tr-TR-AhmetNeural': 'tr-TR',
288+
'tr-TR-EmelNeural': 'tr-TR',
289+
'uk-UA-OstapNeural': 'uk-UA',
290+
'uk-UA-PolinaNeural': 'uk-UA',
291+
'ur-IN-GulNeural': 'ur-IN',
292+
'ur-IN-SalmanNeural': 'ur-IN',
293+
'ur-PK-AsadNeural': 'ur-PK',
294+
'ur-PK-UzmaNeural': 'ur-PK',
295+
'uz-UZ-MadinaNeural': 'uz-UZ',
296+
'uz-UZ-SardorNeural': 'uz-UZ',
297+
'vi-VN-HoaiMyNeural': 'vi-VN',
298+
'vi-VN-NamMinhNeural': 'vi-VN',
299+
'zu-ZA-ThandoNeural': 'zu-ZA',
300+
'zu-ZA-ThembaNeural': 'zu-ZA',
301+
}
302+
303+
SUPPORTED_LANGUAGES = [
304+
"Auto",
305+
*SUPPORTED_VOICES.keys()
306+
]

requirements.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,8 @@ opencv-python
44
numpy
55
ffmpeg-python==0.2.0
66
docarray[hnswlib]>=0.39.1
7+
78
scipy==1.11.4
8-
librosa
9+
librosa
10+
edge_tts
11+
langdetect

0 commit comments

Comments
 (0)