رفتن به محتوا

ساخت پاورپوینت با هوش مصنوعی؛ از متن تا اسلاید با API

با API هوش مصنوعی و کتابخانهٔ python-pptx از یک موضوع ساده فایل پاورپوینت بسازید؛ نمونه‌کد آزموده، خروجی واقعی و نکته‌های متن فارسی راست‌به‌چپ.

تیم هیبانا۵ دقیقه مطالعه
چند اسلاید ارائه که از یک برگهٔ متن بیرون می‌آیند و به‌ترتیب کنار هم چیده می‌شوند

ساختن یک ارائهٔ خوب دو بخش دارد: فکر کردن به اینکه چه بگوییم و چیدن آن روی اسلایدها. ابزارهای آماده‌ای مثل Gamma هر دو کار را در یک محیط گرافیکی انجام می‌دهند، اما اگر بخواهید ساخت اسلاید را خودکار کنید (مثلاً از گزارش هفتگی، از فرم سفارش یا داخل برنامهٔ خودتان)، به یک راه برنامه‌نویسی نیاز دارید. در این مطلب می‌بینیم چطور یک مدل زبانی از طریق API هیبانا متن و ساختار اسلایدها را به شکل JSON می‌نویسد و کتابخانهٔ python-pptx آن را به یک فایل ‎.pptx واقعی تبدیل می‌کند؛ با نمونه‌کدی که خودمان اجرا کرده‌ایم و نکته‌هایی برای متن فارسی.

ابزارهایی مثل Gamma چه می‌کنند؟

Gamma در سایت خودش را «همراه طراحی مبتنی بر هوش مصنوعی برای ساخت ارائه، وب‌سایت و موارد دیگر» معرفی می‌کند که به مهارت کدنویسی یا طراحی نیاز ندارد. طبق راهنمای خروجی Gamma، ارائه را می‌توان به‌صورت PDF، PNG و PowerPoint (PPTX) گرفت و برای Google Slides هم فایل PPTX را در آن بارگذاری کرد.

این ابزارها برای کسی که یک ارائه را دستی و با چند کلیک می‌سازد مناسب‌اند. اما اگر:

  • هر هفته از داده‌های یکسان چند ارائهٔ مشابه می‌سازید،
  • می‌خواهید دکمهٔ «ساخت ارائه» را داخل سایت یا نرم‌افزار خودتان داشته باشید،
  • یا قالب و فونت سازمانی ثابتی دارید که باید همیشه رعایت شود،

ساختن اسلاید با کد گزینهٔ انعطاف‌پذیرتری است. ایدهٔ اصلی ساده است: مدل محتوا را می‌نویسد، کد آن را می‌چیند.

روش کار؛ JSON از مدل، فایل از python-pptx

مدل زبانی فایل پاورپوینت نمی‌سازد؛ متن می‌نویسد. پس از مدل می‌خواهیم ساختار ارائه را در قالبی دقیق و قابل خواندن برای کد برگرداند:

{  "title": "عنوان ارائه",  "subtitle": "زیرعنوان",  "slides": [    { "title": "عنوان اسلاید", "bullets": ["نکته ۱", "نکته ۲"], "notes": "متن گوینده" }  ]}

برای اینکه پاسخ حتماً JSON معتبر باشد، از پارامتر response_format با مقدار json_object استفاده می‌کنیم که در مستندات قابلیت‌های پیشرفته آمده است. همان‌جا تأکید شده که این پارامتر فقط معتبر بودن JSON را تضمین می‌کند، نه داشتن کلیدهای دلخواه شما را؛ برای همین شکل دقیق کلیدها را در پیام سیستم می‌نویسیم.

سپس python-pptx (کتابخانهٔ متن‌باز پایتون برای ساخت و ویرایش فایل‌های PowerPoint) برای هر بخش یک اسلاید می‌سازد. طبق مستندات python-pptx، در قالب پیش‌فرض چیدمان شمارهٔ ۰ اسلاید عنوان است و چیدمان شمارهٔ ۱ اسلاید «عنوان و محتوا» با فهرست بولت.

نمونه‌کد کامل

ابتدا دو کتابخانه را نصب کنید:

pip install openai python-pptx

فایل make_slides.py را بسازید. به‌جای YOUR_API_KEY کلید API خودتان را بگذارید. مدل این نمونه gpt-5-nano است که در زمان نگارش این مطلب از حالت JSON پشتیبانی می‌کند و برای چنین کاری سریع و کم‌هزینه است:

import json from openai import OpenAIfrom pptx import Presentationfrom pptx.enum.text import PP_ALIGNfrom pptx.oxml.ns import qn client = OpenAI(    base_url="https://api-ai.hibanacloud.ir/v1",    api_key="YOUR_API_KEY",) SYSTEM = """تو یک طراح ارائه هستی. فقط JSON برگردان، با این شکل:{"title": "...", "subtitle": "...", "slides": [{"title": "...", "bullets": ["...", "..."], "notes": "..."}]}هر اسلاید حداکثر ۴ بولت کوتاه (زیر ۱۲ کلمه) دارد. notes متن گوینده است.""" topic = "معرفی خدمات یک کافه‌ی کوچک به سرمایه‌گذار؛ ۴ اسلاید" resp = client.chat.completions.create(    model="openai/gpt-5-nano",    reasoning_effort="low",    response_format={"type": "json_object"},    messages=[        {"role": "system", "content": SYSTEM},        {"role": "user", "content": topic},    ],)deck = json.loads(resp.choices[0].message.content)print(json.dumps(deck, ensure_ascii=False, indent=2))  def rtl(paragraph, font="Tahoma"):    """پاراگراف را راست‌چین و راست‌به‌چپ می‌کند و فونت فارسی را تنظیم می‌کند."""    paragraph.alignment = PP_ALIGN.RIGHT    paragraph._p.get_or_add_pPr().set("rtl", "1")    for run in paragraph.runs:        rpr = run._r.get_or_add_rPr()        cs = rpr.find(qn("a:cs"))        if cs is None:            cs = rpr.makeelement(qn("a:cs"), {})            rpr.append(cs)        cs.set("typeface", font)  prs = Presentation() # اسلاید عنوان (چیدمان 0)first = prs.slides.add_slide(prs.slide_layouts[0])first.shapes.title.text = deck["title"]first.placeholders[1].text = deck.get("subtitle", "")for shape in (first.shapes.title, first.placeholders[1]):    for p in shape.text_frame.paragraphs:        rtl(p) # اسلایدهای محتوا (چیدمان 1: عنوان و متن)for item in deck["slides"]:    slide = prs.slides.add_slide(prs.slide_layouts[1])    slide.shapes.title.text = item["title"]    rtl(slide.shapes.title.text_frame.paragraphs[0])     body = slide.placeholders[1].text_frame    body.text = item["bullets"][0]    for bullet in item["bullets"][1:]:        body.add_paragraph().text = bullet    for p in body.paragraphs:        rtl(p)     slide.notes_slide.notes_text_frame.text = item.get("notes", "") prs.save("deck.pptx")print("saved deck.pptx with", len(prs.slides), "slides")

با python make_slides.py اسکریپت اجرا می‌شود. این بخشی از خروجی یکی از اجراهای ما با پایتون 3.11 و python-pptx نسخهٔ 1.0.2 است (دو اسلاید میانی را برای کوتاهی حذف کرده‌ایم؛ متن مدل در هر اجرا فرق می‌کند):

{  "title": "معرفی خدمات کافه کوچک به سرمایه‌گذار",  "subtitle": "فرصتی برای سرمایه‌گذاری در تجربه محلی",  "slides": [    {      "title": "مفهوم کافه ما",      "bullets": [        "فضای گرم و دوستانه",        "منوی نوشیدنی‌های تخصصی",        "تجربه مشتری متمایز",        "رویکرد پایدار و محلی"      ],      "notes": "شرح اجمالی از مفهوم کافه، هدف از ارائه و مزیت رقابتی نسبت به رقبا."    },    ...    {      "title": "درخواست سرمایه و استفاده",      "bullets": [        "سرمایه اولیه برای تجهیزات و فضا",        "بازاریابی محلی و افتتاحیه",        "آموزش کارکنان و بهبود خدمات",        "بازگشت سرمایه حدود 12 ماهه"      ],      "notes": "چگونگی استفاده از سرمایه و بازگشت سرمایه را توضیح دهید."    }  ]}saved deck.pptx with 5 slides

نتیجه یک فایل deck.pptx با یک اسلاید عنوان و چهار اسلاید محتوا است و متن گوینده هم در بخش یادداشت (Notes) اسلایدهای محتوا قرار گرفته است. در دو اجرای ما، هر درخواست ۱۱۱ توکن ورودی و حدود ۱٬۰۰۰ تا ۱٬۹۰۰ توکن خروجی مصرف کرد. gpt-5-nano یک مدل استدلالی است و reasoning_effort را روی low گذاشته‌ایم تا استدلال کوتاه‌تر بماند. دربارهٔ اینکه این عددها چطور به هزینه تبدیل می‌شوند، توکن و هزینهٔ API را بخوانید.

به عددهای مدل اعتماد نکنید

به بولت آخر خروجی دقت کنید: «بازگشت سرمایه حدود ۱۲ ماهه». ما چنین عددی به مدل نداده بودیم و مدل آن را از خودش ساخته است. اگر ارائه عدد، قیمت یا آمار دارد، آن داده را خودتان در پیام کاربر بفرستید و از مدل بخواهید فقط از همان استفاده کند. پیش از ارائه هم همه‌چیز را بازبینی کنید.

متن فارسی در اسلاید؛ راست‌چین و راست‌به‌چپ

بیشترین دردسر ساخت پاورپوینت فارسی با کد، جهت متن است. در مرجع API کتابخانهٔ python-pptx برای پاراگراف ویژگی alignment (چینش) هست، اما ویژگی‌ای برای راست‌به‌چپ وجود ندارد. راست‌چین کردن به‌تنهایی کافی نیست: اگر جهت پاراگراف چپ‌به‌راست بماند، بولت‌ها سمت چپ می‌افتند و ترتیب علامت‌ها و کلمه‌های لاتین داخل جملهٔ فارسی به هم می‌ریزد.

تابع rtl در نمونهٔ بالا سه کار انجام می‌دهد:

  • چینش راست با PP_ALIGN.RIGHT.
  • جهت راست‌به‌چپ با گذاشتن ویژگی rtl="1" روی تگ a:pPr در XML پاراگراف. این همان تنظیمی است که خود فایل PPTX برای متن راست‌به‌چپ نگه می‌دارد.
  • فونت فارسی با تگ a:cs. ویژگی font.name در python-pptx فقط فونت لاتین (a:latin) را تنظیم می‌کند؛ متن فارسی از فونت «complex script» یعنی a:cs استفاده می‌کند. ما Tahoma را گذاشته‌ایم؛ هر فونتی که انتخاب کنید (مثلاً وزیرمتن)، باید روی سیستمی که ارائه را باز می‌کند هم نصب باشد.

چند نکته برای نتیجهٔ بهتر

  • از قالب خودتان شروع کنید. Presentation() بدون ورودی قالب سادهٔ پیش‌فرض را باز می‌کند که اندازهٔ اسلایدش ۴:۳ است. یک قالب با رنگ، فونت و نسبت ۱۶:۹ دلخواه در PowerPoint بسازید و آن را با Presentation("template.pptx") باز کنید. شمارهٔ چیدمان‌ها به قالب بستگی دارد، پس آن را با قالب خودتان بررسی کنید.
  • محدودیت را در پرامپت بنویسید. تعداد اسلاید، حداکثر بولت و طول هر بولت را صریح بگویید؛ وگرنه ممکن است متن از کادر بیرون بزند.
  • مخاطب و لحن را مشخص کنید. «برای سرمایه‌گذار»، «برای کلاس دانشگاه» یا «برای جلسهٔ داخلی تیم» محتوای کاملاً متفاوتی می‌سازد.
  • خروجی را پیش از استفاده بررسی کنید. حتی با json_object ممکن است کلیدی مثل notes نیاید؛ برای همین در کد از item.get("notes", "") استفاده کرده‌ایم. در برنامهٔ واقعی ساختار JSON را اعتبارسنجی کنید.
  • مدل را عوض کنید. چون API هیبانا با OpenAI سازگار است، با تغییر نام مدل می‌توانید مدل‌های دیگر را هم امتحان کنید؛ فقط مطمئن شوید آن مدل در لیست مدل‌ها از حالت JSON پشتیبانی می‌کند.

محدودیت‌های این روش

این روش اسلاید متنی می‌سازد، نه طراحی کامل. نمودار، چیدمان خلاقانه و تصویر خودکار در آن نیست؛ هرچند python-pptx امکان افزودن تصویر و نمودار را دارد و می‌توانید بعداً کد را گسترش دهید. اگر برای اسلایدها تصویر می‌خواهید، می‌توانید با مدل‌های ساخت تصویر تصویر بسازید و آن را در اسلاید قرار دهید. همچنین فایل را یک بار در همان نرم‌افزاری که ارائه را با آن نمایش می‌دهید باز کنید و ظاهر نهایی آن (به‌خصوص فونت و جهت متن) را بررسی کنید.

جمع‌بندی

برای ساخت خودکار پاورپوینت لازم نیست مدل فایل بسازد: مدل محتوا و ساختار را به شکل JSON می‌نویسد و python-pptx آن را به اسلاید تبدیل می‌کند. با تنظیم جهت راست‌به‌چپ و فونت a:cs، متن فارسی هم درست نمایش داده می‌شود. برای شروع، کلید API بگیرید و نمونهٔ بالا را اجرا کنید. اگر تازه با API هوش مصنوعی آشنا می‌شوید، راهنمای API هوش مصنوعی را بخوانید و برای جزئیات حالت JSON به مستندات قابلیت‌های پیشرفته سر بزنید.

مطالب مرتبط

با یک کلید به همه مدل‌ها وصل شوید

GPT، Claude، Gemini و ده‌ها مدل دیگر، با پرداخت ریالی و یک API سازگار با OpenAI.