اخبار تکنولوژی

با پایتون یک مولد برچسب واتس اپ با هوش مصنوعی بسازید

تصور کنید که میم ها یا کارتون های سفارشی خود را به جای آن ها از اینترنت ارسال می کنید. بنابراین، سلفی ها یا عکس های خود را با استفاده از مدل جدید GPT-Image-1 OpenAI به استیکرهای سرگرم کننده و سبک تبدیل کنید. در این آموزش، ما یک مولد استیکر واتس‌اپ در پایتون می‌سازیم که سبک‌های هنری مختلفی از جمله فیلترهای کارتونی و پیکسار را روی تصاویر شما اعمال می‌کند.

شما یاد خواهید گرفت که چگونه API ویرایش تصویر OpenAI را تنظیم کنید، تصاویر را در Colab ضبط یا آپلود کنید، دسته بندی متن های سرگرم کننده و طنز را تعریف کنید یا از متن خود استفاده کنید، و سه برچسب را به صورت موازی با استفاده از چندین کلید API برای سرعت پردازش کنید. در نهایت با یک استیکرساز کار می‌کنید که توسط GPT-Image-1 و پیام‌های متنی سفارشی ارائه می‌شود.

چرا GPT-Image-1؟

ما چندین مدل پیشرفته تولید تصویر از جمله Gemini 2.0 Flash، Flux و Phoenix را در پلتفرم Leonardo.ai ارزیابی کردیم. به ویژه، همه این مدل‌ها با رندر صحیح متن و عبارات مشکل داشتند. به عنوان مثال:

  • Google Image API Gemini 2.0 اغلب کلمات اشتباه املایی یا گیج کننده را حتی زمانی که دستورالعمل های دقیق داده می شود تولید می کند. به عنوان مثال، با Gemini، متن دقیق شبیه “فروش بزرگ امروز!” و ما نتایجی مانند “فروش بزرگ امروز” یا مزخرفات تصادفی دریافت می کنیم.
  • Flux به طور کلی کیفیت تصویر بالایی را ارائه می دهد، اما کاربران گزارش می دهند که “به سرعت خطاهای کوچکی را در هر متنی که ارائه می کند وارد می کند”. Flux همچنین اشتباهات تایپی کوچک یا حروف مخدوش ایجاد می کند، به خصوص با افزایش طول متن. Flux همچنین به صورت پیش‌فرض روی نسل‌های چهره بسیار مشابه یعنی. “همه چهره ها یکسان به نظر می رسند” مگر اینکه بسیار محدود شده باشند.
  • فونیکس برای وفاداری و پایبندی سریع بهینه شده است، اما مانند بسیاری از مدل های انتشار، همچنان متن را به صورت بصری می بیند و می تواند خطاهایی را ایجاد کند. ما متوجه شدیم که فونیکس فقط می‌تواند به صورت پراکنده یک برچسب با عبارت درست ایجاد کند و تمایل داشت همان صورت پیش‌فرض را برای یک درخواست داده شده تکرار کند.

این محدودیت ها با هم ما را به توسعه GPT-Image-1 سوق داد. برخلاف مدل‌های فوق، GPT-Image-1 شامل یک خط لوله اعلان تخصصی است که به صراحت تغییرات متن و عبارت صحیح را اعمال می‌کند.

بیشتر بخوانید: چگونه مدل Flux را شروع کنیم؟

چگونه GPT-Image-1 ویرایش تصویر را تقویت می کند

GPT-Image-1 مدل چندوجهی پرچمدار OpenAI است. برای تولید تصاویر خروجی با کیفیت بالا، تصاویر را از متن و پیام های تصویری ایجاد و ویرایش می کند. اساساً، می‌توانیم به GPT-Image-1 دستور دهیم تا بر اساس یک اعلان متن، ویرایشی را بر روی تصویر منبع اعمال کند. در مورد ما از تصاویر استفاده می کنیم. نقطه پایانی GPT-Image-1 API را ویرایش کنید تا فیلترهای سرگرم کننده و طنزآمیز و متن روی عکس ورودی برای ایجاد برچسب اعمال شود.

اعلان با دقت ساخته شده است تا خروجی مناسب برای برچسب (۱۰۲۴ × ۱۰۲۴ PNG) ارائه دهد. سپس GPT-Image-1 اساساً تبدیل به یک برچسب ساز با هوش مصنوعی می شود، جایی که ظاهر شی را در عکس تغییر می دهد و متن سرگرم کننده اضافه می کند.

# Set up OpenAI clients for each API key (to run parallel requests)

clients = [OpenAI(api_key=key) for key in API_KEYS]

بنابراین برای آن یک کلاینت کلید OpenAI API ایجاد می کنیم. با سه کلید می توانیم سه تماس API همزمان برقرار کنیم. این رویکرد چند کلیدی و چند رشته ای از ThreadPoolExecutor استفاده می کند. این به ما امکان می دهد برای هر اجرا ۳ استیکر به صورت موازی تولید کنیم. در حالی که کد در حال چاپ است، از “۳ کلید API برای تولید همزمان” استفاده می کند که سرعت ایجاد استیکر را بسیار افزایش می دهد.

همچنین ببینید :  نرم‌افزار جدید لباس‌های سازگار با محیط زیست را طراحی می‌کند که می‌توان آن‌ها را دوباره به عناصر جدید تبدیل کرد | اخبار MIT

راهنمای گام به گام

ایده ایجاد مولد برچسب هوش مصنوعی ممکن است پیچیده به نظر برسد، اما این راهنما به ساده‌تر کردن کل فرآیند کمک می‌کند. شما با آماده کردن محیط در Google Colab شروع می‌کنید، سپس API را بررسی می‌کنیم، دسته‌های عبارات را درک می‌کنیم، متن را اعتبارسنجی می‌کنیم، سبک‌های هنری مختلف تولید می‌کنیم و در نهایت استیکرها را به صورت موازی تولید می‌کنیم. هر قسمت با تکه کد و توضیحات همراه است تا بتوانید به راحتی آن را دنبال کنید. حالا بریم سراغ کد:

Colab را نصب و اجرا کنید

برای تولید استیکرها، باید تنظیمات مناسبی داشته باشیم! این پروژه از کتابخانه های پایتون استفاده خواهد کرد PIL و rembg برای پردازش تصویر اولیه و google-genai برای استفاده در نمونه Colab استفاده خواهد شد. اولین قدم این است که وابستگی ها را مستقیماً در نوت بوک Colab خود نصب کنید.

!pip install --upgrade google-genai pillow rembg

!pip install --upgrade onnxruntime

!pip install python-dotenv

ادغام OpenAI و کلیدهای API

پس از نصب، ماژول ها را وارد کرده و کلیدهای API را تنظیم کنید. اسکریپت یک کلاینت OpenAI برای هر کلید API ایجاد می کند. این به کد اجازه می دهد تا درخواست های ویرایش تصویر را در چندین سوئیچ به صورت موازی توزیع کند. سپس لیست مشتریان توسط توابع تولید برچسب استفاده می شود.

API_KEYS = [ # 3 API keys

            "API KEY 1",

             "API KEY 2",

             "API KEY 3"

]

"""# Stickerverse

"""

import os

import random

import base64

import threading

from concurrent.futures import ThreadPoolExecutor, as_completed

from openai import OpenAI

from PIL import Image

from io import BytesIO

from rembg import remove

from google.colab import files

from IPython.display import display, Javascript

from google.colab.output import eval_js

import time

clients = [OpenAI(api_key=key) for key in API_KEYS]

آپلود تصاویر و گرفتن دوربین (منطقی)

اکنون مرحله بعدی دسترسی به دوربین برای گرفتن عکس یا آپلود فایل تصویری است. را capture_photo() از جاوا اسکریپت تزریق شده به Colab برای باز کردن وب‌کم و بازگرداندن عکس‌های گرفته شده استفاده می‌کند image.upload_image() از آپلود کننده فایل Colab استفاده می کند و فایل آپلود شده را با PIL بررسی می کند.

# Camera capture via JS

def capture_photo(filename="photo.jpg", quality=0.9):

    js_code = """

    async function takePhoto(quality) 

        const div = document.createElement('div');

        const video = document.createElement('video');

        const btn = document.createElement('button');

        btn.textContent="📸 Capture";

        div.appendChild(video);

        div.appendChild(btn);

        document.body.appendChild(div);

        const stream = await navigator.mediaDevices.getUserMedia(video: true);

        video.srcObject = stream;

        await video.play();

        await new Promise(resolve => btn.onclick = resolve);

        const canvas = document.createElement('canvas');

        canvas.width = video.videoWidth;

        canvas.height = video.videoHeight;

        canvas.getContext('2d').drawImage(video, 0, 0);

        stream.getTracks().forEach(track => track.stop());

        div.remove();

        return canvas.toDataURL('image/jpeg', quality);

    

    """

    display(Javascript(js_code))

    data = eval_js("takePhoto(%f)" % quality)

    binary = base64.b64decode(data.split(',')[1])

    with open(filename, 'wb') as f:

        f.write(binary)

    print(f"Saved: filename")

    return filename

# Image upload function

def upload_image():

    print("Please upload your image file...")

    uploaded = files.upload()

    if not uploaded:

        print("No file uploaded!")

        return None

    filename = list(uploaded.keys())[0]

    print(f"Uploaded: filename")

    # Validate if it's an image

    try:

        img = Image.open(filename)

        img.verify()

        print(f"📸 Image verified: img.format img.size")

        return filename

    except Exception as e:

        print(f"Invalid image file: str(e)")

        return None

# Interactive image source selection

def select_image_source():

    print("Choose image source:")

    print("1. Capture from camera")

    print("2. Upload image file")

    while True:

        try:

            choice = input("Select option (1-2): ").strip()

            if choice == "1":

                return "camera"

            elif choice == "2":

                return "upload"

            else:

                print("Invalid choice! Please enter 1 or 2.")

        except KeyboardInterrupt:

            print("\nGoodbye!")

            return None

خروجی:

خارج شوید

نمونه هایی از دسته ها و عبارات

اکنون می خواهیم دسته بندی های مختلف عبارات خود را ایجاد کنیم تا روی استیکرهای خود قرار دهیم. بنابراین ما از فرهنگ لغت PHRASE_CATEGORIES استفاده خواهیم کرد که شامل دسته بندی های بسیاری مانند شرکت ها، بالیوود، هالیوود، تالیوود، ورزش ها، میم ها و موارد دیگر است. هنگامی که یک دسته انتخاب می شود، کد به طور تصادفی سه عبارت منحصر به فرد را برای سه سبک برچسب انتخاب می کند.

PHRASE_CATEGORIES = 

    "corporate": [

        "Another meeting? May the force be with you!",

        "Monday blues activated!",

        "This could have been an email, boss!"

    ],

    "bollywood": [

        "Mogambo khush hua!",

        "Kitne aadmi the?",

        "Picture abhi baaki hai mere dost!"

    ],

    "memes": [

        "Bhagwan bharose!",

        "Main thak gaya hoon!",

        "Beta tumse na ho payega!"

    ]

دسته بندی عبارات و متن سفارشی

مولد از فرهنگ لغت دسته بندی عبارات استفاده می کند. کاربر می تواند یک دسته انتخاب عبارت تصادفی را انتخاب کند یا عبارت سفارشی خود را وارد کند. همچنین توابع کمکی برای انتخاب تعاملی و همچنین یک تابع ساده برای اعتبارسنجی طول یک عبارت سفارشی وجود دارد.

def select_category_or_custom():

    print("\nChoose your sticker text option:")

    print("1. Pick from phrase category (random selection)")

    print("2. Enter my own custom phrase")

    while True:

        try:

            choice = input("Choose option (1 or 2): ").strip()

            if choice == "1":

                return "category"

            elif choice == "2":

                return "custom"

            else:

                print("Invalid choice! Please enter 1 or 2.")

        except KeyboardInterrupt:

            print("\nGoodbye!")

            return None

# NEW: Function to get custom phrase from user

def get_custom_phrase():

    while True:

        phrase = input("\nEnter your custom sticker text (2-50 characters): ").strip()

        if len(phrase) < 2:

            print("Too short! Please enter at least 2 characters.")

            continue

        elif len(phrase) > 50:

            print("Too long! Please keep it under 50 characters.")

            continue

        else:

            print(f"Custom phrase accepted: 'phrase'")

            return phrase

برای عبارات سفارشی، طول ورودی (۲ تا ۵۰ کاراکتر) قبل از پذیرش بررسی می شود.

همچنین ببینید :  آیا تراشه های هوش مصنوعی می توانند علوم پیچیده را مدیریت کنند؟ SandboxAQ و Nvidia نشان می دهند که چه چیزی ممکن است

اعتبار سنجی عبارت و حفاظت املایی

def validate_and_correct_spelling(text):

    spelling_prompt = f"""

    Please check the spelling and grammar of the following text and return ONLY the corrected version.

    Do not add explanations, comments, or change the meaning.

    Text to check: "text"

    """

    response = clients[0].chat.completions.create(

        model="gpt-4o-mini",

        messages=["role": "user", "content": spelling_prompt],

        max_tokens=100,

        temperature=0.1

    )

    corrected_text = response.choices[0].message.content.strip()

    return corrected_text

اکنون یک نمونه ایجاد می کنیم build_prompt تابع برای تنظیم برخی از دستورالعمل های سطح پایه برای عامل. همچنین در نظر داشته باشید build_prompt() غلط‌گیر املا را فراخوانی می‌کند و سپس متن تصحیح‌شده را در اعلان برچسب سخت‌گیرانه جاسازی می‌کند:

# Concise Prompt Builder with Spelling Validation

def build_prompt(text, style_variant):

    corrected_text = validate_and_correct_spelling(text)

    base_prompt = f"""

    Create a HIGH-QUALITY WhatsApp sticker in style_variant style.

    OUTPUT:

    - ۱۰۲۴x1024 transparent PNG with 8px white border

    - Subject centered, balanced composition, sharp details

    - Preserve original facial identity and proportions

    - Match expression to sentiment of text: 'corrected_text'

    TEXT:

    - Use EXACT text: 'corrected_text' (no changes, no emojis)

    - Bold comic font with black outline, high-contrast colors

    - Place text in empty space (top/bottom), never covering the face

    RULES:

    - No hallucinated elements or decorative glyphs

    - No cropping of head/face or text

    - Maintain realistic but expressive look

    - Ensure consistency across stickers

    """

    return base_prompt.strip()

انواع سبک: کارتون در مقابل پیکسار

سه الگوی سبک در STYLE_VARIANTS زندگی می‌کنند. دو مورد اول دگرگونی های کارتونی و آخرین نمای سه بعدی به سبک پیکسار است. این رشته ها مستقیماً به سازنده سریع ارسال می شود و سبک بصری را دیکته می کند.

STYLE_VARIANTS = [

    "Transform into detailed caricature with slightly exaggerated facial features...",

    "Transform into expressive caricature with enhanced personality features...",

    "Transform into high-quality Pixar-style 3D animated character..."

]

تولید موازی استیکرها

نقطه قوت واقعی پروژه، تولید موازی استیکرها است. تولید استیکر به صورت موازی در هر سه رشته به طور همزمان و با استفاده از کلیدهای API جداگانه انجام می شود، بنابراین تأخیر به طور چشمگیری کاهش می یابد.

# Generate single sticker using OpenAI GPT-image-1 with specific client (WITH TIMING)
def generate_single_sticker(input_path, output_path, text, style_variant, client_idx):

    try:

        start_time = time.time()

        thread_id = threading.current_thread().name

        print(f"[START] Thread-thread_id: API-client_idx+1 generating style_variant[:30]... at time.strftime('%H:%M:%S', time.localtime(start_time))")

        prompt = build_prompt(text, style_variant)

        result = clients[client_idx].images.edit(

            model="gpt-image-1",

            image=[open(input_path, "rb")],

            prompt=prompt,

            # input_fidelity="high"

            quality = 'medium'

        )

        image_base64 = result.data[0].b64_json

        image_bytes = base64.b64decode(image_base64)

        with open(output_path, "wb") as f:

            f.write(image_bytes)

        end_time = time.time()

        duration = end_time - start_time

        style_type = "Caricature" if "caricature" in style_variant.lower() else "Pixar"

        print(f"[DONE] Thread-thread_id: style_type saved as output_path | Duration: duration:.2fs | Text: 'text[:30]...'")

        return True

    except Exception as e:

        print(f"[ERROR] API-client_idx+1 failed: str(e)")

        return False

# NEW: Create stickers with custom phrase (all 3 styles use the same custom text)

def create_custom_stickers_parallel(photo_file, custom_text):

    print(f"\nCreating 3 stickers with your custom phrase: 'custom_text'")

    print("   • Style 1: Caricature #1")

    print("   • Style 2: Caricature #2")

    print("   • Style 3: Pixar Animation")

    # Map futures to their info

    tasks_info = 

    with ThreadPoolExecutor(max_workers=3, thread_name_prefix="CustomSticker") as executor:

        start_time = time.time()

        print(f"\n[PARALLEL START] Submitting 3 API calls SIMULTANEOUSLY at time.strftime('%H:%M:%S', time.localtime(start_time))")

        # Submit ALL tasks at once (non-blocking) - all using the same custom text

        for idx, style_variant in enumerate(STYLE_VARIANTS):

            output_name = f"custom_sticker_idx+1.png"

            future = executor.submit(generate_single_sticker, photo_file, output_name, custom_text, style_variant, idx)

            tasks_info[future] = 

                'output_name': output_name,

                'text': custom_text,

                'style_variant': style_variant,

                'client_idx': idx,

                'submit_time': time.time()

            

        print("All 3 API requests submitted! Processing as they complete...")

        completed = 0

        completion_times = []

        # Process results as they complete

        for future in as_completed(tasks_info.keys(), timeout=180):

            try:

                success = future.result()

                task_info = tasks_info[future]

                if success:

                    completed += 1

                    completion_time = time.time()

                    completion_times.append(completion_time)

                    duration = completion_time - task_info['submit_time']

                    style_type = "Caricature" if "caricature" in task_info['style_variant'].lower() else "Pixar"

                    print(f"[completed/3] style_type completed: task_info['output_name'] "

                          f"(API-task_info['client_idx']+1, duration:.1fs)")

                else:

                    print(f"Failed: task_info['output_name']")

            except Exception as e:

                task_info = tasks_info[future]

                print(f"Error with task_info['output_name'] (API-task_info['client_idx']+1): str(e)")

        total_time = time.time() - start_time

        print(f"\n [FINAL RESULT] completed/3 custom stickers completed in total_time:.1f seconds!")

# UPDATED: Create 3 stickers in  PARALLEL (using as_completed)

def create_category_stickers_parallel(photo_file, category):

    if category not in PHRASE_CATEGORIES:

        print(f" Category 'category' not found! Available: list(PHRASE_CATEGORIES.keys())")

        return

    # Choose 3 unique phrases for 3 stickers

    chosen_phrases = random.sample(PHRASE_CATEGORIESBeginner, 3)

    print(f" Selected phrases for category.title() category:")

    for i, phrase in enumerate(chosen_phrases, 1):

        style_type = "Caricature" if i <= 2 else "Pixar Animation"

        print(f"   i. [style_type] 'phrase' → API Key i")

    # Map futures to their info

    tasks_info = 

    with ThreadPoolExecutor(max_workers=3, thread_name_prefix="StickerGen") as executor:

        start_time = time.time()

        print(f"\n [PARALLEL START] Submitting 3 API calls SIMULTANEOUSLY at time.strftime('%H:%M:%S', time.localtime(start_time))")

        # Submit ALL tasks at once (non-blocking)

        for idx, (style_variant, text) in enumerate(zip(STYLE_VARIANTS, chosen_phrases)):

            output_name = f"category_sticker_idx+1.png"

            future = executor.submit(generate_single_sticker, photo_file, output_name, text, style_variant, idx)

            tasks_info[future] = 

                'output_name': output_name,

                'text': text,

                'style_variant': style_variant,

                'client_idx': idx,

                'submit_time': time.time()

            

        print("All 3 API requests submitted! Processing as they complete...")

        print("   • API Key 1 → Caricature #1")

        print("   • API Key 2 → Caricature #2")

        print("   • API Key 3 → Pixar Animation")

        completed = 0

        completion_times = []

        # Process results as they complete (NOT in submission order)

        for future in as_completed(tasks_info.keys(), timeout=180):  # ۳ minute total timeout

            try:

                success = future.result()  # This only waits until ANY future completes

                task_info = tasks_info[future]

                if success:

                    completed += 1

                    completion_time = time.time()

                    completion_times.append(completion_time)

                    duration = completion_time - task_info['submit_time']

                    style_type = "Caricature" if "caricature" in task_info['style_variant'].lower() else "Pixar"

                    print(f"[completed/3] style_type completed: task_info['output_name'] "

                          f"(API-task_info['client_idx']+1, duration:.1fs) - 'task_info['text'][:30]...'")

                else:

                    print(f"Failed: task_info['output_name']")

            except Exception as e:

                task_info = tasks_info[future]

                print(f"Error with task_info['output_name'] (API-task_info['client_idx']+1): str(e)")

        total_time = time.time() - start_time

        print(f"\n[FINAL RESULT] completed/3 stickers completed in total_time:.1f seconds!")

        if len(completion_times) > 1:

            fastest_completion = min(completion_times) - start_time

            print(f"Parallel efficiency: Fastest completion in fastest_completion:.1fs")

اینجا generate_single_sticker() دستور را می سازد و تصاویر را فراخوانی می کند. یک نقطه پایانی را با استفاده از دستورالعمل های client_idx ویرایش کنید. توابع موازی یک ThreadPoolExecutor با max_workers=3 ایجاد می کنند، سه وظیفه را ارسال می کنند و نتایج را با as_completed مدیریت می کنند. این اجازه می دهد تا اسکریپت به سرعت هر برچسب تمام شده را ثبت کند. علاوه بر این، ما همچنین می‌توانیم لاگ‌ها را بررسی کنیم تا ببینیم برای هر رشته چه اتفاقی می‌افتد (زمان، سبک کارتونی یا پیکسار).

بلوک اجرای پایه

در پایین فیلمنامه، __main__ گارد به طور پیش فرض کار می کند sticker_from_camera(). با این حال، می‌توانید در صورت تمایل برای شروع، موافقت یا اظهار نظر نکنید interactive_menu()، create_all_category_stickers() یا توابع دیگر

# Main execution

if __name__ == "__main__":

    sticker_from_camera()

خروجی:

تصویر منبع:

برای نسخه کامل این کد تولید کننده برچسب WhatsApp، از این مخزن GitHub دیدن کنید.

نتیجه گیری

در این آموزش، راه‌اندازی تماس‌های GPT-Image-1، ساخت اعلان برچسب پیشرفته، گرفتن یا آپلود تصاویر، انتخاب عبارات سرگرم‌کننده یا متن سفارشی، و اجرای ۳ سبک به طور همزمان را بررسی کردیم. این پروژه تنها با چند صد خط کد، عکس های شما را به استیکرهای سبک کتاب های مصور تبدیل می کند.

با ترکیب ساده مدل بصری OpenAI با مهندسی سریع خلاقانه و چند رشته ای، می توانید برچسب های سرگرم کننده و سفارشی را در چند ثانیه ایجاد کنید. و نتیجه یک تولید کننده برچسب واتس اپ مبتنی بر هوش مصنوعی خواهد بود که می تواند استیکرهای قابل اشتراک گذاری فوری را با یک کلیک برای هر یک از دوستان و گروه های شما تولید کند. اکنون برای عکس خود و شوخی مورد علاقه خود تلاش کنید!

سوالات متداول

Q1. مولد استیکر واتس اپ مجهز به هوش مصنوعی چه می کند؟

A. با استفاده از مدل GPT-Image-1 OpenAI، عکس های آپلود شده یا گرفته شده شما را به استیکرهای جالب و سبک واتس اپ با متن تبدیل می کند.

Q2. چرا GPT-Image-1 بهتر از سایر مدل های تصویر است؟

پاسخ.

Q3. چگونه اسکریپت تولید استیکر را سرعت می بخشد؟

الف. از سه کلید OpenAI API و یک ThreadPoolExecutor برای تولید سه برچسب به صورت موازی استفاده می‌کند و زمان پردازش را کاهش می‌دهد.

ویپین واشیست

سلام، من Vipin هستم، یک علاقه‌مند به علم داده و یادگیری ماشین با پایه‌ای قوی در تجزیه و تحلیل داده، الگوریتم‌های یادگیری ماشین و برنامه‌نویسی. من تجربه عملی در ساخت مدل‌ها، مدیریت داده‌های آشفته، و حل مشکلات دنیای واقعی دارم. هدف من استفاده از بینش های مبتنی بر داده برای ایجاد راه حل های عملی است که منجر به نتایج می شود. من مشتاق هستم تا مهارت‌هایم را در یک محیط مشارکتی به اشتراک بگذارم و در عین حال به یادگیری و رشد در علوم داده، یادگیری ماشین و NLP ادامه دهم.

برای ادامه خواندن و لذت بردن از محتوای متخصص، وارد سیستم شوید.

لینک منبع

نویسنده اصلی

وب سایت 123 سلکت یک مجله مرجع جهت معرفی و راهنمای خرید و انتخاب سریع بهترین کالا ها و محصولات در زمینه های مختلف و متنوع است
دکمه بازگشت به بالا