MeUtils 2024.3.4.13.4.45__py3-none-any.whl → 2025.1.16.17.15.52__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.
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/METADATA +38 -32
- MeUtils-2025.1.16.17.15.52.dist-info/RECORD +864 -0
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/WHEEL +1 -1
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/entry_points.txt +1 -0
- apps/spider.py +24 -8
- examples/_openaisdk/4v.py +110 -0
- examples/_openaisdk/__init__.py +11 -0
- examples/_openaisdk/baichuan.py +38 -0
- examples/_openaisdk/bpo.py +138 -0
- examples/_openaisdk/chat_latex.py +95 -0
- examples/_openaisdk/chattts.py +85 -0
- examples/_openaisdk/copilot.py +48 -0
- examples/_openaisdk/dalle3.py +48 -0
- examples/_openaisdk/deeplx.py +31 -0
- examples/_openaisdk/demo.py +77 -0
- examples/_openaisdk/embeddings.py +34 -0
- examples/_openaisdk/gpt4all.py +69 -0
- examples/_openaisdk/gpt_fc.py +23 -0
- examples/_openaisdk/gr_vl.py +46 -0
- examples/_openaisdk/json_mode.py +12 -0
- examples/_openaisdk/kimi.py +91 -0
- examples/_openaisdk/kimi_qa.py +57 -0
- examples/_openaisdk/minimax.py +75 -0
- examples/_openaisdk/open_router.py +48 -0
- examples/_openaisdk/openai_aiplus.py +54 -0
- examples/_openaisdk/openai_audio.py +20 -0
- examples/_openaisdk/openai_baichuan.py +59 -0
- examples/_openaisdk/openai_cache.py +37 -0
- examples/_openaisdk/openai_chatfire.py +228 -0
- examples/_openaisdk/openai_chatfire_all.py +166 -0
- examples/_openaisdk/openai_deepinfra.py +55 -0
- examples/_openaisdk/openai_deepseek.py +29 -0
- examples/_openaisdk/openai_doubao.py +43 -0
- examples/_openaisdk/openai_embeddings.py +36 -0
- examples/_openaisdk/openai_files.py +57 -0
- examples/_openaisdk/openai_gitee.py +33 -0
- examples/_openaisdk/openai_god.py +45 -0
- examples/_openaisdk/openai_groq.py +240 -0
- examples/_openaisdk/openai_images.py +203 -0
- examples/_openaisdk/openai_json.py +78 -0
- examples/_openaisdk/openai_lingyi.py +59 -0
- examples/_openaisdk/openai_modelscope.py +54 -0
- examples/_openaisdk/openai_moon.py +55 -0
- examples/_openaisdk/openai_oi.py +61 -0
- examples/_openaisdk/openai_ppu.py +47 -0
- examples/_openaisdk/openai_qwen.py +58 -0
- examples/_openaisdk/openai_search.py +42 -0
- examples/_openaisdk/openai_sensenova.py +81 -0
- examples/_openaisdk/openai_siliconflow.py +52 -0
- examples/_openaisdk/openai_step.py +45 -0
- examples/_openaisdk/openai_test.py +66 -0
- examples/_openaisdk/openai_together.py +57 -0
- examples/_openaisdk/openai_tune.py +38 -0
- examples/_openaisdk/openai_zhipu.py +59 -0
- examples/_openaisdk/ppu.py +28 -0
- examples/_openaisdk/rag.py +54 -0
- examples/_openaisdk/rag_.py +26 -0
- examples/_openaisdk/test.py +52 -0
- examples/_openaisdk/x.py +32 -0
- examples/_openaisdk/xx.py +29 -0
- examples/_openaisdk/zhipu_files.py +47 -0
- examples/_openaisdk/zhipu_/346/231/272/350/203/275/344/275/223.py +45 -0
- examples/_openaisdk//345/205/234/345/272/225/346/265/213/350/257/225.py +50 -0
- examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225.py +76 -0
- examples/_openaisdk//345/244/232/346/250/241/346/200/201/346/265/213/350/257/225_.py +56 -0
- examples/_openaisdk//346/226/207/344/273/266/351/227/256/347/255/224.py +36 -0
- examples/_openaisdk//346/226/207/346/241/243/350/247/243/346/236/220.py +34 -0
- examples/_openaisdk//346/250/241/345/236/213/346/265/213/350/257/225.py +53 -0
- examples/_openaisdk//351/230/277/351/207/214.py +80 -0
- {meutils/serving/jina/__demo → examples/ann}/__init__.py +1 -1
- examples/ann/main.py +31 -0
- examples/apis/kl.py +28 -0
- examples/apis/x.py +17 -0
- examples/apis/xx.py +17 -0
- examples/arq_demo/demo.py +3 -0
- examples/backgroundtasks.py +25 -0
- examples/bserver.py +513 -21
- examples/cache_demo/HermesCache_demo.py +81 -0
- examples/cache_demo/acacge.py +26 -0
- examples/cache_demo/x.py +31 -0
- {meutils/docarray_utils → examples/caches}/__init__.py +1 -1
- examples/caches/llmcache.py +18 -0
- examples/celery_demo/product_task.py +2 -0
- examples/demo.py +17 -1
- examples/fastapi_caching.py +59 -0
- {meutils/dependencies → examples/gr}/__init__.py +1 -1
- examples/gr/d.py +22 -0
- examples/gr/demo.py +30 -0
- examples/ip2/345/234/260/345/214/272.py +16 -0
- examples/jinja2_demo/j2_demo.py +20 -1
- examples/json/346/240/207/345/207/206/345/214/226.py +54 -0
- examples/md.py +29 -0
- {meutils/serving/jina → examples/nesc}/__init__.py +1 -1
- examples/nesc/main.py +76 -0
- examples/orm/mysql_orm.py +113 -0
- examples/orm/sql_creater.py +57 -0
- examples/orm/sqlm.py +134 -0
- examples/rq_demo/fns.py +18 -0
- examples/rq_demo/redis/351/230/237/345/210/227.py +14 -7
- examples/rq_demo/redis/351/230/237/345/210/227_add_chatfire.py +30 -0
- examples/size_map.py +43 -0
- examples/test.py +59 -0
- examples/webs/__init__.py +11 -0
- examples/webs/main.py +34 -0
- examples/x.py +13 -0
- examples//345/216/273/346/260/264/345/215/260.py +20 -0
- examples//346/226/207/346/241/243/346/231/272/350/203/275/__init__.py +11 -0
- meutils/_utils.py +15 -6
- meutils/ai_audio/asr/__init__.py +3 -2
- meutils/ai_audio/asr/cf_asr.py +53 -0
- meutils/ai_audio/asr/de.py +11 -0
- meutils/ai_audio/asr/fast_asr.py +15 -7
- meutils/ai_audio/asr/openai_asr.py +83 -6
- meutils/ai_audio/fast_asr.py +8 -4
- meutils/ai_audio/tts/EdgeTTS.py +33 -7
- meutils/ai_audio/tts/openai_tts.py +24 -20
- meutils/ai_audio/tts/tts_ui.py +1 -0
- meutils/ai_audio/utils.py +9 -0
- meutils/ai_cv/__init__.py +0 -1
- meutils/ai_cv/ocr.py +3 -2
- meutils/ai_cv/utils.py +154 -0
- meutils/ai_video/avmerge.py +6 -0
- meutils/ai_video/video.py +11 -2
- meutils/{api → apis}/__init__.py +1 -1
- meutils/apis/ali_apis.py +60 -0
- meutils/apis/audio/__init__.py +10 -0
- meutils/apis/audio/deepinfra.py +59 -0
- meutils/apis/audio/fish.py +248 -0
- meutils/apis/baidu/__init__.py +9 -0
- meutils/apis/baidu/bdaitpzs.py +229 -0
- meutils/apis/baidu/test.py +78 -0
- meutils/apis/chatglm/__init__.py +11 -0
- meutils/apis/chatglm/glm_video.py +273 -0
- meutils/apis/chatglm/glm_video_api.py +116 -0
- meutils/apis/chatglm/images.py +63 -0
- meutils/apis/chatglm/temp.py +259 -0
- meutils/apis/chatglm/x.py +31 -0
- meutils/{api → apis}/common.py +10 -6
- meutils/apis/fal/__init__.py +11 -0
- meutils/apis/fal/files.py +53 -0
- meutils/apis/fal/images.py +57 -0
- meutils/apis/fal/images_.py +72 -0
- meutils/apis/fal/videos.py +77 -0
- meutils/apis/firecrawl.py +45 -0
- meutils/apis/gitee/__init__.py +11 -0
- meutils/apis/gitee/images/__init__.py +9 -0
- meutils/apis/gitee/images/kolors.py +99 -0
- meutils/apis/hailuoai/__init__.py +11 -0
- meutils/apis/hailuoai/demo.py +34 -0
- meutils/apis/hailuoai/hasha_new.py +248 -0
- meutils/apis/hailuoai/music.py +11 -0
- meutils/apis/hailuoai/upload.py +116 -0
- meutils/apis/hailuoai/videos.py +460 -0
- meutils/apis/hailuoai/yy.py +242 -0
- meutils/apis/hf/__init__.py +11 -0
- meutils/apis/hf/got_ocr.py +64 -0
- meutils/apis/hf/gradio.py +34 -0
- meutils/apis/hf/hivisionidphotos.py +80 -0
- meutils/apis/hf/kolors.py +68 -0
- meutils/apis/hf/kolors_virtual_try_on.py +107 -0
- meutils/apis/hf/r.py +53 -0
- meutils/apis/hf/x.py +26 -0
- meutils/apis/hf//350/257/201/344/273/266/347/205/247.py +41 -0
- meutils/apis/hunyuan/__init__.py +11 -0
- meutils/apis/hunyuan/image_tools.py +84 -0
- meutils/apis/images/__init__.py +11 -0
- meutils/apis/images/deepinfra.py +92 -0
- meutils/apis/images/demo.py +150 -0
- meutils/apis/images/eidt.py +36 -0
- meutils/apis/images/flux/__init__.py +11 -0
- meutils/apis/images/flux/fluxpro.py +108 -0
- meutils/apis/images/flux/mystic.py +116 -0
- meutils/apis/images/ideogram/__init__.py +10 -0
- meutils/apis/images/ideogram/ideogram_images.py +193 -0
- meutils/apis/images/prodia/__init__.py +12 -0
- meutils/apis/images/prodia/faceswap.py +76 -0
- meutils/apis/images/recraft.py +152 -0
- meutils/apis/images/virtual_try_on/__init__.py +11 -0
- meutils/apis/images/virtual_try_on/images.py +65 -0
- meutils/apis/jiema/24mail.py +96 -0
- meutils/apis/jiema/__init__.py +11 -0
- meutils/apis/jiema/yezi.py +97 -0
- meutils/apis/jimeng/__init__.py +11 -0
- meutils/apis/jimeng/common.py +328 -0
- meutils/apis/jimeng/doubao.py +68 -0
- meutils/apis/jimeng/doubao_utils.py +175 -0
- meutils/apis/jimeng/files.py +263 -0
- meutils/apis/jimeng/images.py +140 -0
- meutils/apis/jimeng/lip_sync.py +11 -0
- meutils/apis/jina.py +55 -0
- meutils/apis/kling/__init__.py +11 -0
- meutils/apis/kling/api.py +60 -0
- meutils/apis/kling/images.py +174 -0
- meutils/apis/kling/kolors_virtual_try_on.py +111 -0
- meutils/apis/kling/kolors_virtual_try_on_web.py +126 -0
- meutils/apis/kling/videos.py +67 -0
- meutils/apis/kling//351/211/264/346/235/203.py +34 -0
- meutils/apis/kuaidi.py +32 -0
- meutils/apis/kuaishou/__init__.py +10 -0
- meutils/apis/kuaishou/klingai.py +523 -0
- meutils/apis/kuaishou/klingai_video.py +197 -0
- meutils/apis/kuaishou/kolors.py +189 -0
- meutils/apis/llm_qa.py +55 -0
- meutils/apis/luma/__init__.py +11 -0
- meutils/apis/luma/luma.py +123 -0
- meutils/apis/minicpm/__init__.py +9 -0
- meutils/apis/minicpm/luca.py +137 -0
- meutils/apis/monica/__init__.py +11 -0
- meutils/apis/monica/llm.py +11 -0
- meutils/apis/napkin/__init__.py +11 -0
- meutils/apis/napkin/icons.py +42 -0
- meutils/apis/niutrans.py +73 -0
- meutils/apis/oneapi/__init__.py +11 -0
- meutils/apis/oneapi/channel.py +68 -0
- meutils/apis/oneapi/common.py +135 -0
- meutils/apis/oneapi/log.py +47 -0
- meutils/apis/oneapi/token.py +48 -0
- meutils/apis/oneapi/token_.py +112 -0
- meutils/apis/oneapi/user.py +100 -0
- meutils/apis/oneapi/utils.py +47 -0
- meutils/apis/pixverse/__init__.py +11 -0
- meutils/apis/pixverse/pixverse.py +150 -0
- meutils/apis/proxy/__init__.py +11 -0
- meutils/apis/proxy/ips.py +178 -0
- meutils/apis/remini/__init__.py +11 -0
- meutils/apis/remini/remini.py +89 -0
- meutils/apis/replicateai/__init__.py +11 -0
- meutils/apis/replicateai/images.py +79 -0
- meutils/apis/replicateai/raw.py +53 -0
- meutils/apis/runwayml/__init__.py +10 -0
- meutils/apis/runwayml/gen.py +143 -0
- meutils/apis/search/__init__.py +11 -0
- meutils/apis/search/baichuan.py +11 -0
- meutils/apis/search/metaso.py +218 -0
- meutils/apis/search/metaso_.py +77 -0
- meutils/apis/search/n.py +99 -0
- meutils/apis/search/searxng.py +42 -0
- meutils/apis/search_music.py +39 -0
- meutils/apis/siliconflow/__init__.py +9 -0
- meutils/apis/siliconflow/audio.py +63 -0
- meutils/apis/siliconflow/image_to_image.py +116 -0
- meutils/apis/siliconflow/images.py +154 -0
- meutils/apis/siliconflow/rerankers.py +40 -0
- meutils/apis/siliconflow/text_to_image.py +132 -0
- meutils/apis/siliconflow/utils.py +66 -0
- meutils/apis/siliconflow/videos.py +102 -0
- meutils/apis/sunoai/__init__.py +10 -0
- meutils/apis/sunoai/haimian.py +135 -0
- meutils/apis/sunoai/suno.py +373 -0
- meutils/apis/textcard/__init__.py +11 -0
- meutils/apis/textcard/demo.py +25 -0
- meutils/apis/textcard/hanyuxinjie.py +81 -0
- meutils/apis/textin.py +159 -0
- meutils/apis/to_image/__init__.py +11 -0
- meutils/apis/to_image/html2image.py +29 -0
- meutils/apis/to_image/md.py +29 -0
- meutils/apis/to_image/url2image.py +41 -0
- meutils/apis/together/__init__.py +11 -0
- meutils/apis/together/images.py +80 -0
- meutils/apis/translator/__init__.py +9 -0
- meutils/apis/translator/deeplx.py +55 -0
- meutils/apis/tripo3d/__init__.py +11 -0
- meutils/apis/tripo3d/images.py +106 -0
- meutils/apis/ts.py +60 -0
- meutils/apis/uptime_kuma/__init__.py +11 -0
- meutils/apis/uptime_kuma/common.py +56 -0
- meutils/apis/uptime_kuma//345/233/275/344/272/247/345/210/206/347/273/204.py +68 -0
- meutils/apis/utils.py +47 -0
- meutils/apis/videos/__init__.py +11 -0
- meutils/apis/videos/sora.py +16 -0
- meutils/apis/vidu/__init__.py +9 -0
- meutils/apis/vidu/vidu_video.py +254 -0
- meutils/apis/vidu/x.py +14 -0
- meutils/apis/voice_clone/__init__.py +10 -0
- meutils/apis/voice_clone/fish.py +236 -0
- meutils/apis/voice_clone/fish_api.py +16 -0
- meutils/apis/web_search.py +31 -0
- meutils/apis/yezi.py +97 -0
- meutils/async_task/__init__.py +13 -0
- meutils/async_task/celery_config.py +106 -0
- meutils/async_task/common.py +37 -0
- meutils/async_task/demo_create_tasks.py +73 -0
- meutils/async_task/tasks/__init__.py +11 -0
- meutils/async_task/tasks/_all.py +20 -0
- meutils/async_task/tasks/hailuo.py +24 -0
- meutils/async_task/tasks/kling.py +30 -0
- meutils/async_task/tasks/replicateai.py +24 -0
- meutils/async_task/tasks/test.py +124 -0
- meutils/async_task/tasks/vidu.py +28 -0
- meutils/async_task/utils.py +191 -0
- meutils/async_task//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
- meutils/async_utils/asyncer_.py +37 -0
- meutils/async_utils/background.py +68 -0
- meutils/async_utils/common.py +136 -16
- meutils/async_utils/test.py +47 -0
- meutils/cache_utils.py +29 -23
- meutils/caches/__init__.py +9 -0
- meutils/caches/acache.py +45 -0
- meutils/caches/redis_cache.py +63 -0
- meutils/clis/check_api.py +66 -0
- meutils/clis/cli.py +1 -1
- meutils/common.py +56 -17
- meutils/config_utils/__init__.py +11 -0
- meutils/config_utils/lark_utils/__init__.py +11 -0
- meutils/config_utils/lark_utils/common.py +385 -0
- meutils/config_utils/lark_utils/demo.py +13 -0
- meutils/config_utils/lark_utils/x.py +50 -0
- meutils/config_utils/manager.py +108 -0
- meutils/crawlers/__init__.py +11 -0
- meutils/data/VERSION +1 -1
- meutils/data/cowboy-hat-face.webp +0 -0
- meutils/data/oneapi/FOOTER.md +7 -0
- meutils/data/oneapi/NOTICE.md +138 -0
- meutils/data/oneapi/__init__.py +15 -0
- meutils/db/orm.py +179 -0
- meutils/db/redis_db.py +87 -0
- meutils/decorators/cache.py +1 -1
- meutils/decorators/common.py +84 -5
- meutils/decorators/contextmanagers.py +17 -6
- meutils/decorators/fastapi_decorator.py +77 -3
- meutils/decorators/polling.py +46 -0
- meutils/decorators/retry.py +150 -26
- meutils/fastapi_utils/__init__.py +11 -0
- meutils/fastapi_utils/exceptions/http_error.py +72 -0
- meutils/fastapi_utils/exceptions/validation_error.py +44 -0
- meutils/hash_utils.py +9 -4
- meutils/hooks/__init__.py +11 -0
- meutils/hooks/hook_test.py +174 -0
- meutils/hooks/wechat.py +162 -0
- meutils/hooks/wechat_channel.py +303 -0
- meutils/init/evn.py +1 -1
- meutils/io/files_utils.py +232 -0
- meutils/io/image.py +148 -10
- meutils/io/x.py +75 -0
- meutils/llm/__init__.py +10 -0
- meutils/llm/check_api.py +109 -0
- meutils/llm/check_utils.py +106 -0
- meutils/llm/clients.py +38 -0
- meutils/llm/completions/__init__.py +11 -0
- meutils/llm/completions/agents/__init__.py +11 -0
- meutils/llm/completions/agents/file.py +125 -0
- meutils/llm/completions/cp.py +112 -0
- meutils/llm/completions/delilegal.py +135 -0
- meutils/llm/completions/dify.py +81 -0
- meutils/llm/completions/kimi.py +47 -0
- meutils/llm/completions/modelscope.py +11 -0
- meutils/{fileparser/filetype.py → llm/completions/oi.py} +5 -3
- meutils/llm/completions/rag/__init__.py +11 -0
- meutils/llm/completions/rag/fire.py +157 -0
- meutils/llm/completions/rag/qwen.py +11 -0
- meutils/llm/completions/rag/rag.py +41 -0
- meutils/llm/completions/rag.py +38 -0
- meutils/llm/completions/tryblend.py +201 -0
- meutils/llm/completions/tune.py +284 -0
- meutils/llm/completions/x.py +26 -0
- meutils/llm/completions/xx.py +61 -0
- meutils/llm/completions/yuanbao.py +176 -0
- meutils/llm/demo.py +114 -0
- meutils/llm/functions/__init__.py +11 -0
- meutils/llm/mappers.py +15 -0
- meutils/llm/openai_utils/__init__.py +11 -0
- meutils/llm/openai_utils/common.py +284 -0
- meutils/llm/openai_utils/tool_outputs.py +45 -0
- meutils/llm/output_parsers/__init__.py +80 -0
- meutils/llm/prompts/__init__.py +244 -0
- meutils/llm/prompts/demo.py +155 -0
- meutils/llm/prompts/html2image_test.py +19 -0
- meutils/llm/utils.py +133 -0
- meutils/llm/x.py +75 -0
- meutils/notice/feishu.py +40 -9
- meutils/notice/wechat.py +23 -21
- meutils/np_utils.py +10 -1
- meutils/office_automation/pdf.py +6 -1
- meutils/oss/__init__.py +20 -0
- meutils/oss/minio_oss.py +184 -0
- meutils/oss/minio_utils.py +48 -0
- meutils/other/__demo.py +6 -4
- meutils/pandas_utils/__init__.py +1 -0
- meutils/pandas_utils/common.py +31 -0
- meutils/pandas_utils/pd_utils.py +10 -6
- meutils/parsers/__init__.py +10 -0
- meutils/parsers/file_parsers.py +110 -0
- meutils/parsers/fileparser/demo.py +41 -0
- meutils/parsers/fileparser/filetype.py +41 -0
- meutils/pay.py +37 -0
- meutils/pipe.py +37 -4
- meutils/playwright_utils/common.py +20 -12
- meutils/plots/common.py +35 -34
- meutils/queues/demo.py +56 -0
- meutils/queues/smooth_queue.py +120 -0
- meutils/queues/uniform_queue.py +3 -1
- meutils/request_utils/__init__.py +26 -2
- meutils/request_utils/ark.py +47 -0
- meutils/request_utils/crawler.py +34 -5
- meutils/request_utils/jwt_utils/__init__.py +11 -0
- meutils/request_utils/jwt_utils/common.py +42 -0
- meutils/request_utils/volc.py +160 -0
- meutils/schemas/__init__.py +0 -1
- meutils/schemas/baidu_types.py +70 -0
- meutils/schemas/batch_types.py +450 -0
- meutils/schemas/celery_types.py +64 -0
- meutils/schemas/chatfire_types.py +15 -0
- meutils/schemas/chatglm_types.py +197 -0
- meutils/schemas/db/__init__.py +11 -0
- meutils/schemas/db/oneapi_types.py +117 -0
- meutils/schemas/dify_types.py +40 -0
- meutils/schemas/embedding.py +31 -0
- meutils/schemas/fal_types.py +13 -0
- meutils/schemas/fish_types.py +11 -0
- meutils/schemas/hailuo_types.py +208 -0
- meutils/schemas/haimian_types.py +51 -0
- meutils/schemas/idphoto_types.py +43 -0
- meutils/schemas/image_types.py +476 -0
- meutils/schemas/jimeng_types.py +28 -0
- meutils/schemas/jina_types.py +67 -0
- meutils/schemas/kimi_types.py +86 -0
- meutils/schemas/kling_types.py +235 -0
- meutils/schemas/kuaishou_types.py +328 -0
- meutils/schemas/luma_types.py +59 -0
- meutils/schemas/message_types.py +165 -0
- meutils/schemas/message_types_.py +219 -0
- meutils/schemas/metaso_types.py +64 -0
- meutils/schemas/napkin_types.py +85 -0
- meutils/schemas/ocr_types.py +37 -0
- meutils/schemas/oneapi/__init__.py +11 -0
- meutils/schemas/oneapi/_types.py +49 -0
- meutils/schemas/oneapi/common.py +883 -0
- meutils/schemas/oneapi/icons.py +30 -0
- meutils/schemas/oneapi/model_group_info.py +48 -0
- meutils/schemas/oneapi/model_info.py +34 -0
- meutils/schemas/oneapi/models.py +26 -0
- meutils/schemas/oneapi/x.py +26 -0
- meutils/schemas/oneapi//351/207/215/345/256/232/345/220/221.py +132 -0
- meutils/schemas/openai_api_protocol.py +411 -0
- meutils/schemas/openai_types.py +366 -0
- meutils/schemas/pixverse_types.py +88 -0
- meutils/schemas/playwright_types.py +57 -0
- meutils/schemas/prodia_types.py +19 -0
- meutils/schemas/replicate_types.py +112 -0
- meutils/schemas/request_types.py +20 -0
- meutils/schemas/runwayml_types.py +190 -0
- meutils/schemas/siliconflow_types.py +80 -0
- meutils/schemas/step_types.py +19 -0
- meutils/schemas/suno_types.py +319 -0
- meutils/schemas/task_types.py +192 -0
- meutils/schemas/translator_types.py +29 -0
- meutils/schemas/tripo3d_types.py +57 -0
- meutils/schemas/tryblend_types.py +51 -0
- meutils/schemas/video_types.py +62 -0
- meutils/schemas/vidu_types.py +350 -0
- meutils/schemas/wechat_types.py +316 -0
- meutils/schemas/yuanbao_types.py +260 -0
- meutils/serving/celery/__init__.py +8 -0
- meutils/serving/celery/config.py +115 -0
- meutils/serving/celery/router.py +4 -6
- meutils/serving/celery/tasks.py +6 -4
- meutils/serving/celery//351/200/232/347/224/250/350/256/276/350/256/241.py +119 -0
- meutils/serving/fastapi/common.py +27 -31
- meutils/serving/fastapi/dependencies/__init__.py +0 -1
- meutils/serving/fastapi/dependencies/auth.py +55 -2
- meutils/serving/fastapi/exceptions/http_error.py +67 -2
- meutils/serving/fastapi/exceptions/validation_error.py +18 -2
- meutils/serving/fastapi/lifespans.py +73 -0
- meutils/serving/fastapi/routers/scheduler.py +12 -0
- meutils/serving/fastapi/routers/screenshot.py +47 -0
- meutils/serving/fastapi/routers/spider.py +8 -3
- meutils/serving/fastapi/routers/task.py +48 -0
- meutils/serving/fastapi/utils.py +48 -1
- meutils/serving/streamlit/common.py +1 -1
- meutils/smooth_utils.py +3 -0
- meutils/str_utils/__init__.py +22 -3
- meutils/str_utils/json_utils.py +7 -0
- meutils/str_utils/regular_expression.py +102 -10
- meutils/templates/xx.html +21 -0
- meutils/templates/xxx.html +117 -0
- meutils/todo.py +12 -0
- meutils/tools/token_monitor.py +33 -0
- MeUtils-2024.3.4.13.4.45.dist-info/RECORD +0 -540
- meutils/ai_audio/asr/subtitle.srt +0 -40
- meutils/ai_audio/demo.ipynb +0 -1215
- meutils/ai_audio/example.srt +0 -348
- meutils/ai_audio/new.srt +0 -179
- meutils/ai_audio/subtitles.srt +0 -696
- meutils/ai_audio/tts/new.srt +0 -179
- meutils/ai_audio//350/247/206/351/242/221/345/220/210/345/271/266.sh +0 -32
- meutils/ai_cv/1.jpg +0 -0
- meutils/ai_cv/197.jpg +0 -0
- meutils/ai_cv/2.jpg +0 -0
- meutils/ai_cv/img.png +0 -0
- meutils/ai_cv/invoice.jpg +0 -0
- meutils/ai_cv/tbl.png +0 -0
- meutils/ai_cv/test.png +0 -0
- meutils/ann/README.md +0 -33
- meutils/ann/README_gensim.md +0 -47
- meutils/ann/examples/client.py +0 -59
- meutils/ann/examples/demo.py +0 -24
- meutils/api/deeplx.py +0 -29
- meutils/api/qr.png +0 -0
- meutils/clis/README.md +0 -29
- meutils/clis/__test.sh +0 -17
- meutils/clis/deepseek.txt +0 -8
- meutils/clis/deepseek_13003330042.json +0 -1
- meutils/clis/deepseek_13003872192.json +0 -1
- meutils/clis/deepseek_13852263862.json +0 -1
- meutils/clis/deepseek_13913898681.json +0 -1
- meutils/clis/deepseek_13962978617.json +0 -1
- meutils/clis/deepseek_15251801790.json +0 -1
- meutils/clis/deepseek_15720826383.json +0 -1
- meutils/clis/deepseek_18395563611.json +0 -1
- meutils/clis/deepseek_313303303@qq.com.json +0 -1
- meutils/clis/kimi_state.json +0 -1
- meutils/cmds/README.md +0 -55
- meutils/coding/__init__.py +0 -11
- meutils/coding/find132.py +0 -40
- meutils/db/README.md +0 -51
- meutils/decorators/README.md +0 -17
- meutils/docarray_utils/demo_es.py +0 -34
- meutils/docarray_utils/demo_hnsw.py +0 -55
- meutils/docarray_utils/in_memory.py +0 -38
- meutils/docarray_utils//346/224/271/351/200/240/344/270/213hnsw.py +0 -43
- meutils/io/file.py +0 -20
- meutils/io/img.png +0 -0
- meutils/io/x.yml +0 -1
- meutils/notice/img.png +0 -0
- meutils/notice/todo.md +0 -10
- meutils/office_automation//346/212/225/350/265/204/347/256/241/347/220/206/347/263/273/347/273/237O3.2_/344/272/244/346/230/223/347/273/204.pdm +0 -22469
- meutils/playwright_utils/__test.sh +0 -2
- meutils/playwright_utils/kimi1_cookies.json +0 -1
- meutils/playwright_utils/kimi2_cookies.json +0 -1
- meutils/playwright_utils/kimi_cookies.json +0 -93
- meutils/serving/README.md +0 -1
- meutils/serving/celery/_run.sh +0 -10
- meutils/serving/gui/run.sh +0 -9
- meutils/serving/jina/__demo/client.py +0 -42
- meutils/serving/jina/__demo/flow.svg +0 -1
- meutils/serving/jina/__demo/s.py +0 -34
- meutils/serving/jina/__demo/s2.py +0 -37
- meutils/serving/jina/__demo/server.py +0 -83
- meutils/serving/jina/__demo/test.py +0 -40
- meutils/serving/jina/executors/SentenceEncoder.py +0 -62
- meutils/serving/jina/executors/SentenceEncoder_.py +0 -63
- meutils/serving/jina/executors/__init__.py +0 -46
- meutils/serving/jina/executors/base.py +0 -40
- meutils/serving/jina/nlp_serving/__init__.py +0 -11
- meutils/serving/jina/nlp_serving/word_segmentation.py +0 -40
- meutils/serving/streamlit/conf.yaml +0 -5
- meutils/serving/streamlit/ocr.png +0 -0
- meutils/serving/streamlit/run.sh +0 -17
- meutils/serving/webui/.streamlit/_config.toml +0 -186
- meutils/serving/webui/.streamlit/config.toml +0 -26
- meutils/serving/webui/pages/_1_/345/210/206/350/257/215.py +0 -56
- meutils/serving/webui/pages/_2_/350/257/215/346/200/247/346/240/207/346/263/250/344/270/216/345/256/236/344/275/223/350/257/206/345/210/253.py +0 -54
- meutils/serving/webui/pages/_3_/346/226/207/346/234/254/345/214/271/351/205/215.py +0 -64
- meutils/serving/webui/run.sh +0 -9
- meutils/spark/__init__.py +0 -26
- meutils/tools/monitor.yml +0 -29
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/LICENSE +0 -0
- {MeUtils-2024.3.4.13.4.45.dist-info → MeUtils-2025.1.16.17.15.52.dist-info}/top_level.txt +0 -0
- {meutils → examples}/comp_utils/__init__.py +0 -0
- {meutils → examples}/comp_utils/reverse_metric.py +0 -0
- /meutils/{fileparser/README.md → fastapi_utils/exceptions/__init__.py} +0 -0
- /meutils/{fileparser → parsers/fileparser}/PDF/346/212/275/345/217/226.py" +0 -0
- /meutils/{fileparser → parsers/fileparser}/__init__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/common.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/__init__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/__main__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/filetype.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/helpers.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/match.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/__init__.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/application.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/archive.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/audio.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/base.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/document.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/font.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/image.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/isobmff.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/types/video.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/filetype/utils.py +0 -0
- /meutils/{fileparser → parsers/fileparser}/pdf.py +0 -0
- /meutils/{fileparser → parsers/fileparser}//350/241/250/346/240/274/346/212/275/345/217/226.py" +0 -0
@@ -6,16 +6,93 @@
|
|
6
6
|
# @Author : betterme
|
7
7
|
# @WeChat : meutils
|
8
8
|
# @Software : PyCharm
|
9
|
-
# @Description
|
9
|
+
# @Description
|
10
|
+
import io
|
11
|
+
import os
|
12
|
+
|
13
|
+
import requests
|
14
|
+
from meutils.io.files_utils import to_file
|
10
15
|
|
11
16
|
from meutils.pipe import *
|
12
17
|
from openai import OpenAI
|
13
18
|
|
19
|
+
# response_format: Literal["json", "text", "srt", "verbose_json", "vtt"]
|
20
|
+
file = open(
|
21
|
+
"f275d9ac-5a62-4bbe-baf9-3fa10e0332f4.mp3",
|
22
|
+
'rb') # 正确
|
23
|
+
# file=open("2022112519张健涛29.mp3", 'rb')
|
24
|
+
# file = httpx.get("https://oss.chatfire.cn/data/demo.mp3").content
|
25
|
+
|
14
26
|
client = OpenAI(
|
15
|
-
|
16
|
-
|
17
|
-
|
27
|
+
# base_url="https://openai.chatfire.cn/v1",
|
28
|
+
api_key=os.getenv("OPENAI_API_KEY") + "-336",
|
29
|
+
# api_key=os.getenv("OPENAI_API_KEY_OPENAI") + "-336",
|
30
|
+
|
31
|
+
# api_key=os.getenv("SILICONFLOW_API_KEY"),
|
32
|
+
# base_url=os.getenv("SILICONFLOW_BASE_URL")
|
33
|
+
|
34
|
+
# base_url="http://0.0.0.0:8000/v1",
|
35
|
+
# base_url="https://api.chatfire.cc/v2",
|
36
|
+
# base_url="https://api.chatfire.cc/v1",
|
37
|
+
|
38
|
+
# api_key=os.getenv("DEEPINFRA_API_KEY"),
|
39
|
+
# base_url="https://api.deepinfra.com/v1/openai",
|
18
40
|
)
|
41
|
+
# client = OpenAI(
|
42
|
+
# api_key=os.environ.get("GROQ_API_KEY"),
|
43
|
+
# # base_url=os.getenv("GROQ_BASE_URL"),
|
44
|
+
# base_url="https://groq.chatfire.cc/v1",
|
45
|
+
#
|
46
|
+
# )
|
47
|
+
with timer():
|
48
|
+
file = Path('audio.mp3').read_bytes()
|
49
|
+
file = Path("/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/x1.mp3").read_bytes()
|
50
|
+
|
51
|
+
# file = Path('m4a.mp3')
|
52
|
+
|
53
|
+
# file = Path("/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/example.mp3").read_bytes()
|
54
|
+
|
55
|
+
# file = Path("/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/国外健身和生活设备市场观察及分析.mp3").read_bytes()
|
56
|
+
|
57
|
+
# file = Path('audio.mp3').read_bytes()
|
58
|
+
|
59
|
+
# file = arun(to_file(file)) # mp3后缀
|
60
|
+
file = ('_.mp3', file) # ok
|
61
|
+
|
62
|
+
_ = client.audio.transcriptions.create(
|
63
|
+
file=file,
|
64
|
+
|
65
|
+
# model="whisper-1",
|
66
|
+
# model="openai/whisper-large",
|
67
|
+
|
68
|
+
# model="SenseVoiceSmall",
|
69
|
+
model="FunAudioLLM/SenseVoiceSmall",
|
70
|
+
|
71
|
+
# model="distil-whisper/distil-large-v3-ct2",
|
72
|
+
|
73
|
+
# model="asr",
|
74
|
+
|
75
|
+
# model="sensevoice",
|
76
|
+
# model="whisper-large-v3",
|
77
|
+
# response_format="text", # ["json", "text", "srt", "verbose_json", "vtt"]
|
78
|
+
# response_format="srt", # ["json", "text", "srt", "verbose_json", "vtt"]
|
79
|
+
# response_format="verbose_json", # ["json", "text", "srt", "verbose_json", "vtt"]
|
80
|
+
# response_format="vtt", # ["json", "text", "srt", "verbose_json", "vtt"]
|
81
|
+
|
82
|
+
)
|
83
|
+
print(_)
|
84
|
+
#
|
85
|
+
# _ = client.audio.translations.create(
|
86
|
+
# file=file,
|
87
|
+
# # model="whisper-1",
|
88
|
+
# model="whisper-large-v3",
|
89
|
+
# # response_format="text", # ["json", "text", "srt", "verbose_json", "vtt"]
|
90
|
+
# # response_format="srt", # ["json", "text", "srt", "verbose_json", "vtt"]
|
91
|
+
# # response_format="verbose_json", # ["json", "text", "srt", "verbose_json", "vtt"]
|
92
|
+
# # response_format="vtt", # ["json", "text", "srt", "verbose_json", "vtt"]
|
93
|
+
#
|
94
|
+
# )
|
95
|
+
# print(_)
|
96
|
+
|
97
|
+
# Transcription(text='健身需要注意适度和平衡 过度的锻炼可能会导致身体受伤 因此 进行健身活动前 最好先咨询医生 或专业的健身教练 制定一个适合自己的健身计划 一般来说 一周内进行150分钟的适度强度的有氧运动 或者75分钟的高强度有氧运动 加上每周两天的肌肉锻炼就能达到保持健康的目标')
|
19
98
|
|
20
|
-
_ = client.audio.transcriptions.create(file=open("hi.wav", 'rb'), model="whisper-1")
|
21
|
-
print(_)
|
meutils/ai_audio/fast_asr.py
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
# @Author : betterme
|
7
7
|
# @WeChat : meutils
|
8
8
|
# @Software : PyCharm
|
9
|
-
# @Description :
|
10
|
-
|
9
|
+
# @Description :
|
10
|
+
|
11
11
|
from datetime import timedelta
|
12
12
|
|
13
13
|
from meutils.pipe import *
|
@@ -51,8 +51,9 @@ class ASR(object):
|
|
51
51
|
yield segment
|
52
52
|
|
53
53
|
def to_srt(self, segments: Generator[Segment, Any, None], filename='subtitle.srt'):
|
54
|
-
|
54
|
+
import pysrt
|
55
55
|
|
56
|
+
subs = pysrt.SubRipFile()
|
56
57
|
for index, segment in enumerate(segments): # todo: index 从0开始?
|
57
58
|
subs.append(
|
58
59
|
pysrt.SubRipItem(
|
@@ -82,6 +83,8 @@ class ASR(object):
|
|
82
83
|
time_interval = timedelta(seconds=seconds)
|
83
84
|
|
84
85
|
# 创建一个 SubRipTime 对象
|
86
|
+
import pysrt
|
87
|
+
|
85
88
|
srt_time = pysrt.SubRipTime(
|
86
89
|
hours=time_interval.seconds // 3600,
|
87
90
|
minutes=(time_interval.seconds // 60) % 60,
|
@@ -95,6 +98,7 @@ class ASR(object):
|
|
95
98
|
if __name__ == '__main__':
|
96
99
|
# audio_path = '../../../zh_.wav'
|
97
100
|
audio_path = "/Users/betterme/Downloads/videoplayback.m4a"
|
98
|
-
asr = ASR('large')
|
101
|
+
# asr = ASR('large')
|
102
|
+
asr = ASR('tiny', local_files_only=False)
|
99
103
|
|
100
104
|
asr.audio_to_srt(audio_path)
|
meutils/ai_audio/tts/EdgeTTS.py
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
# @WeChat : meutils
|
8
8
|
# @Software : PyCharm
|
9
9
|
# @Description : 增加固定时长的生成
|
10
|
+
# https://github.com/rany2/edge-tts/blob/master/examples/streaming_with_subtitles.py
|
10
11
|
|
11
12
|
import edge_tts
|
12
13
|
|
@@ -48,7 +49,7 @@ class EdgeTTS(object):
|
|
48
49
|
volume: float = 0,
|
49
50
|
filename: Optional[None] = None,
|
50
51
|
):
|
51
|
-
voices = (await edge_tts.VoicesManager.create()).find(**{'ShortName': role}) or [{}]
|
52
|
+
voices = (await edge_tts.VoicesManager.create()).find(**{'ShortName': role}) or [{}] # todo: 优化
|
52
53
|
voice = voices[0].get('ShortName', 'zh-CN-YunxiNeural')
|
53
54
|
|
54
55
|
rate = f"{'+' if rate >= 0 else ''}{rate}%"
|
@@ -58,13 +59,14 @@ class EdgeTTS(object):
|
|
58
59
|
|
59
60
|
filename = filename or f"{time.time()}.mp3" # f"{str(datetime.datetime.now())[:19]}.mp3"
|
60
61
|
await communicate.save(filename)
|
62
|
+
|
61
63
|
return filename
|
62
64
|
|
63
|
-
@retrying
|
65
|
+
@retrying()
|
64
66
|
async def stream_acreate(
|
65
67
|
self,
|
66
68
|
text: str,
|
67
|
-
voice: str = '云希', # "晓晓", "晓伊", "云健", "云希", "云夏", "云扬", "
|
69
|
+
voice: str = '云希', # "晓晓", "晓伊", "云健", "云希", "云夏", "云扬", "辽宁晓北", "陕西晓妮"
|
68
70
|
rate: float = 0,
|
69
71
|
volume: float = 0,
|
70
72
|
**kwargs
|
@@ -87,10 +89,10 @@ class EdgeTTS(object):
|
|
87
89
|
communicate = edge_tts.Communicate(text, voice=voice, rate=rate, volume=volume)
|
88
90
|
async for chunk in communicate.stream(): # 构建生成器,流式输出, todo: 字幕结构体
|
89
91
|
# {'type': 'WordBoundary', 'offset': 1000000, 'duration': 6750000, 'text': '你好'} # 断句字幕
|
92
|
+
# https://github.com/rany2/edge-tts/blob/master/examples/streaming_with_subtitles.py
|
90
93
|
# if chunk.get('type') == 'WordBoundary':
|
91
94
|
# logger.debug(chunk)
|
92
95
|
# continue
|
93
|
-
|
94
96
|
if chunk.get('type') == "audio":
|
95
97
|
yield chunk["data"]
|
96
98
|
|
@@ -103,6 +105,19 @@ class EdgeTTS(object):
|
|
103
105
|
"""
|
104
106
|
return asyncio.run(edge_tts.VoicesManager.create()).find(**kwargs or {"Locale": "zh-CN"})
|
105
107
|
|
108
|
+
async def acreate_for_openai(
|
109
|
+
self,
|
110
|
+
input: str,
|
111
|
+
model: str = 'edge-tts',
|
112
|
+
voice: str = '云希', # 男声 女声
|
113
|
+
**kwargs
|
114
|
+
):
|
115
|
+
data = {
|
116
|
+
"text": input,
|
117
|
+
"voice": voice,
|
118
|
+
}
|
119
|
+
return self.stream_acreate(**data)
|
120
|
+
|
106
121
|
|
107
122
|
if __name__ == '__main__':
|
108
123
|
# print(EdgeTTS().create(['不知道'] * 10))
|
@@ -119,6 +134,17 @@ if __name__ == '__main__':
|
|
119
134
|
陕西省,简称“陕”或“秦”,中华人民共和国省级行政区,省会西安,位于中国内陆腹地,黄河中游,东邻山西、河南,西连宁夏、甘肃,南抵四川、重庆、湖北,北接内蒙古,介于东经105°29′—111°15′,北纬31°42′—39°35′之间,总面积205624.3平方千米。 [1] [5]截至2022年11月,陕西省下辖10个地级市(其中省会西安为副省级市)、31个市辖区、7个县级市、69个县。 [121]截至2022年末,陕西省常住人口3956万人。
|
120
135
|
"""
|
121
136
|
|
122
|
-
|
123
|
-
for i in async2sync_generator(cls.stream_acreate(input)):
|
124
|
-
print(i)
|
137
|
+
print(cls.find_voices(Locale="zh-CN"))
|
138
|
+
# for i in async2sync_generator(cls.stream_acreate(input)):
|
139
|
+
# print(i)
|
140
|
+
|
141
|
+
# EDGE_TTS_DICT = {
|
142
|
+
# "用英语": "en-US-AriaNeural",
|
143
|
+
# "用日语": "ja-JP-NanamiNeural",
|
144
|
+
# "用法语": "fr-BE-CharlineNeural",
|
145
|
+
# "用韩语": "ko-KR-SunHiNeural",
|
146
|
+
# "用德语": "de-AT-JonasNeural",
|
147
|
+
# # add more here
|
148
|
+
# }
|
149
|
+
|
150
|
+
arun(cls.acreate(input))
|
@@ -6,17 +6,22 @@
|
|
6
6
|
# @Author : betterme
|
7
7
|
# @WeChat : meutils
|
8
8
|
# @Software : PyCharm
|
9
|
-
# @Description :
|
9
|
+
# @Description : todo: 更多模型
|
10
10
|
|
11
11
|
from meutils.pipe import *
|
12
12
|
from openai import OpenAI
|
13
13
|
|
14
|
-
base_url =
|
15
|
-
base_url
|
14
|
+
# base_url = 'http://0.0.0.0:8000/v1'
|
15
|
+
# base_url='http://154.3.0.117:39009/tts/v1'
|
16
|
+
# base_url="https://openai-dev.chatfire.cn/audio/v1"
|
17
|
+
# base_url="https://openai.chatfire.cn/audio/v1"
|
18
|
+
# base_url="https://api.chatfire.cn/v2"
|
19
|
+
|
16
20
|
client = OpenAI(
|
17
|
-
|
18
|
-
|
19
|
-
|
21
|
+
# base_url=base_url,
|
22
|
+
# api_key=os.getenv('OPENAI_API_KEY'),
|
23
|
+
|
24
|
+
# api_key=os.getenv('OPENAI_API_KEY_OPENAI'),
|
20
25
|
)
|
21
26
|
|
22
27
|
# text = """
|
@@ -26,17 +31,16 @@ client = OpenAI(
|
|
26
31
|
# _ = client.audio.speech.create(input=text, model="tts", voice="晓晓")
|
27
32
|
# _.stream_to_file("hi.mp3")
|
28
33
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
)
|
41
|
-
|
42
|
-
response.stream_to_file(speech_file_path)
|
34
|
+
with timer():
|
35
|
+
voice = "晓晓"
|
36
|
+
speech_file_path = f"{voice}.mp3"
|
37
|
+
response = client.audio.speech.create(
|
38
|
+
# input="健身需要注意适度和平衡,过度的锻炼可能会导致身体受伤。因此,进行健身活动前,最好先咨询医生或专业的健身教练,制定一个适合自己的健身计划。一般来说,一周内进行150分钟的适度强度的有氧运动,或者75分钟的高强度有氧运动,加上每周两天的肌肉锻炼,就能达到保持健康的目标。",
|
39
|
+
input="健身需要注意适度和平衡,过度的锻炼可能会导致身体受伤",
|
40
|
+
|
41
|
+
model="tts-1",
|
42
|
+
voice=voice,
|
43
|
+
# voice="54a5170264694bfc8e9ad98df7bd89c3"
|
44
|
+
)
|
45
|
+
# logger.debug(response)
|
46
|
+
response.stream_to_file(speech_file_path)
|
meutils/ai_audio/tts/tts_ui.py
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
# @Description : https://www.qianduan.shop/blogs/detail/140
|
10
10
|
# https://baijiahao.baidu.com/s?id=1762431177147996323&wfr=spider&for=pc
|
11
11
|
# https://github.com/pndurette/gTTS
|
12
|
+
# https://github.com/ycyy/edge-tts-webui
|
12
13
|
|
13
14
|
from meutils.pipe import *
|
14
15
|
import gradio as gr
|
meutils/ai_audio/utils.py
CHANGED
@@ -42,3 +42,12 @@ def merge_audios(audio_files, filename: Optional[str] = None):
|
|
42
42
|
|
43
43
|
def to_audio(file, filename="example.wav", format='wav', **kwargs):
|
44
44
|
AudioSegment.from_file(file).export(filename, format=format, **kwargs)
|
45
|
+
|
46
|
+
|
47
|
+
if __name__ == '__main__':
|
48
|
+
file = "/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/asr/shaoyinceo.m4a"
|
49
|
+
file = "/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/asr/audio-.mp3"
|
50
|
+
file = "/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/x1.wav"
|
51
|
+
|
52
|
+
to_audio(file, filename="x1.mp3", format='mp3')
|
53
|
+
|
meutils/ai_cv/__init__.py
CHANGED
meutils/ai_cv/ocr.py
CHANGED
@@ -17,9 +17,10 @@ from rapidocr_onnxruntime import RapidOCR
|
|
17
17
|
|
18
18
|
rapid_ocr = RapidOCR()
|
19
19
|
# results, elapse = rapid_ocr('invoice.jpg')
|
20
|
-
results, elapse = rapid_ocr('tbl.png')
|
20
|
+
# results, elapse = rapid_ocr('tbl.png')
|
21
|
+
results, elapse = rapid_ocr('bg.png')
|
21
22
|
|
22
23
|
rprint(results)
|
23
24
|
print([i[1] for i in results])
|
24
25
|
|
25
|
-
# rprint([dict(zip(['坐标', '文字'], r)) for r in results])
|
26
|
+
# rprint([dict(zip(['坐标', '文字'], r)) for r in results])
|
meutils/ai_cv/utils.py
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Project : AI. @by PyCharm
|
4
|
+
# @File : utils
|
5
|
+
# @Time : 2024/6/12 08:34
|
6
|
+
# @Author : betterme
|
7
|
+
# @WeChat : meutils
|
8
|
+
# @Software : PyCharm
|
9
|
+
# @Description :
|
10
|
+
|
11
|
+
from meutils.pipe import *
|
12
|
+
from meutils.oss.minio_oss import Minio
|
13
|
+
|
14
|
+
from PIL import Image, ImageDraw
|
15
|
+
|
16
|
+
|
17
|
+
def crop_polygon(image: Union[str, bytes], outline_points, inline_points):
|
18
|
+
if isinstance(image, bytes):
|
19
|
+
image = io.BytesIO(image)
|
20
|
+
|
21
|
+
# 打开图像
|
22
|
+
img = Image.open(image)
|
23
|
+
|
24
|
+
# 创建一个与原图大小相同的黑色遮罩
|
25
|
+
mask = Image.new('L', img.size, 0)
|
26
|
+
|
27
|
+
# 在遮罩上绘制白色多边形
|
28
|
+
for points in outline_points:
|
29
|
+
ImageDraw.Draw(mask).polygon(points, outline=1, fill=255)
|
30
|
+
|
31
|
+
for points in inline_points:
|
32
|
+
ImageDraw.Draw(mask).polygon(points, outline=1, fill=0)
|
33
|
+
|
34
|
+
# 将遮罩应用到原图
|
35
|
+
output = Image.new('RGBA', img.size, (0, 0, 0, 0))
|
36
|
+
output.paste(img, (0, 0), mask)
|
37
|
+
|
38
|
+
# # 将 PIL Image 转换为字节
|
39
|
+
# buffer = io.BytesIO()
|
40
|
+
# output.save(buffer, format="PNG")
|
41
|
+
# byte_data = buffer.getvalue()
|
42
|
+
#
|
43
|
+
# return byte_data
|
44
|
+
return output
|
45
|
+
|
46
|
+
|
47
|
+
def crop_image(
|
48
|
+
image: Union[Path, str, bytes],
|
49
|
+
|
50
|
+
width: Optional[int] = None,
|
51
|
+
height: Optional[int] = None,
|
52
|
+
x: int = 0,
|
53
|
+
y: int = 0,
|
54
|
+
|
55
|
+
debug: bool = False
|
56
|
+
):
|
57
|
+
"""
|
58
|
+
crop_image(image="https://sfile.chatglm.cn/testpath/4f520e7f-c2f5-5555-8d1f-4fda0fec0e9d_0.png", height=950, debug=True)
|
59
|
+
|
60
|
+
:param image:
|
61
|
+
:param width:
|
62
|
+
:param height:
|
63
|
+
:param x:
|
64
|
+
:param y:
|
65
|
+
:param debug:
|
66
|
+
:return:
|
67
|
+
"""
|
68
|
+
if isinstance(image, bytes):
|
69
|
+
image = io.BytesIO(image)
|
70
|
+
|
71
|
+
elif isinstance(image, str) and image.startswith("http"):
|
72
|
+
response = httpx.get(image)
|
73
|
+
image = io.BytesIO(response.content)
|
74
|
+
|
75
|
+
image = Image.open(image) # .convert('RGB')
|
76
|
+
|
77
|
+
width = width or image.width
|
78
|
+
height = height or image.height
|
79
|
+
cropped_image = image.crop((x, y, x + width, y + height))
|
80
|
+
|
81
|
+
if debug:
|
82
|
+
logger.debug(image.size)
|
83
|
+
logger.debug(cropped_image.size)
|
84
|
+
cropped_image.show()
|
85
|
+
|
86
|
+
return cropped_image # .save('output.png')
|
87
|
+
|
88
|
+
|
89
|
+
def crop_image_and_upload(
|
90
|
+
image: Union[Path, str, bytes],
|
91
|
+
|
92
|
+
width: Optional[int] = None,
|
93
|
+
height: Optional[int] = None,
|
94
|
+
x: int = 0,
|
95
|
+
y: int = 0,
|
96
|
+
|
97
|
+
debug: bool = False,
|
98
|
+
|
99
|
+
file_id: Optional[str] = None
|
100
|
+
):
|
101
|
+
# 创建一个 BytesIO 对象用于保存字节数据
|
102
|
+
# byte_io = io.BytesIO()
|
103
|
+
|
104
|
+
# 将图像保存到 BytesIO 对象中
|
105
|
+
# image.save(byte_io, format='PNG')
|
106
|
+
# 获取字节数据
|
107
|
+
# byte_data = byte_io.getvalue()
|
108
|
+
|
109
|
+
image = crop_image(image, width, height, x, y, debug)
|
110
|
+
|
111
|
+
file_id = file_id or shortuuid.random()
|
112
|
+
filename = f"{file_id}.png"
|
113
|
+
image.save(filename)
|
114
|
+
|
115
|
+
# 上传
|
116
|
+
client = Minio()
|
117
|
+
client.fput_object('files', filename, file_path=filename, content_type='image/png')
|
118
|
+
|
119
|
+
# 删除临时文件
|
120
|
+
Path(filename).unlink(True)
|
121
|
+
return client.get_file_url(filename)
|
122
|
+
|
123
|
+
|
124
|
+
def del_watermark(): # 去水印
|
125
|
+
import poimage
|
126
|
+
# poimage = try_import("poimage")
|
127
|
+
# 支持jpg、png等所有图片格式
|
128
|
+
poimage.del_watermark(
|
129
|
+
input_image="img.png",
|
130
|
+
output_image='img_.png'
|
131
|
+
)
|
132
|
+
|
133
|
+
|
134
|
+
if __name__ == '__main__':
|
135
|
+
# (left, top, right, bottom)
|
136
|
+
|
137
|
+
# 调用该函数传入图片路径、裁剪起始点坐标(x, y)以及宽度和高度
|
138
|
+
# crop_image("yuanbao.jpeg", height= 998, debug=True)
|
139
|
+
# crop_image("zhipu.png", 0, 0, 1024, 950)
|
140
|
+
# crop_image(Path("yuanbao.jpeg").read_bytes(), height=998, debug=True)
|
141
|
+
|
142
|
+
# r = requests.get("https://sfile.chatglm.cn/testpath/4f520e7f-c2f5-5555-8d1f-4fda0fec0e9d_0.png")
|
143
|
+
# print(r.content)
|
144
|
+
|
145
|
+
image = crop_image(
|
146
|
+
image="https://sfile.chatglm.cn/testpath/4f520e7f-c2f5-5555-8d1f-4fda0fec0e9d_0.png",
|
147
|
+
height=950,
|
148
|
+
debug=True
|
149
|
+
)
|
150
|
+
|
151
|
+
print(crop_image_and_upload(
|
152
|
+
image="https://sfile.chatglm.cn/testpath/4f520e7f-c2f5-5555-8d1f-4fda0fec0e9d_0.png",
|
153
|
+
height=950,
|
154
|
+
debug=True))
|
meutils/ai_video/avmerge.py
CHANGED
@@ -33,3 +33,9 @@ video_clip.write_videofile("avmerged3.mp4")
|
|
33
33
|
# FileNotFoundError: [Errno 2] No such file or directory:\
|
34
34
|
# 'ffmpeg -hide_banner -y -i "/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_video/output.mp4" ' \
|
35
35
|
# '-ac 1 "/Users/betterme/PycharmProjects/AI/pyvideotrans/tmp/output/output.wav"'
|
36
|
+
|
37
|
+
|
38
|
+
def extract_audio(video__path, audio_path):
|
39
|
+
my_clip = AudioFileClip(video__path)
|
40
|
+
my_clip.write_audiofile(audio_path)
|
41
|
+
return my_clip
|
meutils/ai_video/video.py
CHANGED
@@ -25,7 +25,7 @@ def video2image(video: str, top_duration=180):
|
|
25
25
|
clip_.save_frame(p / f'{i}.png')
|
26
26
|
|
27
27
|
|
28
|
-
def
|
28
|
+
def _video2audio(path_pair, verbose=False, subclip=None, ffmpeg_params=["-f", "mp3"]):
|
29
29
|
"""
|
30
30
|
clip = VideoFileClip('蛋清和蛋黄是这么分离的.720p').subclip(3, 7)
|
31
31
|
|
@@ -48,6 +48,15 @@ def video2audio(path_pair, verbose=False, subclip=None, ffmpeg_params=["-f", "mp
|
|
48
48
|
)
|
49
49
|
|
50
50
|
|
51
|
+
def video2audio(video_path, audio_path):
|
52
|
+
with AudioFileClip(video_path) as clip:
|
53
|
+
clip.write_audiofile(audio_path)
|
54
|
+
|
55
|
+
|
51
56
|
if __name__ == '__main__':
|
57
|
+
video_path = "douyin.mp4"
|
58
|
+
|
52
59
|
# video2image("/Users/betterme/Downloads/11月15日.mp4")
|
53
|
-
video2audio([
|
60
|
+
# video2audio([video_path, "x.mp3"])
|
61
|
+
|
62
|
+
print(video2audio('/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/asr/blibli.mp4', "x.mp3"))
|
meutils/{api → apis}/__init__.py
RENAMED
meutils/apis/ali_apis.py
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Project : AI. @by PyCharm
|
4
|
+
# @File : express
|
5
|
+
# @Time : 2024/4/24 17:17
|
6
|
+
# @Author : betterme
|
7
|
+
# @WeChat : meutils
|
8
|
+
# @Software : PyCharm
|
9
|
+
# @Description :
|
10
|
+
|
11
|
+
from meutils.pipe import *
|
12
|
+
|
13
|
+
@lru_cache
|
14
|
+
def express_query(express_no=780098068058, path: str = '/kdi', appcode: Optional[str] = None):
|
15
|
+
"""
|
16
|
+
|
17
|
+
:param appcode:
|
18
|
+
appcode = '0ccd86184de94ca19c37cbb215b1f3722' # 开通服务后 买家中心-查看AppCode
|
19
|
+
|
20
|
+
:param express_no:
|
21
|
+
:param path:
|
22
|
+
:return:
|
23
|
+
"""
|
24
|
+
base_url = "https://wuliu.market.alicloudapi.com"
|
25
|
+
with httpx.Client(base_url=base_url) as client:
|
26
|
+
headers = {"Authorization": f'APPCODE {appcode or os.getenv("EXPRESS_APP_CODE")}'}
|
27
|
+
params = {'no': express_no}
|
28
|
+
|
29
|
+
response = client.get(path, params=params, headers=headers)
|
30
|
+
if response.status_code == 200:
|
31
|
+
return response.json()
|
32
|
+
else:
|
33
|
+
return {"error": response.text}
|
34
|
+
|
35
|
+
|
36
|
+
async def aexpress_query(express_no=780098068058, path: str = '/kdi', appcode: Optional[str] = None):
|
37
|
+
"""
|
38
|
+
|
39
|
+
:param appcode:
|
40
|
+
appcode = '0ccd86184de94ca19c37cbb215b1f372' # 开通服务后 买家中心-查看AppCode
|
41
|
+
|
42
|
+
:param express_no:
|
43
|
+
:param path:
|
44
|
+
:return:
|
45
|
+
"""
|
46
|
+
base_url = "https://wuliu.market.alicloudapi.com"
|
47
|
+
async with httpx.AsyncClient(base_url=base_url) as client:
|
48
|
+
headers = {"Authorization": f'APPCODE {appcode or os.getenv("EXPRESS_APP_CODE")}'}
|
49
|
+
params = {'no': express_no}
|
50
|
+
response = await client.get(path, params=params, headers=headers)
|
51
|
+
if response.status_code == 200:
|
52
|
+
return response.json()
|
53
|
+
else:
|
54
|
+
return {"error": response.text}
|
55
|
+
|
56
|
+
|
57
|
+
if __name__ == '__main__':
|
58
|
+
# print(express_query('0ccd86184de94ca19c37cbb215b1f372'))
|
59
|
+
|
60
|
+
print(arun(aexpress_query('0ccd86184de94ca19c37cbb215b1f372')))
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Project : AI. @by PyCharm
|
4
|
+
# @File : deepinfra
|
5
|
+
# @Time : 2024/11/26 13:57
|
6
|
+
# @Author : betterme
|
7
|
+
# @WeChat : meutils
|
8
|
+
# @Software : PyCharm
|
9
|
+
# @Description :
|
10
|
+
|
11
|
+
from openai import AsyncOpenAI
|
12
|
+
|
13
|
+
from meutils.pipe import *
|
14
|
+
from meutils.decorators.retry import retrying
|
15
|
+
from meutils.io.files_utils import to_bytes
|
16
|
+
from meutils.config_utils.lark_utils import get_next_token_for_polling
|
17
|
+
from meutils.notice.feishu import send_message as _send_message, AUDIO
|
18
|
+
from meutils.schemas.openai_types import STTRequest
|
19
|
+
|
20
|
+
FEISHU_URL = "https://xchatllm.feishu.cn/sheets/GYCHsvI4qhnDPNtI4VPcdw2knEd?sheet=6lr4oi"
|
21
|
+
|
22
|
+
BASE_URL = os.getenv("DEEPINFRA_BASE_URL")
|
23
|
+
|
24
|
+
DEFAULT_MODEL = "openai/whisper-large-v3-turbo"
|
25
|
+
MODELS = {
|
26
|
+
"whisper-large-v3": "openai/whisper-large-v3",
|
27
|
+
"whisper-large-v3-turbo": "openai/whisper-large-v3-turbo",
|
28
|
+
"whisper-1": "distil-whisper/distil-large-v3"
|
29
|
+
}
|
30
|
+
|
31
|
+
send_message = partial(
|
32
|
+
_send_message,
|
33
|
+
title=__name__,
|
34
|
+
url=AUDIO
|
35
|
+
)
|
36
|
+
|
37
|
+
|
38
|
+
@retrying(max_retries=3, title=__name__)
|
39
|
+
async def asr(request: STTRequest, api_key: Optional[str] = None):
|
40
|
+
api_key = api_key or await get_next_token_for_polling(FEISHU_URL)
|
41
|
+
|
42
|
+
request.model = MODELS.get(request.model, DEFAULT_MODEL)
|
43
|
+
request.file = ('_.mp3', await to_bytes(request.file))
|
44
|
+
|
45
|
+
data = request.model_dump(exclude_none=True)
|
46
|
+
|
47
|
+
client = AsyncOpenAI(base_url=BASE_URL, api_key=api_key)
|
48
|
+
response = await client.audio.transcriptions.create(**data)
|
49
|
+
return response
|
50
|
+
|
51
|
+
|
52
|
+
if __name__ == '__main__':
|
53
|
+
request = STTRequest(
|
54
|
+
model="whisper-1",
|
55
|
+
file=Path("/Users/betterme/PycharmProjects/AI/MeUtils/meutils/ai_audio/asr/audio.mp3").read_bytes()
|
56
|
+
)
|
57
|
+
|
58
|
+
arun(asr(request))
|
59
|
+
# print(MODELS.values())
|