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

XFEstudio/gpt4free

``` docs: update media examples and add parameter details for TTS providers

- Updated EdgeTTS example to mention additional audio parameters (`rate`, `volume`, `pitch`) - Updated gTTS example to include support for `tld` and `slow` audio parameters - Modified the EdgeTTS provider to use `get_last_message` instead of `format_image_prompt` for prompt handling - Modified the gTTS provider to use `get_last_message` instead of `format_image_prompt` for prompt handling - Refactored audio file generation logic in the gTTS provider to handle `language` parameter and update the voice model accordingly - Refactored backend API code to introduce `cast_str` function for processing responses, including cache management and response formatting - Fixed a bug in `AnyProvider` where the model string check would fail if the model was `None` - Added check in `to_string` helper function to handle `None` values correctly ```

2e928c3b
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

6 个文件 +44 -25
Modified docs/media.md +5 -1
@@ -51,9 +51,13 @@ client = Client(provider=EdgeTTS)
51 51 response = client.media.generate("Hello", audio={"language": "en"})
52 52 response.data[0].save("edge-tts.mp3")
53 53
54 # The EdgeTTS provider also support the audio parameters `rate`, `volume` and `pitch`
55
54 56 client = Client(provider=gTTS)
55 response = client.media.generate("Hello", audio={"language": "en"})
57 response = client.media.generate("Hello", audio={"language": "en-US"})
56 58 response.data[0].save("google-tts.mp3")
59
60 # The gTTS provider also support the audio parameters `tld` and `slow`
57 61 ```
58 62
59 63 #### **Transcribe an Audio File:**
Modified g4f/Provider/audio/EdgeTTS.py +2 -2
@@ -15,7 +15,7 @@ from ...typing import AsyncResult, Messages
15 15 from ...providers.response import AudioResponse
16 16 from ...image.copy_images import get_filename, get_media_dir, ensure_media_dir
17 17 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
18 from ..helper import format_image_prompt
18 from ..helper import get_last_message
19 19
20 20 class EdgeTTS(AsyncGeneratorProvider, ProviderModelMixin):
21 21 label = "Edge TTS"
@@ -43,7 +43,7 @@ class EdgeTTS(AsyncGeneratorProvider, ProviderModelMixin):
43 43 audio: dict = {},
44 44 **kwargs
45 45 ) -> AsyncResult:
46 prompt = format_image_prompt(messages, prompt)
46 prompt = get_last_message(messages, prompt)
47 47 if not prompt:
48 48 raise ValueError("Prompt is empty.")
49 49 voice = audio.get("voice", model if model and model != cls.model_id else None)
Modified g4f/Provider/audio/gTTS.py +5 -4
@@ -1,8 +1,6 @@
1 1 from __future__ import annotations
2 2
3 3 import os
4 import random
5 import asyncio
6 4
7 5 try:
8 6 from gtts import gTTS as gTTS_Service
@@ -14,7 +12,7 @@ from ...typing import AsyncResult, Messages
14 12 from ...providers.response import AudioResponse
15 13 from ...image.copy_images import get_filename, get_media_dir, ensure_media_dir
16 14 from ..base_provider import AsyncGeneratorProvider, ProviderModelMixin
17 from ..helper import format_image_prompt
15 from ..helper import get_last_message
18 16
19 17 locals = {
20 18 "en-AU": ["English (Australia)", "en", "com.au"],
@@ -56,7 +54,7 @@ class gTTS(AsyncGeneratorProvider, ProviderModelMixin):
56 54 audio: dict = {},
57 55 **kwargs
58 56 ) -> AsyncResult:
59 prompt = format_image_prompt(messages, prompt)
57 prompt = get_last_message(messages, prompt)
60 58 if not prompt:
61 59 raise ValueError("Prompt is empty.")
62 60 format = audio.get("format", cls.default_format)
@@ -64,6 +62,9 @@ class gTTS(AsyncGeneratorProvider, ProviderModelMixin):
64 62 target_path = os.path.join(get_media_dir(), filename)
65 63 ensure_media_dir()
66 64
65 if "language" in audio:
66 model = locals[audio["language"]][0] if audio["language"] in locals else model
67
67 68 gTTS_Service(
68 69 prompt,
69 70 **{
Modified g4f/gui/server/backend_api.py +20 -16
@@ -63,7 +63,7 @@ class Backend_Api(Api):
63 63 if app.demo:
64 64 @app.route('/', methods=['GET'])
65 65 def home():
66 client_id = os.environ.get("OAUTH_CLIENT_ID", "ed074164-4f8d-4fb2-8bec-44952707965e")
66 client_id = os.environ.get("OAUTH_CLIENT_ID", "")
67 67 backend_url = os.environ.get("G4F_BACKEND_URL", "")
68 68 return render_template('demo.html', backend_url=backend_url, client_id=client_id)
69 69 else:
@@ -248,6 +248,14 @@ class Backend_Api(Api):
248 248 "ignore_stream": not request.args.get("stream"),
249 249 "tool_calls": tool_calls,
250 250 }
251 def cast_str(response):
252 for chunk in response:
253 if isinstance(chunk, FinishReason):
254 yield f"[{chunk.reason}]" if chunk.reason != "stop" else ""
255 elif not isinstance(chunk, Exception):
256 chunk = str(chunk)
257 if chunk:
258 yield chunk
251 259 if cache_id:
252 260 cache_id = sha256(cache_id.encode() + json.dumps(parameters, sort_keys=True).encode()).hexdigest()
253 261 cache_dir = Path(get_cookies_dir()) / ".scrape_cache" / "create"
@@ -255,26 +263,22 @@ class Backend_Api(Api):
255 263 if cache_file.exists():
256 264 with cache_file.open("r") as f:
257 265 response = f.read()
258 else:
266 if not response:
259 267 response = iter_run_tools(ChatCompletion.create, **parameters)
260 268 cache_dir.mkdir(parents=True, exist_ok=True)
261 copy_response = [chunk for chunk in response]
262 with cache_file.open("w") as f:
263 for chunk in copy_response:
264 f.write(str(chunk))
269 copy_response = cast_str(response)
270 if copy_response:
271 with cache_file.open("w") as f:
272 for chunk in copy_response:
273 f.write(chunk)
265 274 response = copy_response
266 275 else:
267 response = iter_run_tools(ChatCompletion.create, **parameters)
268
276 response = cast_str(iter_run_tools(ChatCompletion.create, **parameters))
269 277 if do_filter_markdown:
270 return Response(filter_markdown("".join([str(chunk) for chunk in response]), do_filter_markdown), mimetype='text/plain')
271 def cast_str():
272 for chunk in response:
273 if isinstance(chunk, FinishReason):
274 yield f"[{chunk.reason}]" if chunk.reason != "stop" else ""
275 elif not isinstance(chunk, Exception):
276 yield str(chunk)
277 return Response(cast_str(), mimetype='text/plain')
278 is_true_filter_markdown = do_filter_markdown.lower() in ["true", "1"]
279 response = "".join(response)
280 return Response(filter_markdown(response, do_filter_markdown, response if is_true_filter_markdown else ""), mimetype='text/plain')
281 return Response(response, mimetype='text/plain')
278 282 except Exception as e:
279 283 logger.exception(e)
280 284 return jsonify({"error": {"message": f"{type(e).__name__}: {e}"}}), 500
Modified g4f/providers/any_provider.py +1 -1
@@ -117,7 +117,7 @@ class AnyProvider(AsyncGeneratorProvider, ProviderModelMixin):
117 117 **kwargs
118 118 ) -> AsyncResult:
119 119 providers = []
120 if ":" in model:
120 if model and ":" in model:
121 121 providers = model.split(":")
122 122 model = providers.pop()
123 123 providers = [getattr(Provider, provider) for provider in providers]
Modified g4f/providers/helper.py +11 -1
@@ -22,6 +22,8 @@ def to_string(value) -> str:
22 22 return ""
23 23 elif isinstance(value, list):
24 24 return "".join([to_string(v) for v in value if v.get("type", "text") == "text"])
25 elif value is None:
26 return ""
25 27 return str(value)
26 28
27 29 def render_messages(messages: Messages) -> Iterator:
@@ -71,13 +73,21 @@ def get_last_user_message(messages: Messages) -> str:
71 73 while last_message is not None and messages:
72 74 last_message = messages.pop()
73 75 if last_message["role"] == "user":
74 content = to_string(last_message["content"]).strip()
76 content = to_string(last_message.get("content")).strip()
75 77 if content:
76 78 user_messages.append(content)
77 79 else:
78 80 return "\n".join(user_messages[::-1])
79 81 return "\n".join(user_messages[::-1])
80 82
83 def get_last_message(messages: Messages, prompt: str = None) -> str:
84 if prompt is None:
85 for message in messages[::-1]:
86 content = to_string(message.get("content")).strip()
87 if content:
88 prompt = content
89 return prompt
90
81 91 def format_image_prompt(messages, prompt: str = None) -> str:
82 92 if prompt is None:
83 93 return get_last_user_message(messages)