MeUtils 2025.6.6.18.15.9__py3-none-any.whl → 2025.6.9.9.17.14__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.
@@ -370,7 +370,7 @@ meutils/apis/dreamfaceapp/videos.py,sha256=xtz4GYRTdVE-D7xxFpSaH5Kl5ewXDx9Ogvtkf
370
370
  meutils/apis/fal/__init__.py,sha256=A7w3ZAS7Tv20N4X4Em6NshDxKSCPAzaPxHJTbM3BbyM,272
371
371
  meutils/apis/fal/chat.py,sha256=yReABuCWfXOEt7tZax03XIX5KBlfBo2DlEOp2EpiGOM,2641
372
372
  meutils/apis/fal/files.py,sha256=Gppdo96uw8-TCDr8P691jV7dK9Si-E-kJXFJR5BVt-Q,1373
373
- meutils/apis/fal/images.py,sha256=sqeknU7gMhHCg-1-b9gbQF3kWdSvq7fQusQNYTU2Cdg,12010
373
+ meutils/apis/fal/images.py,sha256=eFpG1kjn5vxpwk_M-bOI2teUjTz7VLj6akraExFJm3k,12265
374
374
  meutils/apis/fal/images_.py,sha256=C-C1TTQtMJ6RRcd-4FeYPn0R5IpPRPUFmBbrTVs_ypA,1446
375
375
  meutils/apis/fal/kling_videos.py,sha256=kL4SRpZafRSCRODtiNqeXauxfamHNdcBTE65BrG1rVA,2554
376
376
  meutils/apis/fal/pd.py,sha256=oPrMK_FJqohl2Kf0U0it8SqgvIlSEYFcSX8sfVkD8bU,311
@@ -395,7 +395,7 @@ meutils/apis/hailuoai/hasha_new.py,sha256=1sD3fxmxYrEufmPaJZGAkYJoHKO85hfLXemnY-
395
395
  meutils/apis/hailuoai/images.py,sha256=2SLRKnzz2jdHHVwDzLdJetXZpvn9Mkzjrr_1gJPTIFI,19848
396
396
  meutils/apis/hailuoai/music.py,sha256=S_oi-ZDbocTfbRgREdXtGx50xzUc1PCZGuxmr917E7M,265
397
397
  meutils/apis/hailuoai/upload.py,sha256=22S6W6hGQhUquVKqh7QCkXb6KHDl3iMKKi6Z0AJdFEI,6501
398
- meutils/apis/hailuoai/videos.py,sha256=rtDsSt3ckAfkSMX-N2e_kpM-na7D8Lrt1j5j7r1b-hg,22856
398
+ meutils/apis/hailuoai/videos.py,sha256=9wRIWdV8ToggYK0rjA2HR8eRm7aCTOdRvwL81PBKEtc,23260
399
399
  meutils/apis/hailuoai/yy.py,sha256=uBwtpMhCE4lQyDqEsua4eupGAU0A2N0UJN20pE1tOUo,8962
400
400
  meutils/apis/hf/__init__.py,sha256=ZZoRl8yNYekoMhE__67XXBKNSYJaLgjtaa0netjJKUU,271
401
401
  meutils/apis/hf/got_ocr.py,sha256=pZURFpryDh_Ak6PNiARztOzYgkjVrfScJ5-0XzMBrzI,1776
@@ -431,13 +431,22 @@ meutils/apis/jiema/__init__.py,sha256=YBybggoDRYCNYcwJOypxR7MzfTjIhqO7BkGlTt7NDo
431
431
  meutils/apis/jiema/yezi.py,sha256=26vhnA3lC5049Rqx-CHO-wyGKbdZAfvjEOG90W38cr0,3675
432
432
  meutils/apis/jimeng/__init__.py,sha256=ENdwkppOOekt9Qzy_50TyA7lzNEqo0TpZcF7d2rYBhc,245
433
433
  meutils/apis/jimeng/audio.py,sha256=i-SHYXMl5mRfFksu2dedDjH2CppXclho3jYx-6FqImg,6627
434
- meutils/apis/jimeng/common.py,sha256=FJE9qOzu3qrZwLvYTLopndAS1dpj0DCloxlRn37GmJ8,7546
434
+ meutils/apis/jimeng/common.py,sha256=LFuhgY-KKE661Kf5oY0xAA1LhNu6ErGJ6SflSJPVHkE,7546
435
435
  meutils/apis/jimeng/doubao_images.py,sha256=Aeq1hve2PiO3baP50Augsu0u2YFlC7r_X5jgnDqv6y4,2082
436
436
  meutils/apis/jimeng/doubao_utils.py,sha256=d9KDNkqKN4oxaJRAeGNMouRvzHEhIRXzN3T_HjtTXdM,6025
437
437
  meutils/apis/jimeng/files.py,sha256=AlsAlQGufGm84TldUBLFZpZQGD6INN5xIwHql9ocPj4,11310
438
- meutils/apis/jimeng/images.py,sha256=c8kUrFTA3i_Pua3M76gAMZcMNNfi1LeqgKF1h_6o-qs,23013
438
+ meutils/apis/jimeng/images.py,sha256=AO1Qvm-zpIU5hJegnf_zseIYE1C58wzfyje6Db5TzOk,23001
439
439
  meutils/apis/jimeng/videos.py,sha256=MRDXz96BYEuS4vVCHeXaoNE6nfpq0B6UCf1_dafCE-8,6127
440
440
  meutils/apis/jimeng/videos_videos.py,sha256=A6oWLKcrb6YMIumqUMQS3KVP9bhOEKLUOIlAUlbREmE,12259
441
+ meutils/apis/jimeng_global/__init__.py,sha256=ENdwkppOOekt9Qzy_50TyA7lzNEqo0TpZcF7d2rYBhc,245
442
+ meutils/apis/jimeng_global/audio.py,sha256=i-SHYXMl5mRfFksu2dedDjH2CppXclho3jYx-6FqImg,6627
443
+ meutils/apis/jimeng_global/common.py,sha256=PgHDD3UcXrTcctve67n0gdHVJYObhjWyALIkh2gj3Nc,7565
444
+ meutils/apis/jimeng_global/doubao_images.py,sha256=Aeq1hve2PiO3baP50Augsu0u2YFlC7r_X5jgnDqv6y4,2082
445
+ meutils/apis/jimeng_global/doubao_utils.py,sha256=d9KDNkqKN4oxaJRAeGNMouRvzHEhIRXzN3T_HjtTXdM,6025
446
+ meutils/apis/jimeng_global/files.py,sha256=AlsAlQGufGm84TldUBLFZpZQGD6INN5xIwHql9ocPj4,11310
447
+ meutils/apis/jimeng_global/images.py,sha256=Vjnpxb4l_vE_FbMsouUFN3TpCLlABqGczNrq4729LjQ,26804
448
+ meutils/apis/jimeng_global/videos.py,sha256=MRDXz96BYEuS4vVCHeXaoNE6nfpq0B6UCf1_dafCE-8,6127
449
+ meutils/apis/jimeng_global/videos_videos.py,sha256=A6oWLKcrb6YMIumqUMQS3KVP9bhOEKLUOIlAUlbREmE,12259
441
450
  meutils/apis/jina/__init__.py,sha256=WnZ4LOv-bzC1brd5FZHOHmgq4c0UaFbnksEj2_LzXxQ,292
442
451
  meutils/apis/jina/common.py,sha256=dwSJboUcZtvBTKRcvAUcgMD933VfYCUBDdtxbw1ioiE,1099
443
452
  meutils/apis/kling/__init__.py,sha256=pKz40SEjui1dhHBD-icyNTJOYhzLvxLxJCwszuH4vio,271
@@ -580,7 +589,7 @@ meutils/config_utils/lark_utils/demo.py,sha256=3g0Fs7oLaeW75T60gYWMLgyNg1OnfOjfH
580
589
  meutils/config_utils/lark_utils/x.py,sha256=MlMQGhehP9xMEgetxVCX68XFaosfKoW1JA5cZ3JqN2w,1857
581
590
  meutils/crawlers/__init__.py,sha256=TBU4xA-IOsHV-0yIkW7YXxn_QT7TT8NncqxO7IykEfs,271
582
591
  meutils/data/SimHei.ttf,sha256=-XEnekS5yHP_URkT4XBI2w22ylV-KxudhkeIYFbrILA,10062565
583
- meutils/data/VERSION,sha256=nt7sFxmiev9n2sk-Uz7Mu6Ujiz0lX_jA2ZWAjHX8S4o,19
592
+ meutils/data/VERSION,sha256=Gl0iXFz3wvWeWjqvFSbV2uVXKaomwD3fSou71Hj6j_s,19
584
593
  meutils/data/_FLAG,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
585
594
  meutils/data/_SUCCESS,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
586
595
  meutils/data/__init__.py,sha256=Hfwkkxs4zHqKhxht0YrhS566a9P5axtmgNvM5wF8ceQ,243
@@ -811,8 +820,8 @@ meutils/schemas/fish_types.py,sha256=yC0ZFr3Ebh8F0OhtMsXYaIfNNvzOM2LT9YtKTaRoHGU
811
820
  meutils/schemas/hailuo_types.py,sha256=ubG6qIU506tq51UsURuwlPhtPNa49xHSoBzBtW7jg_0,7431
812
821
  meutils/schemas/haimian_types.py,sha256=jGu484UviAeBgy5OIUyRY4uYCxXfv16zDPqiJQr9wNQ,1364
813
822
  meutils/schemas/idphoto_types.py,sha256=nuHbpppejRSkJCiQ7YKx0Gnke0ShKZhOvdg0e7tk9-0,1074
814
- meutils/schemas/image_types.py,sha256=4-OqtVyGNPzznpU5Vpg0w_e_IJDqhLzU0JIM7_8g5Zo,15664
815
- meutils/schemas/jimeng_types.py,sha256=Uiqbtd4scpDHDTuXQaS8_6em8PrSnuQb_JkCQuBYkOM,1944
823
+ meutils/schemas/image_types.py,sha256=yOoY2cQJNkZCZBPg5Zzi03eS49YuO4XGtzECk-5Do24,15721
824
+ meutils/schemas/jimeng_types.py,sha256=z0mAICgNE0Yaq09_puzgMfHOP-QKWiZqqMlFbLVHtmY,1995
816
825
  meutils/schemas/jina_types.py,sha256=SLRRBCap2B1uXnHF7Sgnlz1Work8HvdIltjj4oVlGTk,8826
817
826
  meutils/schemas/kimi_types.py,sha256=PjCgHwCDNzKasn4X6rUzvOENqKYT3xj07cgp71IdsDA,3607
818
827
  meutils/schemas/kling_types.py,sha256=brWaREBtQeZGUuwgOW2p-vIm2WWInYkq8UfrLInT-Ik,6959
@@ -847,7 +856,7 @@ meutils/schemas/db/__init__.py,sha256=m1maURVoM6dIW0yt6ELZrZTzULtkHybVOSXtHNJRVI
847
856
  meutils/schemas/db/oneapi_types.py,sha256=3t2m0H80saEXmYUZfVFrtEaY117GjZTsSa1GKgkJzqQ,3896
848
857
  meutils/schemas/oneapi/__init__.py,sha256=uevbi3QAvFzN9WPbx9bYKTDyKt7P2ueZO6W0nSiD0sk,289
849
858
  meutils/schemas/oneapi/_types.py,sha256=IdXSLPQl73AKtCC5jFI2w5O7WFuQcQJlN_pr8xiMKz0,2648
850
- meutils/schemas/oneapi/common.py,sha256=W2UYI7haeBmSQtERzOHIJEi20PELzoz6ErsMDnZYImA,40534
859
+ meutils/schemas/oneapi/common.py,sha256=CPx0TZZTOHs0zk25VPZw6ELIqb7qG2S2WMAGVP7M7Wo,40544
851
860
  meutils/schemas/oneapi/icons.py,sha256=T7W5gInBJoHe62wzMimbG_UI-wn3_-rmQ1O4O2z-CQY,1089
852
861
  meutils/schemas/oneapi/model_group_info.py,sha256=rGtflYJuFIjk5MsVEvK9JUR4IciX8jfErqeLqf8DIlQ,1586
853
862
  meutils/schemas/oneapi/model_info.py,sha256=_uwKEPIIqm7ZYfhmpxtXB2QNsS83SpJY-OaBzvogC9w,772
@@ -900,9 +909,9 @@ meutils/settings/__init__.py,sha256=jZc0NXPA9zIMcTAYypSQDxJqvXakyJ0ztK9ZMND2Q7U,
900
909
  meutils/settings/base.py,sha256=kb3QVS2eUFWyGgvegtSK4cqJFF76J1JctTSzCVqc1Mo,264
901
910
  meutils/settings/demo.py,sha256=Ht3t6LREQsKa5W2owNrOZNAoZfS-zItIFNwGhhPj-4k,484
902
911
  meutils/str_utils/Translator.py,sha256=tfvNQIeVCqmX9yW6jobeibDHG6X-XecSSAx9kJIFFyw,1258
903
- meutils/str_utils/__init__.py,sha256=RvuIBw2SioCBD1q69k3AiHLEqBOkUd4ojIGX5uCdYtM,8147
912
+ meutils/str_utils/__init__.py,sha256=JACx26dCKC4qgQbo-nf7CANQD7lkBcUgpY7QhoVeR6g,9325
904
913
  meutils/str_utils/json_utils.py,sha256=H65v9vZtXVuYyRCQAfyQ4KZzAecwjvjBH6qTy0hCDE4,4033
905
- meutils/str_utils/regular_expression.py,sha256=ZtwhcHUu5gqaVy-iw2Ahx9DaSdmcZNr-6idHTLo2AH0,6127
914
+ meutils/str_utils/regular_expression.py,sha256=Cm9Hy5GoIcWejs2oElgw_prNCRnb_y8xUCW_Mt7rdIc,6128
906
915
  meutils/str_utils/__translater/__init__.py,sha256=mtDbKL_Qdkeq5VPVO1M4ejf9H8PzKM5h7iepqkBG8N0,277
907
916
  meutils/str_utils/__translater/tencent.py,sha256=1E_56l6-A49Yuz2ZrMKxt-QJfcf0xDYN2X0dg58Dytk,1408
908
917
  meutils/str_utils/__translater/translater.py,sha256=A_9NLVvkjzPd9omIcJGhux21D-gcCxemyrZ7o6uGx_Q,1238
@@ -976,9 +985,9 @@ meutils/tools/seize.py,sha256=nOKAS63w-Lbi48I0m2MPhdsokUTwxco0laPxYVmW4Mw,1064
976
985
  meutils/tools/service_monitor.py,sha256=ibsLtBN2g2DL7ZnLJ8vhiZOiOcqTAyx711djDdBK-3M,1255
977
986
  meutils/tools/sys_monitor.py,sha256=6MoyzrItqDUOSjfHcMJmMofQkEPTW36CT_aKui0rg84,429
978
987
  meutils/tools/token_monitor.py,sha256=Np-YK-R4P4IPAXyZvMxwvXI4sFmNJQAQK1lSegNaYpA,997
979
- MeUtils-2025.6.6.18.15.9.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
980
- MeUtils-2025.6.6.18.15.9.dist-info/METADATA,sha256=4XBaSruPR1wRkSDKdQHWeTGkkFgte7OPjcHiyDlcXXQ,32832
981
- MeUtils-2025.6.6.18.15.9.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
982
- MeUtils-2025.6.6.18.15.9.dist-info/entry_points.txt,sha256=lufZlBHRqqZKdY-ZQJ4CSZb0qhV5hQC37egZna9M7ug,357
983
- MeUtils-2025.6.6.18.15.9.dist-info/top_level.txt,sha256=cInfxMmkgNOskurdjwP5unau4rA7Uw48nu07tYhS7KY,22
984
- MeUtils-2025.6.6.18.15.9.dist-info/RECORD,,
988
+ MeUtils-2025.6.9.9.17.14.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
989
+ MeUtils-2025.6.9.9.17.14.dist-info/METADATA,sha256=E842d-NnKz_O_NVmesICCJf8r7rwGq0EVqrEJebm4Ww,32832
990
+ MeUtils-2025.6.9.9.17.14.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
991
+ MeUtils-2025.6.9.9.17.14.dist-info/entry_points.txt,sha256=lufZlBHRqqZKdY-ZQJ4CSZb0qhV5hQC37egZna9M7ug,357
992
+ MeUtils-2025.6.9.9.17.14.dist-info/top_level.txt,sha256=cInfxMmkgNOskurdjwP5unau4rA7Uw48nu07tYhS7KY,22
993
+ MeUtils-2025.6.9.9.17.14.dist-info/RECORD,,
@@ -9,7 +9,7 @@
9
9
  # @Description : https://fal.ai/models/fal-ai/flux-pro/v1.1-ultra/api
10
10
 
11
11
  from meutils.pipe import *
12
- from meutils.str_utils.regular_expression import parse_url
12
+ from meutils.str_utils import parse_url, validate_url
13
13
  from meutils.io.files_utils import to_url, to_url_fal
14
14
 
15
15
  from meutils.schemas.image_types import ImageRequest, FluxImageRequest, SDImageRequest, ImagesResponse
@@ -97,8 +97,10 @@ async def generate(request: ImageRequest, token: Optional[str] = None):
97
97
  elif "kontext" in request.model: # https://fal.ai/models/fal-ai/flux-pro/kontext/max
98
98
 
99
99
  if image_urls := parse_url(request.prompt):
100
- # 转存
101
- if request.user:
100
+ if not validate_url(image_urls):
101
+ raise Exception(f"Invalid image url: {image_urls}")
102
+
103
+ if request.user: # 转存
102
104
  image_urls = await to_url_fal(image_urls)
103
105
 
104
106
  for image_url in image_urls:
@@ -149,11 +151,16 @@ async def generate(request: ImageRequest, token: Optional[str] = None):
149
151
  "prompt": await deeplx.llm_translate(request.prompt),
150
152
 
151
153
  }
154
+
152
155
  if request.aspect_ratio:
153
- arguments["aspect_ratio"] = request.aspect_ratio
156
+ aspect_ratios = {'21:9', '16:9', '4:3', '3:2', '1:1', '2:3', '3:4', '9:16', '9:21'}
157
+ if request.aspect_ratio in aspect_ratios:
158
+ arguments["aspect_ratio"] = request.aspect_ratio
154
159
 
155
160
  logger.debug(bjson(arguments))
156
161
 
162
+
163
+
157
164
  elif request.model.startswith("fal-ai/flux"): # https://fal.ai/models/fal-ai/flux-pro/v1.1-ultra/api
158
165
 
159
166
  arguments = {
@@ -463,7 +463,7 @@ if __name__ == '__main__': # 304752356930580482
463
463
  # first_frame_image="https://oss.ffire.cc/files/kling_watermark.png" # 307173162217783304
464
464
  )
465
465
 
466
- r = arun(create_task(request, token=token))
466
+ # r = arun(create_task(request, token=token))
467
467
  # arun(get_task(task_id=r.task_id, token=r.system_fingerprint))
468
468
 
469
469
  # arun(get_task(task_id="hailuoai-378260932722450439", token=token))
@@ -488,4 +488,5 @@ if __name__ == '__main__': # 304752356930580482
488
488
  # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzUwMzQ1MjcsInVzZXIiOnsiaWQiOiIzMTMzODk5MjA0NjA5MzkyNjgiLCJuYW1lIjoiY2l4ZiB4YmNnIiwiYXZhdGFyIjoiIiwiZGV2aWNlSUQiOiIzMTM0MDgyMjg0NTEwOTg2MjYiLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.eOtAUe3MmarOGNk64j0bfaLNBZ4yxkqwIi1tUhOFD5c"
489
489
  # token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTAxMjg4NTIsInVzZXIiOnsiaWQiOiIzNzQwMTM3NzUyNzg4ODY5MTciLCJuYW1lIjoiTmFodWVsIE1vbGluYSIsImF2YXRhciI6IiIsImRldmljZUlEIjoiMzEzMzc0MTIyMjEyMjc4MjczIiwiaXNBbm9ueW1vdXMiOmZhbHNlfX0.uxTtDTcPT07piVA-x3N2ms2VrRN3JwcU99g_HJLwqLE"
490
490
  # token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTAxMjg4NTIsInVzZXIiOnsiaWQiOiIzNzQwMTM3NzUyNzg4ODY5MTciLCJuYW1lIjoiTmFodWVsIE1vbGluYSIsImF2YXRhciI6IiIsImRldmljZUlEIjoiMzEzMzc0MTIyMjEyMjc4MjczIiwiaXNBbm9ueW1vdXMiOmZhbHNlfX0.uxTtDTcPT07piVA-x3N2ms2VrRN3JwcU99g_HJLwqLE"
491
- # arun(check_token(token))
491
+ token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NTE3OTY1OTAsInVzZXIiOnsiaWQiOiIyMjkwODQ3NTA2MDEzODgwMzciLCJuYW1lIjoi5bCP6J665bi9ODAzNyIsImF2YXRhciI6Imh0dHBzOi8vY2RuLmhhaWx1b2FpLmNvbS9wcm9kL3VzZXJfYXZhdGFyLzE3MDYyNjc3MTEyODI3NzA4NzItMTczMTk0NTcwNjY4OTY1ODk2b3ZlcnNpemUucG5nIiwiZGV2aWNlSUQiOiIyNDM3MTMyNTI1NDU5ODY1NjIiLCJpc0Fub255bW91cyI6ZmFsc2V9fQ.6qhw69sWo31EBTTm1x2iPzav0baKYjaXrtmzXXsq73I"
492
+ arun(check_token(token))
@@ -197,7 +197,7 @@ if __name__ == '__main__':
197
197
  token = "7d9969ffd8ad2edda7da8fff11cb9434"
198
198
  token = "1513337bdba08a1a77fedad95c03bc6c"
199
199
  token = "b1cd6317e4d161bbb3889b9defd769ff"
200
- token = "d2d142fc877e696484cc2fc521127b36"
200
+ token = "176b9aba6b81256b50abf08526cf311a"
201
201
  arun(check_token(token))
202
202
 
203
203
  # arun(get_upload_token(token, 'video'))
@@ -12,7 +12,6 @@ guidance 控制精细度 => sample_strength 0-1 数值越大生成的效果质
12
12
  paths: ["/mweb/v1/generate", "/mweb/v1/super_resolution", "/mweb/v1/painting", "/commerce/v1/subscription/make_unauto_order", "/commerce/v1/benefits/credit_receive", "/commerce/v1/purchase/make_order", "/mweb/v1/get_explore", "/mweb/v1/feed_short_video", "/mweb/v1/feed", "/mweb/v1/get_homepage", "/mweb/v1/get_weekly_challenge_work_list", "/mweb/v1/mget_item_info", "/mweb/v1/get_item_info", "/mweb/v1/get_history_by_ids", "/mweb/search/v1/search"],
13
13
 
14
14
  """
15
- import json
16
15
 
17
16
  from meutils.pipe import *
18
17
  from meutils.caches import rcache
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : __init__.py
5
+ # @Time : 2024/12/16 17:46
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : tts
5
+ # @Time : 2025/5/13 10:40
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+ from meutils.decorators.retry import retrying
13
+
14
+ from meutils.io.files_utils import to_bytes, to_url
15
+ from meutils.schemas.openai_types import TTSRequest
16
+ from meutils.schemas.jimeng_types import BASE_URL
17
+
18
+ VOICE_MAPPING = {
19
+ # 带情绪
20
+ "柔美女友": "7382552865023201819",
21
+ # "happy", "angry", "fear", "surprised", "coldness", "disgust", "excited", "hate"
22
+ "妩媚女生": "7459778019725414962", # "happy", "angry", "fear", "surprise"
23
+ "京腔小爷": "7382048889659986458", # "joy", "angry", "surprise", "disgust"
24
+
25
+ # 角色演绎
26
+ "猴哥": "7236944659547689531",
27
+ "熊二": "7170964808357909005",
28
+ "如来佛祖": "7327220560335737363",
29
+ "咆哮哥": "7265204498308534840",
30
+ "四郎": "7170966598528799263",
31
+ "懒小羊": "7236944067072889405",
32
+ "TVB女声": "7145775430832755230",
33
+ "动漫小新": "6855162047320035854",
34
+ "紫薇": "7281175385486660155",
35
+ "黛玉": "7203252693555483196",
36
+ "顾姐": "7170966542610338318",
37
+ "动漫海绵": "6954271730848240136",
38
+ "云龙哥": "7298191949306008102",
39
+ "容嬷嬷": "7278285365335560762",
40
+ "华妃": "7360900412167164470",
41
+
42
+ # 方言
43
+ "河南小哥": "7382049051304268339",
44
+ "湾区大叔": "7382049147311886874",
45
+ "广西老表": "7382049000242811442",
46
+ "山东小哥": "7382048947646239259",
47
+ "长沙妹坨": "7376856724151472679",
48
+ "樱花小哥": "7275251697721545277",
49
+ "上海阿姨": "7270784654867698237",
50
+ "京腔": "7246701228736909879",
51
+ "港普男声": "7236947484650508859",
52
+ "天津小哥": "7023305056589976095",
53
+ "西安掌柜": "7008044050917888548",
54
+ "台湾女生": "6966423537611444767",
55
+ "东北老铁": "6912251359693640199",
56
+ "粤语男声": "7023302069004014117",
57
+ "重庆小伙": "6939395229950677534",
58
+
59
+ # 女青年
60
+ "魅力姐姐": "7382879492752019995",
61
+ "高冷御姐": "7382878375473320475",
62
+ "魅力女友": "7382839113059144229",
63
+ "耿直女声": "7367236342641594890",
64
+ "活泼女声": "7366933865698431515",
65
+ "随性女声": "7350942233593385508",
66
+ "知性女声": "7023300712998113823",
67
+ "温柔淑女": "7023300216061170213",
68
+ "悲伤女声": "7367266428002505243",
69
+
70
+ # 男青年
71
+ "开朗学长": "7382879228393427493",
72
+ "阳光青年": "7382878511217775130",
73
+ "广告男声": "7382874510376047130",
74
+ "悠悠君子": "7382878113916523035",
75
+ "强势青年": "7367238853679125043",
76
+ "阳光男生": "6912251288331751943",
77
+ "沉稳男声": "7317623416691888650",
78
+ "悲伤青年": "7367238720077959689",
79
+
80
+ # 少女
81
+ "病娇少女": "7382879331174847013",
82
+ "撒娇学妹": "7382558138009915913",
83
+ "冷静少女": "7367239175281578546",
84
+ "元气少女": "7350221867958932031",
85
+ "活泼女孩": "7462472428438950452",
86
+
87
+ # 少年
88
+ "阳光少年": "7382845921647661595",
89
+ "活泼少年": "7367245673655177779",
90
+
91
+ # 儿童
92
+ "小男孩": "7367253020309983782",
93
+ "小女孩": "7367252909815239206",
94
+ "萌娃": "6855161957519987207",
95
+
96
+ # 老人
97
+ "沉稳老者": "7367253137486254629",
98
+ "老婆婆": "7242563452026229305",
99
+
100
+ # 中年
101
+ "儒雅大叔": "7367250055360680474",
102
+ "温柔阿姨": "7367247089916449289",
103
+ "刚正大叔": "7367252353176572467"
104
+
105
+ }
106
+
107
+
108
+ @retrying()
109
+ async def create_tts(request: TTSRequest): # audio.speech.create
110
+
111
+ effect_id = VOICE_MAPPING.get(request.voice, "7382552865023201819")
112
+
113
+ loki_info = {"effect_id": effect_id, "model_names": "", "effect_type": 0}
114
+
115
+ payload = {
116
+ "text": request.input,
117
+ # "loki_info": json.dumps(loki_info),
118
+ "audio_config": {
119
+ "format": "mp3",
120
+ "sample_rate": 24000,
121
+ "speech_rate": request.speed or 0,
122
+ "pitch_rate": 0,
123
+ "enable_timestamp": True,
124
+
125
+ },
126
+ "id_info": {
127
+ "id": effect_id,
128
+ "item_platform": 1
129
+ }
130
+ }
131
+ if request.instructions and request.voice in {"柔美女友", "妩媚女生", "京腔小爷", }:
132
+ if request.voice == "京腔小爷" and request.instructions == "happy":
133
+ request.emotion = "joy"
134
+
135
+ if request.voice == "柔美女友" and request.instructions == "surprise":
136
+ request.emotion = "surprised"
137
+
138
+ payload["audio_config"].update(
139
+ {
140
+ # 情绪
141
+ "emotion_scale": 5,
142
+ "emotion": request.instructions,
143
+ }
144
+ )
145
+
146
+ logger.debug(payload)
147
+
148
+ headers = {
149
+ "pf": "7"
150
+ }
151
+ async with httpx.AsyncClient(base_url=BASE_URL, headers=headers, timeout=200) as client:
152
+ response = await client.post("/mweb/v1/tts_generate", json=payload)
153
+ response.raise_for_status()
154
+
155
+ data = response.json()
156
+
157
+ # logger.debug(data)
158
+
159
+ if request.response_format == "url":
160
+ if data.get("ret") == "0":
161
+ data["data"]["data"] = await to_url(data["data"]["data"], filename=f'{shortuuid.random()}.mp3')
162
+ return data
163
+ else:
164
+ data = await to_bytes(data["data"]["data"])
165
+ return data
166
+
167
+
168
+ if __name__ == '__main__':
169
+ text = """Chatfire tts-pro支持多种音色:
170
+ 柔美女友 妩媚女生 京腔小爷 猴哥 熊二 如来佛祖 咆哮哥 四郎 懒小羊 TVB女声 动漫小新 紫薇 黛玉 顾姐 动漫海绵 云龙哥 容嬷嬷 华妃 河南小哥 湾区大叔 广西老表 山东小哥 长沙妹坨 樱花小哥 上海阿姨 京腔 港普男声 天津小哥 西安掌柜 台湾女生 东北老铁 粤语男声 重庆小伙 魅力姐姐 高冷御姐 魅力女友 耿直女声 活泼女声 随性女声 知性女声 温柔淑女 悲伤女声 开朗学长 阳光青年 广告男声 悠悠君子 强势青年 阳光男生 沉稳男声 悲伤青年 病娇少女 撒娇学妹 冷静少女 元气少女 活泼女孩 阳光少年 活泼少年 小男孩 小女孩 萌娃 沉稳老者 老婆婆 儒雅大叔 温柔阿姨 刚正大叔
171
+
172
+ """
173
+ request = TTSRequest(
174
+ model="tts-1",
175
+ # input="军杰 快来我的五指山下" * 1,
176
+ input=text,
177
+ # voice="柔美女友",
178
+ voice="猴哥",
179
+
180
+ # voice="妩媚女生",
181
+ # voice="如来佛祖",
182
+ # voice="京腔小爷",
183
+
184
+ response_format="url",
185
+
186
+ # emotion="happy",
187
+ # emotion="fear"
188
+ emotion="surprise"
189
+
190
+ )
191
+
192
+ arun(create_tts(request))
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : common
5
+ # @Time : 2024/12/16 18:19
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description : https://github.com/LLM-Red-Team/jimeng-free-api/commit/acd362a4cecd115938bf4bc9bbb0067738aa0d5b#diff-e6a7354ac1431dc3751e91efaf1799200c1ce2fa8abe975a49c32644290988baR121
10
+ from openai import AsyncClient
11
+
12
+ from meutils.pipe import *
13
+ from meutils.hash_utils import md5
14
+ from meutils.schemas.openai_types import TTSRequest
15
+
16
+ from meutils.schemas.jimeng_types import BASE_URL_GLOBAL as BASE_URL, MODELS_MAP, FEISHU_URL
17
+ from meutils.caches.redis_cache import cache
18
+
19
+ from fake_useragent import UserAgent
20
+
21
+ ua = UserAgent()
22
+
23
+
24
+ @lru_cache()
25
+ def get_headers(url, token: str = "693701c43e477b7c405cc7e2fef0ddbd"):
26
+ device_time = f"{int(time.time())}"
27
+ sign = md5(
28
+ # f"9e2c|receive|7|5.8.0|{device_time}||11ac"
29
+ f"9e2c|{url[-7:]}|7|5.8.0|{device_time}||11ac"
30
+ )
31
+
32
+ headers = {
33
+ 'appid': '513695',
34
+ 'appvr': '5.8.0',
35
+ 'device-time': device_time,
36
+ 'pf': '7',
37
+ 'sign': sign,
38
+ 'sign-ver': '1',
39
+ 'Cookie': f'sid_guard={token}|{device_time}|5184000|Fri,+14-Feb-2025+00:51:51+GMT',
40
+ 'User-Agent': ua.random,
41
+
42
+ 'content-type': 'application/json',
43
+ # "Referer": "https://jimeng.jianying.com/ai-tool/image/generate",
44
+ }
45
+ return headers
46
+
47
+
48
+ @cache(ttl=3600 // 2)
49
+ async def get_upload_token(token, biz: Optional[str] = None): # 3600 跨账号?
50
+
51
+ if biz == "video":
52
+ url = "/mweb/v1/get_upload_token" # ?aid=513695&da_version=3.2.0&aigc_features=app_lip_sync
53
+
54
+ payload = {"scene": 2}
55
+ client = AsyncClient(base_url=BASE_URL)
56
+ response = await client.post(url, body=payload, cast_to=object)
57
+ logger.debug(bjson(response))
58
+ return response
59
+
60
+ url = "/artist/v2/tools/get_upload_token"
61
+ headers = get_headers(url, token)
62
+
63
+ payload = {"scene": 2}
64
+ client = AsyncClient(base_url=BASE_URL, default_headers=headers)
65
+ response = await client.post(url, body=payload, cast_to=object)
66
+ logger.debug(bjson(response))
67
+ return response
68
+
69
+
70
+ @alru_cache(12 * 3600)
71
+ async def receive_credit(token):
72
+ # token = "eb4d120829cfd3ee957943f63d6152ed" # y
73
+ # token = "9ba826acc1a4bf0e10912eb01beccfe0" # w
74
+ url = "/commerce/v1/benefits/credit_receive"
75
+ headers = get_headers(url, token)
76
+ payload = {"time_zone": "Asia/Shanghai"}
77
+ client = AsyncClient(base_url=BASE_URL, default_headers=headers)
78
+ response = await client.post(url, body=payload, cast_to=object)
79
+ logger.debug(bjson(response))
80
+
81
+
82
+ async def get_credit(token):
83
+ # token = "eb4d120829cfd3ee957943f63d6152ed" # y
84
+ # token = "9ba826acc1a4bf0e10912eb01beccfe0" # w
85
+
86
+ url = "/commerce/v1/benefits/user_credit"
87
+ headers = get_headers(url, token)
88
+
89
+ payload = {}
90
+ client = AsyncClient(base_url=BASE_URL, default_headers=headers)
91
+ response = await client.post(url, body=payload, cast_to=object)
92
+ if response['data']['credit']['gift_credit'] == 0: # 签到
93
+ await receive_credit(token)
94
+
95
+ logger.debug(bjson(response))
96
+ return response
97
+
98
+
99
+ async def check_token(token, threshold: int = 1): # todo: 失效还是没积分
100
+ try:
101
+ response = await get_credit(token)
102
+ logger.debug(bjson(response))
103
+ # logger.error(f"{token}")
104
+
105
+ credits = sum(response['data']['credit'].values())
106
+ return credits >= threshold
107
+ except Exception as e:
108
+ logger.error(e)
109
+ return False
110
+
111
+
112
+ def create_photo_lip_sync(request: TTSRequest):
113
+ # 映射
114
+ tts_info = {
115
+ "name": request.voice or "魅力姐姐",
116
+ "text": request.input, # "永远相信美好的事情即将发生"
117
+ "speed": request.seed or 1,
118
+ "source_type": "text-to-speech",
119
+ "tone_category_id": 0,
120
+ "tone_category_key": "all",
121
+ "tone_id": "7382879492752019995",
122
+ "toneKey": request.voice or "魅力姐姐",
123
+ }
124
+ payload = {
125
+ "promptSource": "photo_lip_sync",
126
+ "generateTimes": 1,
127
+ "lipSyncInfo": tts_info,
128
+ "isUseAiGenPrompt": False,
129
+ "batchNumber": 1
130
+ }
131
+
132
+ return {
133
+ "submit_id": "",
134
+ "task_extra": json.dumps(payload),
135
+ "http_common_info": {
136
+ "aid": 513695
137
+ },
138
+ "input": {
139
+ "seed": 1834980836,
140
+ "video_gen_inputs": [
141
+ {
142
+ "v2v_opt": {},
143
+ "i2v_opt": {
144
+ "realman_avatar": {
145
+ "enable": True,
146
+ "origin_image": {
147
+ "width": 480,
148
+ "height": 270,
149
+ "image_uri": "tos-cn-i-tb4s082cfz/fae8f746367b40f5a708bf0f1e84de11",
150
+ "image_url": "" ########## https://oss.ffire.cc/files/kling_watermark.png
151
+ },
152
+ "resource_id_loopy": "34464cac-5e3e-46be-88ff-ccbc7da4d742",
153
+ "resource_id_std": "2f66b408-37c3-4de5-b8a4-ba15c104612e",
154
+ "origin_audio": {
155
+ "duration": 3.216,
156
+ "vid": "v02bc3g10000ctrpqrfog65purfpn7a0"
157
+ },
158
+ "tts_info": json.dumps(tts_info)
159
+ }
160
+ },
161
+ "audio_vid": "v02bc3g10000ctrpqrfog65purfpn7a0",
162
+ "video_mode": 4
163
+ }
164
+ ]
165
+ },
166
+ "mode": "workbench",
167
+ "history_option": {},
168
+ "commerce_info": {
169
+ "resource_id": "generate_video",
170
+ "resource_id_type": "str",
171
+ "resource_sub_type": "aigc",
172
+ "benefit_type": "lip_sync_avatar_std"
173
+ },
174
+ "scene": "lip_sync_image",
175
+ "client_trace_data": {},
176
+ "submit_id_list": [
177
+ "d4554e2c-707f-4ebe-b4e6-93aa6687d1c1"
178
+ ]
179
+ }
180
+
181
+
182
+ if __name__ == '__main__':
183
+ from meutils.config_utils.lark_utils import aget_spreadsheet_values, get_series
184
+
185
+ token = "693701c43e477b7c405cc7e2fef0ddbd"
186
+ token = "eb4d120829cfd3ee957943f63d6152ed"
187
+ token = "dcf7bbc31faed9740b0bf748cd4d2c74"
188
+ token = "38d7d300b5e0a803431ef88d8d2acfef"
189
+ token = "916fed81175f5186a2c05375699ea40d"
190
+ token = "7c5e148d9fa858e3180c42f843c20454"
191
+ token = "1c21a9fe6a4230609d7ff13e5cec41ec"
192
+ token = "34438eb03d165737122180caf62a8058"
193
+ token = "ffeee346fbd19eceebb79a7bfbca4bfe"
194
+ # token = "b8bb4cb67dba6c0d1048bdc0596bc461"
195
+ # token = "34438eb03d165737122180caf62a8058"
196
+ # token = "a521dd578adcfb191fad38dd4baab498"
197
+ token = "7d9969ffd8ad2edda7da8fff11cb9434"
198
+ token = "1513337bdba08a1a77fedad95c03bc6c"
199
+ token = "b1cd6317e4d161bbb3889b9defd769ff"
200
+ token = "176b9aba6b81256b50abf08526cf311a"
201
+ arun(check_token(token))
202
+
203
+ # arun(get_upload_token(token, 'video'))
204
+
205
+ # print(arun(aget_spreadsheet_values(feishu_url=FEISHU_URL, to_dataframe=True))[0].tolist())
206
+ # tokens = arun(get_series(FEISHU_URL))
207
+ # arun(get_credit(token))
208
+ # arun(check_token(token))
209
+ # _ = []
210
+ # for token in tokens:
211
+ # if not arun(check_token(token)):
212
+ # logger.debug(f"无效 {token}")
213
+ # _.append(token)
214
+
215
+ # arun(get_upload_token(token))
216
+ #
217
+ # request = ImageRequest(prompt='https://oss.ffire.cc/files/kling_watermark.png笑起来')
218
+ # arun(create_draft_content(request, token))