webscout 8.2.7__py3-none-any.whl → 8.2.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of webscout might be problematic. Click here for more details.
- webscout/AIauto.py +1 -1
- webscout/AIutel.py +298 -249
- webscout/Extra/Act.md +309 -0
- webscout/Extra/GitToolkit/__init__.py +10 -0
- webscout/Extra/GitToolkit/gitapi/README.md +110 -0
- webscout/Extra/GitToolkit/gitapi/__init__.py +12 -0
- webscout/Extra/GitToolkit/gitapi/repository.py +195 -0
- webscout/Extra/GitToolkit/gitapi/user.py +96 -0
- webscout/Extra/GitToolkit/gitapi/utils.py +62 -0
- webscout/Extra/YTToolkit/README.md +375 -0
- webscout/Extra/YTToolkit/YTdownloader.py +957 -0
- webscout/Extra/YTToolkit/__init__.py +3 -0
- webscout/Extra/YTToolkit/transcriber.py +476 -0
- webscout/Extra/YTToolkit/ytapi/README.md +44 -0
- webscout/Extra/YTToolkit/ytapi/__init__.py +6 -0
- webscout/Extra/YTToolkit/ytapi/channel.py +307 -0
- webscout/Extra/YTToolkit/ytapi/errors.py +13 -0
- webscout/Extra/YTToolkit/ytapi/extras.py +118 -0
- webscout/Extra/YTToolkit/ytapi/https.py +88 -0
- webscout/Extra/YTToolkit/ytapi/patterns.py +61 -0
- webscout/Extra/YTToolkit/ytapi/playlist.py +59 -0
- webscout/Extra/YTToolkit/ytapi/pool.py +8 -0
- webscout/Extra/YTToolkit/ytapi/query.py +40 -0
- webscout/Extra/YTToolkit/ytapi/stream.py +63 -0
- webscout/Extra/YTToolkit/ytapi/utils.py +62 -0
- webscout/Extra/YTToolkit/ytapi/video.py +232 -0
- webscout/Extra/__init__.py +7 -0
- webscout/Extra/autocoder/__init__.py +9 -0
- webscout/Extra/autocoder/autocoder.py +1105 -0
- webscout/Extra/autocoder/autocoder_utiles.py +332 -0
- webscout/Extra/gguf.md +430 -0
- webscout/Extra/gguf.py +684 -0
- webscout/Extra/tempmail/README.md +488 -0
- webscout/Extra/tempmail/__init__.py +28 -0
- webscout/Extra/tempmail/async_utils.py +141 -0
- webscout/Extra/tempmail/base.py +161 -0
- webscout/Extra/tempmail/cli.py +187 -0
- webscout/Extra/tempmail/emailnator.py +84 -0
- webscout/Extra/tempmail/mail_tm.py +361 -0
- webscout/Extra/tempmail/temp_mail_io.py +292 -0
- webscout/Extra/weather.md +281 -0
- webscout/Extra/weather.py +194 -0
- webscout/Extra/weather_ascii.py +76 -0
- webscout/Litlogger/Readme.md +175 -0
- webscout/Litlogger/__init__.py +67 -0
- webscout/Litlogger/core/__init__.py +6 -0
- webscout/Litlogger/core/level.py +23 -0
- webscout/Litlogger/core/logger.py +165 -0
- webscout/Litlogger/handlers/__init__.py +12 -0
- webscout/Litlogger/handlers/console.py +33 -0
- webscout/Litlogger/handlers/file.py +143 -0
- webscout/Litlogger/handlers/network.py +173 -0
- webscout/Litlogger/styles/__init__.py +7 -0
- webscout/Litlogger/styles/colors.py +249 -0
- webscout/Litlogger/styles/formats.py +458 -0
- webscout/Litlogger/styles/text.py +87 -0
- webscout/Litlogger/utils/__init__.py +6 -0
- webscout/Litlogger/utils/detectors.py +153 -0
- webscout/Litlogger/utils/formatters.py +200 -0
- webscout/Provider/AI21.py +177 -0
- webscout/Provider/AISEARCH/DeepFind.py +254 -0
- webscout/Provider/AISEARCH/Perplexity.py +359 -0
- webscout/Provider/AISEARCH/README.md +279 -0
- webscout/Provider/AISEARCH/__init__.py +9 -0
- webscout/Provider/AISEARCH/felo_search.py +228 -0
- webscout/Provider/AISEARCH/genspark_search.py +350 -0
- webscout/Provider/AISEARCH/hika_search.py +198 -0
- webscout/Provider/AISEARCH/iask_search.py +436 -0
- webscout/Provider/AISEARCH/monica_search.py +246 -0
- webscout/Provider/AISEARCH/scira_search.py +324 -0
- webscout/Provider/AISEARCH/webpilotai_search.py +281 -0
- webscout/Provider/Aitopia.py +316 -0
- webscout/Provider/AllenAI.py +440 -0
- webscout/Provider/Andi.py +228 -0
- webscout/Provider/Blackboxai.py +673 -0
- webscout/Provider/ChatGPTClone.py +237 -0
- webscout/Provider/ChatGPTGratis.py +194 -0
- webscout/Provider/ChatSandbox.py +342 -0
- webscout/Provider/Cloudflare.py +324 -0
- webscout/Provider/Cohere.py +208 -0
- webscout/Provider/Deepinfra.py +340 -0
- webscout/Provider/ExaAI.py +261 -0
- webscout/Provider/ExaChat.py +358 -0
- webscout/Provider/Flowith.py +217 -0
- webscout/Provider/FreeGemini.py +250 -0
- webscout/Provider/Gemini.py +169 -0
- webscout/Provider/GithubChat.py +370 -0
- webscout/Provider/GizAI.py +295 -0
- webscout/Provider/Glider.py +225 -0
- webscout/Provider/Groq.py +801 -0
- webscout/Provider/HF_space/__init__.py +0 -0
- webscout/Provider/HF_space/qwen_qwen2.py +206 -0
- webscout/Provider/HeckAI.py +285 -0
- webscout/Provider/HuggingFaceChat.py +469 -0
- webscout/Provider/Hunyuan.py +283 -0
- webscout/Provider/Jadve.py +291 -0
- webscout/Provider/Koboldai.py +384 -0
- webscout/Provider/LambdaChat.py +411 -0
- webscout/Provider/Llama3.py +259 -0
- webscout/Provider/MCPCore.py +315 -0
- webscout/Provider/Marcus.py +198 -0
- webscout/Provider/Nemotron.py +218 -0
- webscout/Provider/Netwrck.py +270 -0
- webscout/Provider/OLLAMA.py +396 -0
- webscout/Provider/OPENAI/BLACKBOXAI.py +735 -0
- webscout/Provider/OPENAI/Cloudflare.py +378 -0
- webscout/Provider/OPENAI/FreeGemini.py +282 -0
- webscout/Provider/OPENAI/NEMOTRON.py +244 -0
- webscout/Provider/OPENAI/README.md +1253 -0
- webscout/Provider/OPENAI/__init__.py +36 -0
- webscout/Provider/OPENAI/ai4chat.py +293 -0
- webscout/Provider/OPENAI/api.py +810 -0
- webscout/Provider/OPENAI/base.py +249 -0
- webscout/Provider/OPENAI/c4ai.py +373 -0
- webscout/Provider/OPENAI/chatgpt.py +556 -0
- webscout/Provider/OPENAI/chatgptclone.py +488 -0
- webscout/Provider/OPENAI/chatsandbox.py +172 -0
- webscout/Provider/OPENAI/deepinfra.py +319 -0
- webscout/Provider/OPENAI/e2b.py +1356 -0
- webscout/Provider/OPENAI/exaai.py +411 -0
- webscout/Provider/OPENAI/exachat.py +443 -0
- webscout/Provider/OPENAI/flowith.py +162 -0
- webscout/Provider/OPENAI/freeaichat.py +359 -0
- webscout/Provider/OPENAI/glider.py +323 -0
- webscout/Provider/OPENAI/groq.py +361 -0
- webscout/Provider/OPENAI/heckai.py +307 -0
- webscout/Provider/OPENAI/llmchatco.py +335 -0
- webscout/Provider/OPENAI/mcpcore.py +383 -0
- webscout/Provider/OPENAI/multichat.py +376 -0
- webscout/Provider/OPENAI/netwrck.py +356 -0
- webscout/Provider/OPENAI/opkfc.py +496 -0
- webscout/Provider/OPENAI/scirachat.py +471 -0
- webscout/Provider/OPENAI/sonus.py +303 -0
- webscout/Provider/OPENAI/standardinput.py +433 -0
- webscout/Provider/OPENAI/textpollinations.py +339 -0
- webscout/Provider/OPENAI/toolbaz.py +413 -0
- webscout/Provider/OPENAI/typefully.py +355 -0
- webscout/Provider/OPENAI/typegpt.py +358 -0
- webscout/Provider/OPENAI/uncovrAI.py +462 -0
- webscout/Provider/OPENAI/utils.py +307 -0
- webscout/Provider/OPENAI/venice.py +425 -0
- webscout/Provider/OPENAI/wisecat.py +381 -0
- webscout/Provider/OPENAI/writecream.py +163 -0
- webscout/Provider/OPENAI/x0gpt.py +378 -0
- webscout/Provider/OPENAI/yep.py +356 -0
- webscout/Provider/OpenGPT.py +209 -0
- webscout/Provider/Openai.py +496 -0
- webscout/Provider/PI.py +429 -0
- webscout/Provider/Perplexitylabs.py +415 -0
- webscout/Provider/QwenLM.py +254 -0
- webscout/Provider/Reka.py +214 -0
- webscout/Provider/StandardInput.py +290 -0
- webscout/Provider/TTI/AiForce/README.md +159 -0
- webscout/Provider/TTI/AiForce/__init__.py +22 -0
- webscout/Provider/TTI/AiForce/async_aiforce.py +224 -0
- webscout/Provider/TTI/AiForce/sync_aiforce.py +245 -0
- webscout/Provider/TTI/FreeAIPlayground/README.md +99 -0
- webscout/Provider/TTI/FreeAIPlayground/__init__.py +9 -0
- webscout/Provider/TTI/FreeAIPlayground/async_freeaiplayground.py +181 -0
- webscout/Provider/TTI/FreeAIPlayground/sync_freeaiplayground.py +180 -0
- webscout/Provider/TTI/ImgSys/README.md +174 -0
- webscout/Provider/TTI/ImgSys/__init__.py +23 -0
- webscout/Provider/TTI/ImgSys/async_imgsys.py +202 -0
- webscout/Provider/TTI/ImgSys/sync_imgsys.py +195 -0
- webscout/Provider/TTI/MagicStudio/README.md +101 -0
- webscout/Provider/TTI/MagicStudio/__init__.py +2 -0
- webscout/Provider/TTI/MagicStudio/async_magicstudio.py +111 -0
- webscout/Provider/TTI/MagicStudio/sync_magicstudio.py +109 -0
- webscout/Provider/TTI/Nexra/README.md +155 -0
- webscout/Provider/TTI/Nexra/__init__.py +22 -0
- webscout/Provider/TTI/Nexra/async_nexra.py +286 -0
- webscout/Provider/TTI/Nexra/sync_nexra.py +258 -0
- webscout/Provider/TTI/PollinationsAI/README.md +146 -0
- webscout/Provider/TTI/PollinationsAI/__init__.py +23 -0
- webscout/Provider/TTI/PollinationsAI/async_pollinations.py +311 -0
- webscout/Provider/TTI/PollinationsAI/sync_pollinations.py +265 -0
- webscout/Provider/TTI/README.md +128 -0
- webscout/Provider/TTI/__init__.py +12 -0
- webscout/Provider/TTI/aiarta/README.md +134 -0
- webscout/Provider/TTI/aiarta/__init__.py +2 -0
- webscout/Provider/TTI/aiarta/async_aiarta.py +482 -0
- webscout/Provider/TTI/aiarta/sync_aiarta.py +440 -0
- webscout/Provider/TTI/artbit/README.md +100 -0
- webscout/Provider/TTI/artbit/__init__.py +22 -0
- webscout/Provider/TTI/artbit/async_artbit.py +155 -0
- webscout/Provider/TTI/artbit/sync_artbit.py +148 -0
- webscout/Provider/TTI/fastflux/README.md +129 -0
- webscout/Provider/TTI/fastflux/__init__.py +22 -0
- webscout/Provider/TTI/fastflux/async_fastflux.py +261 -0
- webscout/Provider/TTI/fastflux/sync_fastflux.py +252 -0
- webscout/Provider/TTI/huggingface/README.md +114 -0
- webscout/Provider/TTI/huggingface/__init__.py +22 -0
- webscout/Provider/TTI/huggingface/async_huggingface.py +199 -0
- webscout/Provider/TTI/huggingface/sync_huggingface.py +195 -0
- webscout/Provider/TTI/piclumen/README.md +161 -0
- webscout/Provider/TTI/piclumen/__init__.py +23 -0
- webscout/Provider/TTI/piclumen/async_piclumen.py +268 -0
- webscout/Provider/TTI/piclumen/sync_piclumen.py +233 -0
- webscout/Provider/TTI/pixelmuse/README.md +79 -0
- webscout/Provider/TTI/pixelmuse/__init__.py +4 -0
- webscout/Provider/TTI/pixelmuse/async_pixelmuse.py +249 -0
- webscout/Provider/TTI/pixelmuse/sync_pixelmuse.py +182 -0
- webscout/Provider/TTI/talkai/README.md +139 -0
- webscout/Provider/TTI/talkai/__init__.py +4 -0
- webscout/Provider/TTI/talkai/async_talkai.py +229 -0
- webscout/Provider/TTI/talkai/sync_talkai.py +207 -0
- webscout/Provider/TTS/README.md +192 -0
- webscout/Provider/TTS/__init__.py +9 -0
- webscout/Provider/TTS/base.py +159 -0
- webscout/Provider/TTS/deepgram.py +156 -0
- webscout/Provider/TTS/elevenlabs.py +111 -0
- webscout/Provider/TTS/gesserit.py +128 -0
- webscout/Provider/TTS/murfai.py +113 -0
- webscout/Provider/TTS/parler.py +111 -0
- webscout/Provider/TTS/speechma.py +580 -0
- webscout/Provider/TTS/sthir.py +94 -0
- webscout/Provider/TTS/streamElements.py +333 -0
- webscout/Provider/TTS/utils.py +280 -0
- webscout/Provider/TeachAnything.py +229 -0
- webscout/Provider/TextPollinationsAI.py +308 -0
- webscout/Provider/TwoAI.py +280 -0
- webscout/Provider/TypliAI.py +305 -0
- webscout/Provider/UNFINISHED/ChatHub.py +209 -0
- webscout/Provider/UNFINISHED/Youchat.py +330 -0
- webscout/Provider/UNFINISHED/liner_api_request.py +263 -0
- webscout/Provider/UNFINISHED/oivscode.py +351 -0
- webscout/Provider/UNFINISHED/test_lmarena.py +119 -0
- webscout/Provider/Venice.py +258 -0
- webscout/Provider/VercelAI.py +253 -0
- webscout/Provider/WiseCat.py +233 -0
- webscout/Provider/WrDoChat.py +370 -0
- webscout/Provider/Writecream.py +246 -0
- webscout/Provider/WritingMate.py +269 -0
- webscout/Provider/__init__.py +172 -0
- webscout/Provider/ai4chat.py +149 -0
- webscout/Provider/akashgpt.py +335 -0
- webscout/Provider/asksteve.py +220 -0
- webscout/Provider/cerebras.py +290 -0
- webscout/Provider/chatglm.py +215 -0
- webscout/Provider/cleeai.py +213 -0
- webscout/Provider/copilot.py +425 -0
- webscout/Provider/elmo.py +283 -0
- webscout/Provider/freeaichat.py +285 -0
- webscout/Provider/geminiapi.py +208 -0
- webscout/Provider/granite.py +235 -0
- webscout/Provider/hermes.py +266 -0
- webscout/Provider/julius.py +223 -0
- webscout/Provider/koala.py +170 -0
- webscout/Provider/learnfastai.py +325 -0
- webscout/Provider/llama3mitril.py +215 -0
- webscout/Provider/llmchat.py +258 -0
- webscout/Provider/llmchatco.py +306 -0
- webscout/Provider/lmarena.py +198 -0
- webscout/Provider/meta.py +801 -0
- webscout/Provider/multichat.py +364 -0
- webscout/Provider/samurai.py +223 -0
- webscout/Provider/scira_chat.py +299 -0
- webscout/Provider/scnet.py +243 -0
- webscout/Provider/searchchat.py +292 -0
- webscout/Provider/sonus.py +258 -0
- webscout/Provider/talkai.py +194 -0
- webscout/Provider/toolbaz.py +353 -0
- webscout/Provider/turboseek.py +266 -0
- webscout/Provider/typefully.py +202 -0
- webscout/Provider/typegpt.py +289 -0
- webscout/Provider/uncovr.py +368 -0
- webscout/Provider/x0gpt.py +299 -0
- webscout/Provider/yep.py +389 -0
- webscout/__init__.py +4 -2
- webscout/cli.py +3 -28
- webscout/conversation.py +35 -35
- webscout/litagent/Readme.md +276 -0
- webscout/litagent/__init__.py +29 -0
- webscout/litagent/agent.py +455 -0
- webscout/litagent/constants.py +60 -0
- webscout/litprinter/__init__.py +59 -0
- webscout/scout/README.md +402 -0
- webscout/scout/__init__.py +8 -0
- webscout/scout/core/__init__.py +7 -0
- webscout/scout/core/crawler.py +140 -0
- webscout/scout/core/scout.py +568 -0
- webscout/scout/core/search_result.py +96 -0
- webscout/scout/core/text_analyzer.py +63 -0
- webscout/scout/core/text_utils.py +277 -0
- webscout/scout/core/web_analyzer.py +52 -0
- webscout/scout/element.py +460 -0
- webscout/scout/parsers/__init__.py +69 -0
- webscout/scout/parsers/html5lib_parser.py +172 -0
- webscout/scout/parsers/html_parser.py +236 -0
- webscout/scout/parsers/lxml_parser.py +178 -0
- webscout/scout/utils.py +37 -0
- webscout/swiftcli/Readme.md +323 -0
- webscout/swiftcli/__init__.py +95 -0
- webscout/swiftcli/core/__init__.py +7 -0
- webscout/swiftcli/core/cli.py +297 -0
- webscout/swiftcli/core/context.py +104 -0
- webscout/swiftcli/core/group.py +241 -0
- webscout/swiftcli/decorators/__init__.py +28 -0
- webscout/swiftcli/decorators/command.py +221 -0
- webscout/swiftcli/decorators/options.py +220 -0
- webscout/swiftcli/decorators/output.py +252 -0
- webscout/swiftcli/exceptions.py +21 -0
- webscout/swiftcli/plugins/__init__.py +9 -0
- webscout/swiftcli/plugins/base.py +135 -0
- webscout/swiftcli/plugins/manager.py +262 -0
- webscout/swiftcli/utils/__init__.py +59 -0
- webscout/swiftcli/utils/formatting.py +252 -0
- webscout/swiftcli/utils/parsing.py +267 -0
- webscout/version.py +1 -1
- webscout/webscout_search.py +2 -182
- webscout/webscout_search_async.py +1 -179
- webscout/zeroart/README.md +89 -0
- webscout/zeroart/__init__.py +135 -0
- webscout/zeroart/base.py +66 -0
- webscout/zeroart/effects.py +101 -0
- webscout/zeroart/fonts.py +1239 -0
- {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/METADATA +115 -60
- webscout-8.2.8.dist-info/RECORD +334 -0
- {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/WHEEL +1 -1
- webscout-8.2.7.dist-info/RECORD +0 -26
- {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/entry_points.txt +0 -0
- {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/licenses/LICENSE.md +0 -0
- {webscout-8.2.7.dist-info → webscout-8.2.8.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
##################################################################################
|
|
2
|
+
## Modified version of code written by t.me/infip1217 ##
|
|
3
|
+
##################################################################################
|
|
4
|
+
import time
|
|
5
|
+
import requests
|
|
6
|
+
import pathlib
|
|
7
|
+
import tempfile
|
|
8
|
+
from io import BytesIO
|
|
9
|
+
from webscout import exceptions
|
|
10
|
+
from webscout.litagent import LitAgent
|
|
11
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
12
|
+
from webscout.Provider.TTS import utils
|
|
13
|
+
from webscout.Provider.TTS.base import BaseTTSProvider
|
|
14
|
+
|
|
15
|
+
class SpeechMaTTS(BaseTTSProvider):
|
|
16
|
+
"""
|
|
17
|
+
Text-to-speech provider using the SpeechMa API.
|
|
18
|
+
"""
|
|
19
|
+
# Request headers
|
|
20
|
+
headers = {
|
|
21
|
+
"accept": "*/*",
|
|
22
|
+
"accept-language": "en-IN,en-GB;q=0.9,en-US;q=0.8,en;q=0.7,en-AU;q=0.6",
|
|
23
|
+
"content-type": "application/json",
|
|
24
|
+
"origin": "https://speechma.com",
|
|
25
|
+
"priority": "u=1, i",
|
|
26
|
+
"User-Agent": LitAgent().random()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Available voices with their IDs
|
|
30
|
+
all_voices = {
|
|
31
|
+
# Multilingual voices
|
|
32
|
+
"Andrew Multilingual": "voice-107", # Male, Multilingual, United States
|
|
33
|
+
"Ava Multilingual": "voice-110", # Female, Multilingual, United States
|
|
34
|
+
"Brian Multilingual": "voice-112", # Male, Multilingual, United States
|
|
35
|
+
"Emma Multilingual": "voice-115", # Female, Multilingual, United States
|
|
36
|
+
"Remy Multilingual": "voice-142", # Male, Multilingual, France
|
|
37
|
+
"Vivienne Multilingual": "voice-143", # Female, Multilingual, France
|
|
38
|
+
"Florian Multilingual": "voice-154", # Male, Multilingual, Germany
|
|
39
|
+
"Seraphina Multilingual": "voice-157", # Female, Multilingual, Germany
|
|
40
|
+
"Giuseppe Multilingual": "voice-177", # Male, Multilingual, Italy
|
|
41
|
+
"Hyunsu Multilingual": "voice-189", # Male, Multilingual, South Korea
|
|
42
|
+
"Thalita Multilingual": "voice-222", # Female, Multilingual, Brazil
|
|
43
|
+
# English (US)
|
|
44
|
+
"Ana": "voice-106", # Female, English, United States
|
|
45
|
+
"Andrew": "voice-108", # Male, English, United States
|
|
46
|
+
"Aria": "voice-109", # Female, English, United States
|
|
47
|
+
"Ava": "voice-111", # Female, English, United States
|
|
48
|
+
"Brian": "voice-113", # Male, English, United States
|
|
49
|
+
"Christopher": "voice-114", # Male, English, United States
|
|
50
|
+
"Emma": "voice-116", # Female, English, United States
|
|
51
|
+
"Eric": "voice-117", # Male, English, United States
|
|
52
|
+
"Guy": "voice-118", # Male, English, United States
|
|
53
|
+
"Jenny": "voice-119", # Female, English, United States
|
|
54
|
+
"Michelle": "voice-120", # Female, English, United States
|
|
55
|
+
"Roger": "voice-121", # Male, English, United States
|
|
56
|
+
"Steffan": "voice-122", # Male, English, United States
|
|
57
|
+
# English (UK)
|
|
58
|
+
"Libby": "voice-82", # Female, English, United Kingdom
|
|
59
|
+
"Maisie": "voice-83", # Female, English, United Kingdom
|
|
60
|
+
"Ryan": "voice-84", # Male, English, United Kingdom
|
|
61
|
+
"Sonia": "voice-85", # Female, English, United Kingdom
|
|
62
|
+
"Thomas": "voice-86", # Male, English, United Kingdom
|
|
63
|
+
# English (Australia)
|
|
64
|
+
"Natasha": "voice-78", # Female, English, Australia
|
|
65
|
+
"William": "voice-79", # Male, English, Australia
|
|
66
|
+
# English (Canada)
|
|
67
|
+
"Clara": "voice-80", # Female, English, Canada
|
|
68
|
+
"Liam": "voice-81", # Male, English, Canada
|
|
69
|
+
# English (India)
|
|
70
|
+
"Neerja Expressive": "voice-91", # Female, English, India
|
|
71
|
+
"Neerja": "voice-92", # Female, English, India
|
|
72
|
+
"Prabhat": "voice-93", # Male, English, India
|
|
73
|
+
# English (Hong Kong)
|
|
74
|
+
"Sam": "voice-87", # Male, English, Hong Kong
|
|
75
|
+
"Yan": "voice-88", # Female, English, Hong Kong
|
|
76
|
+
# English (Ireland)
|
|
77
|
+
"Connor": "voice-89", # Male, English, Ireland
|
|
78
|
+
"Emily": "voice-90", # Female, English, Ireland
|
|
79
|
+
# English (Kenya)
|
|
80
|
+
"Asilia": "voice-94", # Female, English, Kenya
|
|
81
|
+
"Chilemba": "voice-95", # Male, English, Kenya
|
|
82
|
+
# English (Nigeria)
|
|
83
|
+
"Abeo": "voice-96", # Male, English, Nigeria
|
|
84
|
+
"Ezinne": "voice-97", # Female, English, Nigeria
|
|
85
|
+
# English (New Zealand)
|
|
86
|
+
"Mitchell": "voice-98", # Male, English, New Zealand
|
|
87
|
+
"Molly": "voice-99", # Female, English, New Zealand
|
|
88
|
+
# English (Philippines)
|
|
89
|
+
"James": "voice-100", # Male, English, Philippines
|
|
90
|
+
"Rosa": "voice-101", # Female, English, Philippines
|
|
91
|
+
# English (Singapore)
|
|
92
|
+
"Luna": "voice-102", # Female, English, Singapore
|
|
93
|
+
"Wayne": "voice-103", # Male, English, Singapore
|
|
94
|
+
# English (Tanzania)
|
|
95
|
+
"Elimu": "voice-104", # Male, English, Tanzania
|
|
96
|
+
"Imani": "voice-105", # Female, English, Tanzania
|
|
97
|
+
# English (South Africa)
|
|
98
|
+
"Leah": "voice-123", # Female, English, South Africa
|
|
99
|
+
"Luke": "voice-124", # Male, English, South Africa
|
|
100
|
+
# Spanish (Argentina)
|
|
101
|
+
"Elena": "voice-239", # Female, Spanish, Argentina
|
|
102
|
+
"Tomas": "voice-240", # Male, Spanish, Argentina
|
|
103
|
+
# Spanish (Bolivia)
|
|
104
|
+
"Marcelo": "voice-241", # Male, Spanish, Bolivia
|
|
105
|
+
"Sofia": "voice-242", # Female, Spanish, Bolivia
|
|
106
|
+
# Spanish (Chile)
|
|
107
|
+
"Catalina": "voice-243", # Female, Spanish, Chile
|
|
108
|
+
"Lorenzo": "voice-244", # Male, Spanish, Chile
|
|
109
|
+
# Spanish (Colombia)
|
|
110
|
+
"Gonzalo": "voice-245", # Male, Spanish, Colombia
|
|
111
|
+
"Salome": "voice-246", # Female, Spanish, Colombia
|
|
112
|
+
# Spanish (Costa Rica)
|
|
113
|
+
"Juan": "voice-247", # Male, Spanish, Costa Rica
|
|
114
|
+
"Maria": "voice-248", # Female, Spanish, Costa Rica
|
|
115
|
+
# Spanish (Cuba)
|
|
116
|
+
"Belkys": "voice-249", # Female, Spanish, Cuba
|
|
117
|
+
"Manuel": "voice-250", # Male, Spanish, Cuba
|
|
118
|
+
# Spanish (Dominican Republic)
|
|
119
|
+
"Emilio": "voice-251", # Male, Spanish, Dominican Republic
|
|
120
|
+
"Ramona": "voice-252", # Female, Spanish, Dominican Republic
|
|
121
|
+
# Spanish (Ecuador)
|
|
122
|
+
"Andrea": "voice-253", # Female, Spanish, Ecuador
|
|
123
|
+
"Luis": "voice-254", # Male, Spanish, Ecuador
|
|
124
|
+
# Spanish (Spain)
|
|
125
|
+
"Alvaro": "voice-255", # Male, Spanish, Spain
|
|
126
|
+
"Elvira": "voice-256", # Female, Spanish, Spain
|
|
127
|
+
"Ximena": "voice-257", # Female, Spanish, Spain
|
|
128
|
+
# Spanish (Equatorial Guinea)
|
|
129
|
+
"Javier": "voice-258", # Male, Spanish, Equatorial Guinea
|
|
130
|
+
"Teresa": "voice-259", # Female, Spanish, Equatorial Guinea
|
|
131
|
+
# Spanish (Guatemala)
|
|
132
|
+
"Andres": "voice-260", # Male, Spanish, Guatemala
|
|
133
|
+
"Marta": "voice-261", # Female, Spanish, Guatemala
|
|
134
|
+
# Spanish (Honduras)
|
|
135
|
+
"Carlos": "voice-262", # Male, Spanish, Honduras
|
|
136
|
+
"Karla": "voice-263", # Female, Spanish, Honduras
|
|
137
|
+
# Spanish (Mexico)
|
|
138
|
+
"Dalia": "voice-264", # Female, Spanish, Mexico
|
|
139
|
+
"Jorge": "voice-265", # Male, Spanish, Mexico
|
|
140
|
+
# Spanish (Nicaragua)
|
|
141
|
+
"Federico": "voice-266", # Male, Spanish, Nicaragua
|
|
142
|
+
"Yolanda": "voice-267", # Female, Spanish, Nicaragua
|
|
143
|
+
# Spanish (Panama)
|
|
144
|
+
"Margarita": "voice-268", # Female, Spanish, Panama
|
|
145
|
+
"Roberto": "voice-269", # Male, Spanish, Panama
|
|
146
|
+
# Spanish (Peru)
|
|
147
|
+
"Alex": "voice-270", # Male, Spanish, Peru
|
|
148
|
+
"Camila": "voice-271", # Female, Spanish, Peru
|
|
149
|
+
# Spanish (Puerto Rico)
|
|
150
|
+
"Karina": "voice-272", # Female, Spanish, Puerto Rico
|
|
151
|
+
"Victor": "voice-273", # Male, Spanish, Puerto Rico
|
|
152
|
+
# Spanish (Paraguay)
|
|
153
|
+
"Mario": "voice-274", # Male, Spanish, Paraguay
|
|
154
|
+
"Tania": "voice-275", # Female, Spanish, Paraguay
|
|
155
|
+
# Spanish (El Salvador)
|
|
156
|
+
"Lorena": "voice-276", # Female, Spanish, El Salvador
|
|
157
|
+
"Rodrigo": "voice-277", # Male, Spanish, El Salvador
|
|
158
|
+
# Spanish (United States)
|
|
159
|
+
"Alonso": "voice-278", # Male, Spanish, United States
|
|
160
|
+
"Paloma": "voice-279", # Female, Spanish, United States
|
|
161
|
+
# Spanish (Uruguay)
|
|
162
|
+
"Mateo": "voice-280", # Male, Spanish, Uruguay
|
|
163
|
+
"Valentina": "voice-281", # Female, Spanish, Uruguay
|
|
164
|
+
# Spanish (Venezuela)
|
|
165
|
+
"Paola": "voice-282", # Female, Spanish, Venezuela
|
|
166
|
+
"Sebastian": "voice-283", # Male, Spanish, Venezuela
|
|
167
|
+
# Chinese (China)
|
|
168
|
+
"Xiaoxiao": "voice-53", # Female, Chinese, China
|
|
169
|
+
"Xiaoyi": "voice-54", # Female, Chinese, China
|
|
170
|
+
"Yunjian": "voice-55", # Male, Chinese, China
|
|
171
|
+
"Yunxi": "voice-56", # Male, Chinese, China
|
|
172
|
+
"Yunxia": "voice-57", # Male, Chinese, China
|
|
173
|
+
"Yunyang": "voice-58", # Male, Chinese, China
|
|
174
|
+
"Xiaobei": "voice-59", # Female, Chinese, China
|
|
175
|
+
"Xiaoni": "voice-60", # Female, Chinese, China
|
|
176
|
+
# Chinese (Hong Kong)
|
|
177
|
+
"HiuGaai": "voice-61", # Female, Chinese, Hong Kong
|
|
178
|
+
"HiuMaan": "voice-62", # Female, Chinese, Hong Kong
|
|
179
|
+
"WanLung": "voice-63", # Male, Chinese, Hong Kong
|
|
180
|
+
# Chinese (Taiwan)
|
|
181
|
+
"HsiaoChen": "voice-64", # Female, Chinese, Taiwan
|
|
182
|
+
"HsiaoYu": "voice-65", # Female, Chinese, Taiwan
|
|
183
|
+
"YunJhe": "voice-66", # Male, Chinese, Taiwan
|
|
184
|
+
# French (Belgium)
|
|
185
|
+
"Charline": "voice-131", # Female, French, Belgium
|
|
186
|
+
"Gerard": "voice-132", # Male, French, Belgium
|
|
187
|
+
# French (Canada)
|
|
188
|
+
"Antoine": "voice-133", # Male, French, Canada
|
|
189
|
+
"Jean": "voice-134", # Male, French, Canada
|
|
190
|
+
"Sylvie": "voice-135", # Female, French, Canada
|
|
191
|
+
"Thierry": "voice-136", # Male, French, Canada
|
|
192
|
+
# French (Switzerland)
|
|
193
|
+
"Ariane": "voice-137", # Female, French, Switzerland
|
|
194
|
+
"Fabrice": "voice-138", # Male, French, Switzerland
|
|
195
|
+
# French (France)
|
|
196
|
+
"Denise": "voice-139", # Female, French, France
|
|
197
|
+
"Eloise": "voice-140", # Female, French, France
|
|
198
|
+
"Henri": "voice-141", # Male, French, France
|
|
199
|
+
# German (Austria)
|
|
200
|
+
"Ingrid": "voice-148", # Female, German, Austria
|
|
201
|
+
"Jonas": "voice-149", # Male, German, Austria
|
|
202
|
+
# German (Switzerland)
|
|
203
|
+
"Jan": "voice-150", # Male, German, Switzerland
|
|
204
|
+
"Leni": "voice-151", # Female, German, Switzerland
|
|
205
|
+
# German (Germany)
|
|
206
|
+
"Amala": "voice-152", # Female, German, Germany
|
|
207
|
+
"Conrad": "voice-153", # Male, German, Germany
|
|
208
|
+
"Katja": "voice-155", # Female, German, Germany
|
|
209
|
+
"Killian": "voice-156", # Male, German, Germany
|
|
210
|
+
# Arabic (United Arab Emirates)
|
|
211
|
+
"Fatima": "voice-7", # Female, Arabic, United Arab Emirates
|
|
212
|
+
"Hamdan": "voice-8", # Male, Arabic, United Arab Emirates
|
|
213
|
+
# Arabic (Bahrain)
|
|
214
|
+
"Ali": "voice-9", # Male, Arabic, Bahrain
|
|
215
|
+
"Laila": "voice-10", # Female, Arabic, Bahrain
|
|
216
|
+
# Arabic (Algeria)
|
|
217
|
+
"Amina": "voice-11", # Female, Arabic, Algeria
|
|
218
|
+
"Ismael": "voice-12", # Male, Arabic, Algeria
|
|
219
|
+
# Arabic (Egypt)
|
|
220
|
+
"Salma": "voice-13", # Female, Arabic, Egypt
|
|
221
|
+
"Shakir": "voice-14", # Male, Arabic, Egypt
|
|
222
|
+
# Arabic (Iraq)
|
|
223
|
+
"Bassel": "voice-15", # Male, Arabic, Iraq
|
|
224
|
+
"Rana": "voice-16", # Female, Arabic, Iraq
|
|
225
|
+
# Arabic (Jordan)
|
|
226
|
+
"Sana": "voice-17", # Female, Arabic, Jordan
|
|
227
|
+
"Taim": "voice-18", # Male, Arabic, Jordan
|
|
228
|
+
# Arabic (Kuwait)
|
|
229
|
+
"Fahed": "voice-19", # Male, Arabic, Kuwait
|
|
230
|
+
"Noura": "voice-20", # Female, Arabic, Kuwait
|
|
231
|
+
# Arabic (Lebanon)
|
|
232
|
+
"Layla": "voice-21", # Female, Arabic, Lebanon
|
|
233
|
+
"Rami": "voice-22", # Male, Arabic, Lebanon
|
|
234
|
+
# Arabic (Libya)
|
|
235
|
+
"Iman": "voice-23", # Female, Arabic, Libya
|
|
236
|
+
"Omar": "voice-24", # Male, Arabic, Libya
|
|
237
|
+
# Arabic (Morocco)
|
|
238
|
+
"Jamal": "voice-25", # Male, Arabic, Morocco
|
|
239
|
+
"Mouna": "voice-26", # Female, Arabic, Morocco
|
|
240
|
+
# Arabic (Oman)
|
|
241
|
+
"Abdullah": "voice-27", # Male, Arabic, Oman
|
|
242
|
+
"Aysha": "voice-28", # Female, Arabic, Oman
|
|
243
|
+
# Arabic (Qatar)
|
|
244
|
+
"Amal": "voice-29", # Female, Arabic, Qatar
|
|
245
|
+
"Moaz": "voice-30", # Male, Arabic, Qatar
|
|
246
|
+
# Arabic (Saudi Arabia)
|
|
247
|
+
"Hamed": "voice-31", # Male, Arabic, Saudi Arabia
|
|
248
|
+
"Zariyah": "voice-32", # Female, Arabic, Saudi Arabia
|
|
249
|
+
# Arabic (Syria)
|
|
250
|
+
"Amany": "voice-33", # Female, Arabic, Syria
|
|
251
|
+
"Laith": "voice-34", # Male, Arabic, Syria
|
|
252
|
+
# Arabic (Tunisia)
|
|
253
|
+
"Hedi": "voice-35", # Male, Arabic, Tunisia
|
|
254
|
+
"Reem": "voice-36", # Female, Arabic, Tunisia
|
|
255
|
+
# Arabic (Yemen)
|
|
256
|
+
"Maryam": "voice-37", # Female, Arabic, Yemen
|
|
257
|
+
"Saleh": "voice-38", # Male, Arabic, Yemen
|
|
258
|
+
# Afrikaans (South Africa)
|
|
259
|
+
"Adri": "voice-1", # Female, Afrikaans, South Africa
|
|
260
|
+
"Willem": "voice-2", # Male, Afrikaans, South Africa
|
|
261
|
+
# Albanian (Albania)
|
|
262
|
+
"Anila": "voice-3", # Female, Albanian, Albania
|
|
263
|
+
"Ilir": "voice-4", # Male, Albanian, Albania
|
|
264
|
+
# Amharic (Ethiopia)
|
|
265
|
+
"Ameha": "voice-5", # Male, Amharic, Ethiopia
|
|
266
|
+
"Mekdes": "voice-6", # Female, Amharic, Ethiopia
|
|
267
|
+
# Azerbaijani (Azerbaijan)
|
|
268
|
+
"Babek": "voice-39", # Male, Azerbaijani, Azerbaijan
|
|
269
|
+
"Banu": "voice-40", # Female, Azerbaijani, Azerbaijan
|
|
270
|
+
# Bengali (Bangladesh)
|
|
271
|
+
"Nabanita": "voice-41", # Female, Bengali, Bangladesh
|
|
272
|
+
"Pradeep": "voice-42", # Male, Bengali, Bangladesh
|
|
273
|
+
# Bengali (India)
|
|
274
|
+
"Bashkar": "voice-43", # Male, Bengali, India
|
|
275
|
+
"Tanishaa": "voice-44", # Female, Bengali, India
|
|
276
|
+
# Bosnian (Bosnia and Herzegovina)
|
|
277
|
+
"Goran": "voice-45", # Male, Bosnian, Bosnia and Herzegovina
|
|
278
|
+
"Vesna": "voice-46", # Female, Bosnian, Bosnia and Herzegovina
|
|
279
|
+
# Bulgarian (Bulgaria)
|
|
280
|
+
"Borislav": "voice-47", # Male, Bulgarian, Bulgaria
|
|
281
|
+
"Kalina": "voice-48", # Female, Bulgarian, Bulgaria
|
|
282
|
+
# Burmese (Myanmar)
|
|
283
|
+
"Nilar": "voice-49", # Female, Burmese, Myanmar
|
|
284
|
+
"Thiha": "voice-50", # Male, Burmese, Myanmar
|
|
285
|
+
# Catalan (Spain)
|
|
286
|
+
"Enric": "voice-51", # Male, Catalan, Spain
|
|
287
|
+
"Joana": "voice-52", # Female, Catalan, Spain
|
|
288
|
+
# Croatian (Croatia)
|
|
289
|
+
"Gabrijela": "voice-67", # Female, Croatian, Croatia
|
|
290
|
+
"Srecko": "voice-68", # Male, Croatian, Croatia
|
|
291
|
+
# Czech (Czech Republic)
|
|
292
|
+
"Antonin": "voice-69", # Male, Czech, Czech Republic
|
|
293
|
+
"Vlasta": "voice-70", # Female, Czech, Czech Republic
|
|
294
|
+
# Danish (Denmark)
|
|
295
|
+
"Christel": "voice-71", # Female, Danish, Denmark
|
|
296
|
+
"Jeppe": "voice-72", # Male, Danish, Denmark
|
|
297
|
+
# Dutch (Belgium)
|
|
298
|
+
"Arnaud": "voice-73", # Male, Dutch, Belgium
|
|
299
|
+
"Dena": "voice-74", # Female, Dutch, Belgium
|
|
300
|
+
# Dutch (Netherlands)
|
|
301
|
+
"Colette": "voice-75", # Female, Dutch, Netherlands
|
|
302
|
+
"Fenna": "voice-76", # Female, Dutch, Netherlands
|
|
303
|
+
"Maarten": "voice-77", # Male, Dutch, Netherlands
|
|
304
|
+
# Estonian (Estonia)
|
|
305
|
+
"Anu": "voice-125", # Female, Estonian, Estonia
|
|
306
|
+
"Kert": "voice-126", # Male, Estonian, Estonia
|
|
307
|
+
# Filipino (Philippines)
|
|
308
|
+
"Angelo": "voice-127", # Male, Filipino, Philippines
|
|
309
|
+
"Blessica": "voice-128", # Female, Filipino, Philippines
|
|
310
|
+
# Finnish (Finland)
|
|
311
|
+
"Harri": "voice-129", # Male, Finnish, Finland
|
|
312
|
+
"Noora": "voice-130", # Female, Finnish, Finland
|
|
313
|
+
# Galician (Spain)
|
|
314
|
+
"Roi": "voice-144", # Male, Galician, Spain
|
|
315
|
+
"Sabela": "voice-145", # Female, Galician, Spain
|
|
316
|
+
# Georgian (Georgia)
|
|
317
|
+
"Eka": "voice-146", # Female, Georgian, Georgia
|
|
318
|
+
"Giorgi": "voice-147", # Male, Georgian, Georgia
|
|
319
|
+
# Greek (Greece)
|
|
320
|
+
"Athina": "voice-158", # Female, Greek, Greece
|
|
321
|
+
"Nestoras": "voice-159", # Male, Greek, Greece (Note: voice-160 is a duplicate name)
|
|
322
|
+
# Gujarati (India)
|
|
323
|
+
"Dhwani": "voice-161", # Female, Gujarati, India
|
|
324
|
+
"Niranjan": "voice-162", # Male, Gujarati, India
|
|
325
|
+
# Hebrew (Israel)
|
|
326
|
+
"Avri": "voice-163", # Male, Hebrew, Israel
|
|
327
|
+
"Hila": "voice-164", # Female, Hebrew, Israel
|
|
328
|
+
# Hindi (India)
|
|
329
|
+
"Madhur": "voice-165", # Male, Hindi, India
|
|
330
|
+
"Swara": "voice-166", # Female, Hindi, India
|
|
331
|
+
# Hungarian (Hungary)
|
|
332
|
+
"Noemi": "voice-167", # Female, Hungarian, Hungary
|
|
333
|
+
"Tamas": "voice-168", # Male, Hungarian, Hungary
|
|
334
|
+
# Icelandic (Iceland)
|
|
335
|
+
"Gudrun": "voice-169", # Female, Icelandic, Iceland
|
|
336
|
+
"Gunnar": "voice-170", # Male, Icelandic, Iceland
|
|
337
|
+
# Indonesian (Indonesia)
|
|
338
|
+
"Ardi": "voice-171", # Male, Indonesian, Indonesia
|
|
339
|
+
"Gadis": "voice-172", # Female, Indonesian, Indonesia
|
|
340
|
+
# Irish (Ireland)
|
|
341
|
+
"Colm": "voice-173", # Male, Irish, Ireland
|
|
342
|
+
"Orla": "voice-174", # Female, Irish, Ireland
|
|
343
|
+
# Italian (Italy)
|
|
344
|
+
"Diego": "voice-175", # Male, Italian, Italy
|
|
345
|
+
"Elsa": "voice-176", # Female, Italian, Italy
|
|
346
|
+
"Isabella": "voice-178", # Female, Italian, Italy
|
|
347
|
+
# Japanese (Japan)
|
|
348
|
+
"Keita": "voice-179", # Male, Japanese, Japan
|
|
349
|
+
"Nanami": "voice-180", # Female, Japanese, Japan
|
|
350
|
+
# Javanese (Indonesia)
|
|
351
|
+
"Dimas": "voice-181", # Male, Javanese, Indonesia
|
|
352
|
+
"Siti": "voice-182", # Female, Javanese, Indonesia
|
|
353
|
+
# Kannada (India)
|
|
354
|
+
"Gagan": "voice-183", # Male, Kannada, India
|
|
355
|
+
"Sapna": "voice-184", # Female, Kannada, India
|
|
356
|
+
# Kazakh (Kazakhstan)
|
|
357
|
+
"Aigul": "voice-185", # Female, Kazakh, Kazakhstan
|
|
358
|
+
"Daulet": "voice-186", # Male, Kazakh, Kazakhstan
|
|
359
|
+
# Khmer (Cambodia)
|
|
360
|
+
"Piseth": "voice-187", # Male, Khmer, Cambodia
|
|
361
|
+
"Sreymom": "voice-188", # Female, Khmer, Cambodia
|
|
362
|
+
# Korean (South Korea)
|
|
363
|
+
"InJoon": "voice-190", # Male, Korean, South Korea
|
|
364
|
+
"SunHi": "voice-191", # Female, Korean, South Korea
|
|
365
|
+
# Lao (Laos)
|
|
366
|
+
"Chanthavong": "voice-192", # Male, Lao, Laos
|
|
367
|
+
"Keomany": "voice-193", # Female, Lao, Laos
|
|
368
|
+
# Latvian (Latvia)
|
|
369
|
+
"Everita": "voice-194", # Female, Latvian, Latvia
|
|
370
|
+
"Nils": "voice-195", # Male, Latvian, Latvia
|
|
371
|
+
# Lithuanian (Lithuania)
|
|
372
|
+
"Leonas": "voice-196", # Male, Lithuanian, Lithuania
|
|
373
|
+
"Ona": "voice-197", # Female, Lithuanian, Lithuania
|
|
374
|
+
# Macedonian (North Macedonia)
|
|
375
|
+
"Aleksandar": "voice-198", # Male, Macedonian, North Macedonia
|
|
376
|
+
"Marija": "voice-199", # Female, Macedonian, North Macedonia
|
|
377
|
+
# Malay (Malaysia)
|
|
378
|
+
"Osman": "voice-200", # Male, Malay, Malaysia
|
|
379
|
+
"Yasmin": "voice-201", # Female, Malay, Malaysia
|
|
380
|
+
# Malayalam (India)
|
|
381
|
+
"Midhun": "voice-202", # Male, Malayalam, India
|
|
382
|
+
"Sobhana": "voice-203", # Female, Malayalam, India
|
|
383
|
+
# Maltese (Malta)
|
|
384
|
+
"Grace": "voice-204", # Female, Maltese, Malta
|
|
385
|
+
"Joseph": "voice-205", # Male, Maltese, Malta
|
|
386
|
+
# Marathi (India)
|
|
387
|
+
"Aarohi": "voice-206", # Female, Marathi, India
|
|
388
|
+
"Manohar": "voice-207", # Male, Marathi, India
|
|
389
|
+
# Mongolian (Mongolia)
|
|
390
|
+
"Bataa": "voice-208", # Male, Mongolian, Mongolia
|
|
391
|
+
"Yesui": "voice-209", # Female, Mongolian, Mongolia
|
|
392
|
+
# Nepali (Nepal)
|
|
393
|
+
"Hemkala": "voice-210", # Female, Nepali, Nepal
|
|
394
|
+
"Sagar": "voice-211", # Male, Nepali, Nepal
|
|
395
|
+
# Norwegian (Norway)
|
|
396
|
+
"Finn": "voice-212", # Male, Norwegian, Norway
|
|
397
|
+
"Pernille": "voice-213", # Female, Norwegian, Norway
|
|
398
|
+
# Pashto (Afghanistan)
|
|
399
|
+
"GulNawaz": "voice-214", # Male, Pashto, Afghanistan
|
|
400
|
+
"Latifa": "voice-215", # Female, Pashto, Afghanistan
|
|
401
|
+
# Persian (Iran)
|
|
402
|
+
"Dilara": "voice-216", # Female, Persian, Iran
|
|
403
|
+
"Farid": "voice-217", # Male, Persian, Iran
|
|
404
|
+
# Polish (Poland)
|
|
405
|
+
"Marek": "voice-218", # Male, Polish, Poland
|
|
406
|
+
"Zofia": "voice-219", # Female, Polish, Poland
|
|
407
|
+
# Portuguese (Brazil)
|
|
408
|
+
"Antonio": "voice-220", # Male, Portuguese, Brazil
|
|
409
|
+
"Francisca": "voice-221", # Female, Portuguese, Brazil
|
|
410
|
+
# Portuguese (Portugal)
|
|
411
|
+
"Duarte": "voice-223", # Male, Portuguese, Portugal
|
|
412
|
+
"Raquel": "voice-224", # Female, Portuguese, Portugal
|
|
413
|
+
# Romanian (Romania)
|
|
414
|
+
"Alina": "voice-225", # Female, Romanian, Romania
|
|
415
|
+
"Emil": "voice-226", # Male, Romanian, Romania
|
|
416
|
+
# Russian (Russia)
|
|
417
|
+
"Dmitry": "voice-227", # Male, Russian, Russia
|
|
418
|
+
"Svetlana": "voice-228", # Female, Russian, Russia
|
|
419
|
+
# Serbian (Serbia)
|
|
420
|
+
"Nicholas": "voice-229", # Male, Serbian, Serbia
|
|
421
|
+
"Sophie": "voice-230", # Female, Serbian, Serbia
|
|
422
|
+
# Sinhala (Sri Lanka)
|
|
423
|
+
"Sameera": "voice-231", # Male, Sinhala, Sri Lanka
|
|
424
|
+
"Thilini": "voice-232", # Female, Sinhala, Sri Lanka
|
|
425
|
+
# Slovak (Slovakia)
|
|
426
|
+
"Lukas": "voice-233", # Male, Slovak, Slovakia
|
|
427
|
+
"Viktoria": "voice-234", # Female, Slovak, Slovakia
|
|
428
|
+
# Slovenian (Slovenia)
|
|
429
|
+
"Petra": "voice-235", # Female, Slovenian, Slovenia
|
|
430
|
+
"Rok": "voice-236", # Male, Slovenian, Slovenia
|
|
431
|
+
# Somali (Somalia)
|
|
432
|
+
"Muuse": "voice-237", # Male, Somali, Somalia
|
|
433
|
+
"Ubax": "voice-238", # Female, Somali, Somalia
|
|
434
|
+
# Sundanese (Indonesia)
|
|
435
|
+
"Jajang": "voice-284", # Male, Sundanese, Indonesia
|
|
436
|
+
"Tuti": "voice-285", # Female, Sundanese, Indonesia
|
|
437
|
+
# Swahili (Kenya)
|
|
438
|
+
"Rafiki": "voice-286", # Male, Swahili, Kenya
|
|
439
|
+
"Zuri": "voice-287", # Female, Swahili, Kenya
|
|
440
|
+
# Swahili (Tanzania)
|
|
441
|
+
"Daudi": "voice-288", # Male, Swahili, Tanzania
|
|
442
|
+
"Rehema": "voice-289", # Female, Swahili, Tanzania
|
|
443
|
+
# Swedish (Sweden)
|
|
444
|
+
"Mattias": "voice-290", # Male, Swedish, Sweden
|
|
445
|
+
"Sofie": "voice-291", # Female, Swedish, Sweden
|
|
446
|
+
# Tamil (India)
|
|
447
|
+
"Pallavi": "voice-292", # Female, Tamil, India
|
|
448
|
+
"Valluvar": "voice-293", # Male, Tamil, India
|
|
449
|
+
# Tamil (Sri Lanka)
|
|
450
|
+
"Kumar": "voice-294", # Male, Tamil, Sri Lanka
|
|
451
|
+
"Saranya": "voice-295", # Female, Tamil, Sri Lanka
|
|
452
|
+
# Tamil (Malaysia)
|
|
453
|
+
"Kani": "voice-296", # Female, Tamil, Malaysia
|
|
454
|
+
"Surya": "voice-297", # Male, Tamil, Malaysia
|
|
455
|
+
# Tamil (Singapore)
|
|
456
|
+
"Anbu": "voice-298", # Male, Tamil, Singapore
|
|
457
|
+
"Venba": "voice-299", # Female, Tamil, Singapore
|
|
458
|
+
# Telugu (India)
|
|
459
|
+
"Mohan": "voice-300", # Male, Telugu, India
|
|
460
|
+
"Shruti": "voice-301", # Female, Telugu, India
|
|
461
|
+
# Thai (Thailand)
|
|
462
|
+
"Niwat": "voice-302", # Male, Thai, Thailand
|
|
463
|
+
"Premwadee": "voice-303", # Female, Thai, Thailand
|
|
464
|
+
# Turkish (Turkey)
|
|
465
|
+
"Ahmet": "voice-304", # Male, Turkish, Turkey
|
|
466
|
+
"Emel": "voice-305", # Female, Turkish, Turkey
|
|
467
|
+
# Ukrainian (Ukraine)
|
|
468
|
+
"Ostap": "voice-306", # Male, Ukrainian, Ukraine
|
|
469
|
+
"Polina": "voice-307", # Female, Ukrainian, Ukraine
|
|
470
|
+
# Urdu (India)
|
|
471
|
+
"Gul": "voice-308", # Female, Urdu, India
|
|
472
|
+
"Salman": "voice-309", # Male, Urdu, India
|
|
473
|
+
# Urdu (Pakistan)
|
|
474
|
+
"Asad": "voice-310", # Male, Urdu, Pakistan
|
|
475
|
+
"Uzma": "voice-311", # Female, Urdu, Pakistan
|
|
476
|
+
# Uzbek (Uzbekistan)
|
|
477
|
+
"Madina": "voice-312", # Female, Uzbek, Uzbekistan
|
|
478
|
+
"Sardor": "voice-313", # Male, Uzbek, Uzbekistan
|
|
479
|
+
# Vietnamese (Vietnam)
|
|
480
|
+
"HoaiMy": "voice-314", # Female, Vietnamese, Vietnam
|
|
481
|
+
"NamMinh": "voice-315", # Male, Vietnamese, Vietnam
|
|
482
|
+
# Welsh (United Kingdom)
|
|
483
|
+
"Aled": "voice-316", # Male, Welsh, United Kingdom
|
|
484
|
+
"Nia": "voice-317", # Female, Welsh, United Kingdom
|
|
485
|
+
# Zulu (South Africa)
|
|
486
|
+
"Thando": "voice-318", # Female, Zulu, South Africa
|
|
487
|
+
"Themba": "voice-319", # Male, Zulu, South Africa
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
def __init__(self, timeout: int = 20, proxies: dict = None):
|
|
491
|
+
"""Initializes the SpeechMa TTS client."""
|
|
492
|
+
super().__init__()
|
|
493
|
+
self.api_url = "https://speechma.com/com.api/tts-api.php"
|
|
494
|
+
self.session = requests.Session()
|
|
495
|
+
self.session.headers.update(self.headers)
|
|
496
|
+
if proxies:
|
|
497
|
+
self.session.proxies.update(proxies)
|
|
498
|
+
self.timeout = timeout
|
|
499
|
+
|
|
500
|
+
def tts(self, text: str, voice: str = "Emma", pitch: int = 0, rate: int = 0) -> str:
|
|
501
|
+
"""
|
|
502
|
+
Converts text to speech using the SpeechMa API and saves it to a file.
|
|
503
|
+
|
|
504
|
+
Args:
|
|
505
|
+
text (str): The text to convert to speech
|
|
506
|
+
voice (str): The voice to use for TTS (default: "Emma")
|
|
507
|
+
pitch (int): Voice pitch adjustment (-10 to 10, default: 0)
|
|
508
|
+
rate (int): Voice rate/speed adjustment (-10 to 10, default: 0)
|
|
509
|
+
|
|
510
|
+
Returns:
|
|
511
|
+
str: Path to the generated audio file
|
|
512
|
+
|
|
513
|
+
Raises:
|
|
514
|
+
exceptions.FailedToGenerateResponseError: If there is an error generating or saving the audio.
|
|
515
|
+
"""
|
|
516
|
+
assert (
|
|
517
|
+
voice in self.all_voices
|
|
518
|
+
), f"Voice '{voice}' not one of [{', '.join(self.all_voices.keys())}]"
|
|
519
|
+
|
|
520
|
+
filename = pathlib.Path(tempfile.mktemp(suffix=".mp3", dir=self.temp_dir))
|
|
521
|
+
voice_id = self.all_voices[voice]
|
|
522
|
+
|
|
523
|
+
# Prepare payload for the job-based API
|
|
524
|
+
payload = {
|
|
525
|
+
"text": text,
|
|
526
|
+
"voice": voice_id,
|
|
527
|
+
"pitch": pitch,
|
|
528
|
+
"rate": rate,
|
|
529
|
+
"volume": 100
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
try:
|
|
533
|
+
response = self.session.post(
|
|
534
|
+
self.api_url,
|
|
535
|
+
headers=self.headers,
|
|
536
|
+
json=payload,
|
|
537
|
+
timeout=self.timeout
|
|
538
|
+
)
|
|
539
|
+
response.raise_for_status()
|
|
540
|
+
resp_json = response.json()
|
|
541
|
+
if not resp_json.get("success") or "data" not in resp_json or "job_id" not in resp_json["data"]:
|
|
542
|
+
raise exceptions.FailedToGenerateResponseError(f"SpeechMa API error: {resp_json}")
|
|
543
|
+
job_id = resp_json["data"]["job_id"]
|
|
544
|
+
|
|
545
|
+
# Poll for job completion
|
|
546
|
+
status_url = f"https://speechma.com/com.api/tts-api.php/status/{job_id}"
|
|
547
|
+
for _ in range(30): # up to ~30 seconds
|
|
548
|
+
status_resp = self.session.get(
|
|
549
|
+
status_url,
|
|
550
|
+
headers=self.headers,
|
|
551
|
+
timeout=self.timeout
|
|
552
|
+
)
|
|
553
|
+
status_resp.raise_for_status()
|
|
554
|
+
status_json = status_resp.json()
|
|
555
|
+
if status_json.get("success") and status_json.get("data", {}).get("status") == "completed":
|
|
556
|
+
break
|
|
557
|
+
time.sleep(1)
|
|
558
|
+
else:
|
|
559
|
+
raise exceptions.FailedToGenerateResponseError("TTS job did not complete in time.")
|
|
560
|
+
|
|
561
|
+
# Download the audio file (API provides a URL in the status response)
|
|
562
|
+
data = status_json["data"]
|
|
563
|
+
audio_url = f"https://speechma.com/com.api/tts-api.php/audio/{job_id}"
|
|
564
|
+
audio_resp = self.session.get(audio_url, timeout=self.timeout)
|
|
565
|
+
audio_resp.raise_for_status()
|
|
566
|
+
with open(filename, 'wb') as f:
|
|
567
|
+
f.write(audio_resp.content)
|
|
568
|
+
return filename.as_posix()
|
|
569
|
+
|
|
570
|
+
except requests.exceptions.RequestException as e:
|
|
571
|
+
raise exceptions.FailedToGenerateResponseError(
|
|
572
|
+
f"Failed to perform the operation: {e}"
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
# Example usage
|
|
576
|
+
if __name__ == "__main__":
|
|
577
|
+
speechma = SpeechMaTTS()
|
|
578
|
+
text = "This is a test of the SpeechMa text-to-speech API. It supports multiple sentences."
|
|
579
|
+
audio_file = speechma.tts(text, voice="Emma")
|
|
580
|
+
print(f"Audio saved to: {audio_file}")
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import requests
|
|
3
|
+
import pathlib
|
|
4
|
+
import tempfile
|
|
5
|
+
from io import BytesIO
|
|
6
|
+
from webscout import exceptions
|
|
7
|
+
from webscout.litagent import LitAgent
|
|
8
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
9
|
+
from webscout.Provider.TTS import utils
|
|
10
|
+
from webscout.Provider.TTS.base import BaseTTSProvider
|
|
11
|
+
|
|
12
|
+
class SthirTTS(BaseTTSProvider):
|
|
13
|
+
"""
|
|
14
|
+
Text-to-speech provider using the Sthir.org TTS API.
|
|
15
|
+
"""
|
|
16
|
+
headers = {
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
"User-Agent": LitAgent().random(),
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
all_voices = {
|
|
22
|
+
"aura-luna-en": "Sophie (American, Feminine)",
|
|
23
|
+
"aura-stella-en": "Isabella (American, Feminine)",
|
|
24
|
+
"aura-athena-en": "Emma (British, Feminine)",
|
|
25
|
+
"aura-hera-en": "Victoria (American, Feminine)",
|
|
26
|
+
"aura-asteria-en": "Maria (American, Feminine)",
|
|
27
|
+
"aura-arcas-en": "Alex (American, Masculine)",
|
|
28
|
+
"aura-zeus-en": "Thomas (American, Masculine)",
|
|
29
|
+
"aura-perseus-en": "Michael (American, Masculine)",
|
|
30
|
+
"aura-angus-en": "Connor (Irish, Masculine)",
|
|
31
|
+
"aura-orpheus-en": "James (American, Masculine)",
|
|
32
|
+
"aura-helios-en": "William (British, Masculine)",
|
|
33
|
+
"aura-orion-en": "Daniel (American, Masculine)",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
def __init__(self, timeout: int = 20, proxies: dict = None):
|
|
37
|
+
"""Initializes the SthirTTS client."""
|
|
38
|
+
super().__init__()
|
|
39
|
+
self.api_url = "https://sthir.org/com.api/tts-api.php"
|
|
40
|
+
self.session = requests.Session()
|
|
41
|
+
self.session.headers.update(self.headers)
|
|
42
|
+
if proxies:
|
|
43
|
+
self.session.proxies.update(proxies)
|
|
44
|
+
self.timeout = timeout
|
|
45
|
+
|
|
46
|
+
def tts(self, text: str, voice: str = "aura-luna-en") -> str:
|
|
47
|
+
"""
|
|
48
|
+
Converts text to speech using the Sthir.org API and saves it to a file.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
text (str): The text to convert to speech
|
|
52
|
+
voice (str): The voice to use for TTS (default: "aura-luna-en")
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
str: Path to the generated audio file
|
|
56
|
+
|
|
57
|
+
Raises:
|
|
58
|
+
exceptions.FailedToGenerateResponseError: If there is an error generating or saving the audio.
|
|
59
|
+
"""
|
|
60
|
+
assert (
|
|
61
|
+
voice in self.all_voices
|
|
62
|
+
), f"Voice '{voice}' not one of [{', '.join(self.all_voices.keys())}]"
|
|
63
|
+
|
|
64
|
+
filename = pathlib.Path(tempfile.mktemp(suffix=".mp3", dir=self.temp_dir))
|
|
65
|
+
payload = {"text": text, "voice": voice}
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
response = self.session.post(
|
|
69
|
+
self.api_url,
|
|
70
|
+
headers=self.headers,
|
|
71
|
+
json=payload,
|
|
72
|
+
timeout=self.timeout
|
|
73
|
+
)
|
|
74
|
+
if response.status_code == 200 and len(response.content) > 0:
|
|
75
|
+
with open(filename, "wb") as f:
|
|
76
|
+
f.write(response.content)
|
|
77
|
+
return filename.as_posix()
|
|
78
|
+
else:
|
|
79
|
+
try:
|
|
80
|
+
error_data = response.json()
|
|
81
|
+
if "error" in error_data:
|
|
82
|
+
raise exceptions.FailedToGenerateResponseError(f"API error: {error_data['error']}")
|
|
83
|
+
except Exception:
|
|
84
|
+
pass
|
|
85
|
+
raise exceptions.FailedToGenerateResponseError(f"Sthir API error: {response.text}")
|
|
86
|
+
except Exception as e:
|
|
87
|
+
raise exceptions.FailedToGenerateResponseError(f"Failed to perform the operation: {e}")
|
|
88
|
+
|
|
89
|
+
# Example usage
|
|
90
|
+
if __name__ == "__main__":
|
|
91
|
+
sthir = SthirTTS()
|
|
92
|
+
text = "This is a test of the Sthir.org text-to-speech API. It supports multiple voices."
|
|
93
|
+
audio_file = sthir.tts(text, voice="aura-luna-en")
|
|
94
|
+
print(f"Audio saved to: {audio_file}")
|