XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 1
返回提交历史

XFEstudio/gpt4free

feat: add gTTS provider and update EdgeTTS & media docs

- In **docs/media.md**: - Updated the import to include `gTTS` alongside `EdgeTTS`, `Gemini`, and `PollinationsAI`. - Changed the audio parameter for EdgeTTS from `"locale": "en-US"` to `"language": "en"`. - Added a new code example demonstrating how to use the gTTS provider and save the output as "google-tts.mp3". - In **g4f/Provider/__init__.py**: - Replaced the import of `EdgeTTS` with a wildcard import (`from .audio import *`) to include all audio providers. - In **g4f/Provider/audio/EdgeTTS.py**: - Added a new class attribute `model_id = "edge-tts"`. - Changed the voice selection logic to use `cls.model_id` instead of the hardcoded string "edge-tts". - Updated the filename generation to use `[cls.model_id]` instead of `[cls.default_model]`. - In **g4f/Provider/audio/__init__.py**: - Added an import for the new `gTTS` provider. - Added new file **g4f/Provider/audio/gTTS.py**: - Implements the gTTS provider using the `gtts` library. - Defines provider attributes (`label`, `working`, `model_id`, etc.) and generates audio using a similar structure to EdgeTTS. - In **g4f/image/__init__.py**: - Modified the `get_extension` function to extract the extension using `.lower().lstrip('.')` instead of slicing with `[1:]`.

099d7283
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

6 个文件 +90 -7
Modified docs/media.md +6 -2
@@ -33,7 +33,7 @@ asyncio.run(main())
33 33 ```python
34 34 from g4f.client import Client
35 35
36 from g4f.Provider import EdgeTTS, Gemini, PollinationsAI
36 from g4f.Provider import gTTS, EdgeTTS, Gemini, PollinationsAI
37 37
38 38 client = Client(provider=PollinationsAI)
39 39 response = client.media.generate("Hello", audio={"voice": "alloy", "format": "mp3"})
@@ -48,8 +48,12 @@ response = client.media.generate("Hello", model="gemini-audio")
48 48 response.data[0].save("gemini.ogx")
49 49
50 50 client = Client(provider=EdgeTTS)
51 response = client.media.generate("Hello", audio={"locale": "en-US"})
51 response = client.media.generate("Hello", audio={"language": "en"})
52 52 response.data[0].save("edge-tts.mp3")
53
54 client = Client(provider=gTTS)
55 response = client.media.generate("Hello", audio={"language": "en"})
56 response.data[0].save("google-tts.mp3")
53 57 ```
54 58
55 59 #### **Transcribe an Audio File:**
Modified g4f/Provider/__init__.py +1 -1
@@ -29,7 +29,7 @@ try:
29 29 except ImportError as e:
30 30 debug.error("MiniMax providers not loaded:", e)
31 31 try:
32 from .audio import EdgeTTS
32 from .audio import *
33 33 except ImportError as e:
34 34 debug.error("Audio providers not loaded:", e)
35 35
Modified g4f/Provider/audio/EdgeTTS.py +3 -2
@@ -20,6 +20,7 @@ from ..helper import format_image_prompt
20 20 class EdgeTTS(AsyncGeneratorProvider, ProviderModelMixin):
21 21 label = "Edge TTS"
22 22 working = has_edge_tts
23 model_id = "edge-tts"
23 24 default_language = "en"
24 25 default_locale = "en-US"
25 26 default_format = "mp3"
@@ -45,7 +46,7 @@ class EdgeTTS(AsyncGeneratorProvider, ProviderModelMixin):
45 46 prompt = format_image_prompt(messages, prompt)
46 47 if not prompt:
47 48 raise ValueError("Prompt is empty.")
48 voice = audio.get("voice", model if model and model != "edge-tts" else None)
49 voice = audio.get("voice", model if model and model != cls.model_id else None)
49 50 if not voice:
50 51 voices = await VoicesManager.create()
51 52 if "locale" in audio:
@@ -62,7 +63,7 @@ class EdgeTTS(AsyncGeneratorProvider, ProviderModelMixin):
62 63 voice = random.choice(voices)["Name"]
63 64
64 65 format = audio.get("format", cls.default_format)
65 filename = get_filename([cls.default_model], prompt, f".{format}", prompt)
66 filename = get_filename([cls.model_id], prompt, f".{format}", prompt)
66 67 target_path = os.path.join(get_media_dir(), filename)
67 68 ensure_media_dir()
68 69
Modified g4f/Provider/audio/__init__.py +2 -1
@@ -1 +1,2 @@
1 from .EdgeTTS import EdgeTTS
1 from .EdgeTTS import EdgeTTS
2 from .gTTS import gTTS
Added g4f/Provider/audio/gTTS.py +77 -0
@@ -0,0 +1,77 @@
1 from __future__ import annotations
2
3 import os
4 import random
5 import asyncio
6
7 try:
8 from gtts import gTTS as gTTS_Service
9 has_gtts = True
10 except ImportError:
11 has_gtts = False
12
13 from ...typing import AsyncResult, Messages
14 from ...providers.response import AudioResponse
15 from ...image.copy_images import get_filename, get_media_dir, ensure_media_dir
16 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
17 from ..helper import format_image_prompt
18
19 locals = {
20 "en-AU": ["English (Australia)", "en", "com.au"],
21 "en-GB": ["English (United Kingdom)", "en", "co.uk"],
22 "en-US": ["English (United States)", "en", "us"],
23 "en-CA": ["English (Canada)", "en", "ca"],
24 "en-IN": ["English (India)", "en", "co.in"],
25 "en-IE": ["English (Ireland)", "en", "ie"],
26 "en-ZA": ["English (South Africa)", "en", "co.za"],
27 "en-NG": ["English (Nigeria)", "en", "com.ng"],
28 "fr-CA": ["French (Canada)", "fr", "ca"],
29 "fr-FR": ["French (France)", "fr", "fr"],
30 "de-DE": ["German (Germany)", "de", "de"],
31 "zh-CN": ["Mandarin (China Mainland)", "zh-CN", "com"],
32 "zh-TW": ["Mandarin (Taiwan)", "zh-TW", "com"],
33 "pt-BR": ["Portuguese (Brazil)", "pt", "com.br"],
34 "pt-PT": ["Portuguese (Portugal)", "pt", "pt"],
35 "es-MX": ["Spanish (Mexico)", "es", "com.mx"],
36 "es-ES": ["Spanish (Spain)", "es", "es"],
37 "es-US": ["Spanish (United States)", "es", "us"],
38 }
39 models = {locale[0]: {"lang": locale[1], "tld": locale[2]} for locale in locals.values()}
40
41 class gTTS(AsyncGeneratorProvider, ProviderModelMixin):
42 label = "gTTS (Google Text-to-Speech)"
43 working = has_gtts
44 model_id = "google-tts"
45 default_language = "en"
46 default_tld = "com"
47 default_format = "mp3"
48 models = list(models.keys())
49
50 @classmethod
51 async def create_async_generator(
52 cls,
53 model: str,
54 messages: Messages,
55 prompt: str = None,
56 audio: dict = {},
57 **kwargs
58 ) -> AsyncResult:
59 prompt = format_image_prompt(messages, prompt)
60 if not prompt:
61 raise ValueError("Prompt is empty.")
62 format = audio.get("format", cls.default_format)
63 filename = get_filename([cls.model_id], prompt, f".{format}", prompt)
64 target_path = os.path.join(get_media_dir(), filename)
65 ensure_media_dir()
66
67 gTTS_Service(
68 prompt,
69 **{
70 "lang": audio.get("language", cls.default_language),
71 "tld": audio.get("tld", cls.default_tld),
72 "slow": audio.get("slow", False),
73 **models.get(model, {})
74 }
75 ).save(target_path)
76
77 yield AudioResponse(f"/media/{filename}", audio=audio, text=prompt)
Modified g4f/image/__init__.py +1 -1
@@ -79,7 +79,7 @@ def to_image(image: ImageType, is_svg: bool = False) -> Image:
79 79
80 80 def get_extension(filename: str) -> Optional[str]:
81 81 if '.' in filename:
82 ext = os.path.splitext(filename)[1][1:].lower()
82 ext = os.path.splitext(filename)[1].lower().lstrip('.')
83 83 return ext if ext in EXTENSIONS_MAP else None
84 84 return None
85 85