> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pictory.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# PowerPoint to Video with AI Voice-Over

> Convert PowerPoint presentations into videos with AI-generated voice-over narration

This guide shows you how to convert PowerPoint presentations into engaging videos with professional AI-generated voice-over narration. Perfect for creating training videos, online courses, or shareable presentations from your existing slide decks.

## What You'll Learn

<CardGroup cols={2}>
  <Card title="PPT to Video" icon="presentation">
    Convert PowerPoint slides into video scenes
  </Card>

  <Card title="AI Voice-Over" icon="microphone">
    Add professional narration automatically
  </Card>

  <Card title="Slide-by-Slide" icon="layer-group">
    Each slide becomes a scene with narration
  </Card>

  <Card title="Auto Processing" icon="wand-magic-sparkles">
    Automatic text extraction and voice generation
  </Card>
</CardGroup>

## Before You Begin

Make sure you have:

* A [Pictory API key](https://app.pictory.ai/api-access)
* Node.js or Python installed on your machine
* PowerPoint file accessible via public URL
* Basic understanding of voice-over concepts

<CodeGroup>
  ```bash npm theme={null}
  npm install axios
  ```

  ```bash pip theme={null}
  pip install requests
  ```
</CodeGroup>

## How PowerPoint-to-Video Works

When you convert a PowerPoint presentation to video:

1. **File Processing** - Your PPT file is accessed and parsed
2. **Slide Extraction** - Each slide becomes a separate video scene
3. **Text Extraction** - Text content is extracted from slides for narration
4. **Visual Preservation** - Slide designs and visuals are maintained
5. **Voice Generation** - AI creates natural narration from extracted text
6. **Video Rendering** - Final video is assembled with voice-over synchronized to slides

<Note>
  The PowerPoint file must be accessible via a public URL. Upload your file to cloud storage (Google Drive, Dropbox, AWS S3) and use the public share link.
</Note>

## Complete Example

<CodeGroup>
  ```javascript Node.js theme={null}
  import axios from "axios";

  const API_BASE_URL = "https://api.pictory.ai/pictoryapis";
  const API_KEY = "YOUR_API_KEY";

  // Sample PPT URL - replace with your own PPT file URL
  const PPT_URL = "https://pictory-static.pictorycontent.com/sample_ppt.pptx";

  async function createPptToVideoWithVoiceOver() {
    try {
      console.log("Creating video from PowerPoint with AI voice-over...");

      const response = await axios.post(
        `${API_BASE_URL}/v2/video/storyboard/render`,
        {
          videoName: "ppt_to_video_with_voiceover",
          scenes: [
            {
              pptUrl: PPT_URL,               // PowerPoint file URL at scene level
            }
          ],

          // Voice-over configuration
          voiceOver: {
            enabled: true,                    // Enable voice-over
            aiVoices: [
              {
                speaker: "Brian",              // AI voice name
                speed: 100,                    // Normal speaking speed
                amplificationLevel: 0,         // Normal volume
              },
            ],
          },
        },
        {
          headers: {
            "Content-Type": "application/json",
            Authorization: API_KEY,
          },
        }
      );

      const jobId = response.data.data.jobId;
      console.log("✓ Video creation started!");
      console.log("Job ID:", jobId);

      // Monitor progress
      console.log("\nMonitoring video creation...");
      let jobCompleted = false;
      let jobResult = null;

      while (!jobCompleted) {
        const statusResponse = await axios.get(
          `${API_BASE_URL}/v1/jobs/${jobId}`,
          {
            headers: { Authorization: API_KEY },
          }
        );

        const status = statusResponse.data.data.status;
        console.log("Status:", status);

        if (status === "completed") {
          jobCompleted = true;
          jobResult = statusResponse.data;
          console.log("\n✓ Video from PowerPoint is ready!");
          console.log("Video URL:", jobResult.data.videoURL);
        } else if (status === "failed") {
          throw new Error("Video creation failed: " + JSON.stringify(statusResponse.data));
        }

        await new Promise(resolve => setTimeout(resolve, 5000));
      }

      return jobResult;
    } catch (error) {
      console.error("Error:", error.response?.data || error.message);
      throw error;
    }
  }

  createPptToVideoWithVoiceOver();
  ```

  ```python Python theme={null}
  import requests
  import time
  import json

  API_BASE_URL = 'https://api.pictory.ai/pictoryapis'
  API_KEY = 'YOUR_API_KEY'

  # Sample PPT URL - replace with your own PPT file URL
  PPT_URL = "https://pictory-static.pictorycontent.com/sample_ppt.pptx"

  def create_ppt_to_video_with_voiceover():
      try:
          print("Creating video from PowerPoint with AI voice-over...")

          response = requests.post(
              f'{API_BASE_URL}/v2/video/storyboard/render',
              json={
                  'videoName': 'ppt_to_video_with_voiceover',
                  'scenes': [
                      {
                          'pptUrl': PPT_URL            # PowerPoint file URL at scene level
                      }
                  ],

                  # Voice-over configuration
                  'voiceOver': {
                      'enabled': True,                    # Enable voice-over
                      'aiVoices': [
                          {
                              'speaker': 'Brian',              # AI voice name
                              'speed': 100,                    # Normal speaking speed
                              'amplificationLevel': 0         # Normal volume
                          }
                      ]
                  }
              },
              headers={
                  'Content-Type': 'application/json',
                  'Authorization': API_KEY
              }
          )
          response.raise_for_status()

          job_id = response.json()['data']['jobId']
          print("✓ Video creation started!")
          print(f"Job ID: {job_id}")

          # Monitor progress
          print("\nMonitoring video creation...")
          job_completed = False
          job_result = None

          while not job_completed:
              status_response = requests.get(
                  f'{API_BASE_URL}/v1/jobs/{job_id}',
                  headers={'Authorization': API_KEY}
              )
              status_response.raise_for_status()

              status = status_response.json()['data']['status']
              print(f"Status: {status}")

              if status == 'completed':
                  job_completed = True
                  job_result = status_response.json()
                  print("\n✓ Video from PowerPoint is ready!")
                  print(f"Video URL: {job_result['data']['videoURL']}")
              elif status == 'failed':
                  raise Exception(f"Video creation failed: {status_response.json()}")

              time.sleep(5)

          return job_result

      except requests.exceptions.RequestException as error:
          print(f"Error: {error}")
          raise

  if __name__ == '__main__':
      create_ppt_to_video_with_voiceover()
  ```
</CodeGroup>

## Understanding the Parameters

### Main Request Parameters

| Parameter   | Type   | Required | Description                                                                                                                                     |
| ----------- | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `videoName` | string | Yes      | A descriptive name for your video project                                                                                                       |
| `language`  | string | No       | Language for AI-generated narration. Default: `en`. Options: `zh`, `nl`, `en`, `fr`, `de`, `hi`, `it`, `ja`, `ko`, `mr`, `pt`, `ru`, `es`, `ta` |
| `scenes`    | array  | Yes      | Array of scene objects                                                                                                                          |
| `voiceOver` | object | No       | Voice-over configuration (omit for video without narration)                                                                                     |

### Scene Parameters

| Parameter    | Type    | Required | Description                                                     |
| ------------ | ------- | -------- | --------------------------------------------------------------- |
| `pptUrl`     | string  | Yes      | Public URL to the PowerPoint file (.ppt or .pptx)               |
| `animatePPT` | boolean | No       | Enable AI-generated slide animations. Only valid with `pptUrl`. |

### Voice-Over Configuration

| Parameter            | Type    | Required | Description                                |
| -------------------- | ------- | -------- | ------------------------------------------ |
| `enabled`            | boolean | Yes      | Set to `true` to enable voice-over         |
| `aiVoices`           | array   | Yes      | Array of AI voice configurations           |
| `speaker`            | string  | Yes      | AI voice name (e.g., "Brian", "Emma")      |
| `speed`              | number  | No       | Voice speed 50-200 (default: 100 = normal) |
| `amplificationLevel` | number  | No       | Volume level -1 to 1 (default: 0 = normal) |

## Supported File Formats

| Format             | Extension | Description                            |
| ------------------ | --------- | -------------------------------------- |
| PowerPoint 2007+   | `.pptx`   | Modern PowerPoint format (recommended) |
| PowerPoint 97-2003 | `.ppt`    | Legacy PowerPoint format               |

<Tip>
  For best compatibility and processing speed, use `.pptx` format. Convert older `.ppt` files to `.pptx` before uploading.
</Tip>

## Render in a Different Language Than Your Deck

<Note>
  **You do not need to translate your PowerPoint deck before submitting it.** Pass the top-level `language` field with a target language code, and Pictory generates the narration directly in that language while reading from your original slide text. One source deck can ship as videos in 14 different languages without you maintaining translated copies.
</Note>

Supported `language` values: `zh, nl, en, fr, de, hi, it, ja, ko, mr, pt, ru, es, ta`. See the [PowerPoint Animated Slides guide](/guides/presentation-to-video/powerpoint-animated-slides#multilingual-ppt-video-translate-decks-at-render-time) for a working multilingual example and the [End-to-End Recipes](/guides/recipes/end-to-end-recipes#recipe-2-multilingual-video-generate-narration-in-a-target-language) for the language → default voice mapping.

## Common Use Cases

### Training and Education

```javascript theme={null}
{
  videoName: "employee_training_video",
  scenes: [{
    pptUrl: "https://storage.example.com/employee-training.pptx"
  }],
  voiceOver: {
    enabled: true,
    aiVoices: [{
      speaker: "Emma",       // Clear female voice
      speed: 95,             // Slightly slower for learning
      amplificationLevel: 0
    }]
  }
}
```

**Result:** Educational video with clear, measured narration perfect for training.

### Sales Presentations

```javascript theme={null}
{
  videoName: "product_pitch_video",
  scenes: [{
    pptUrl: "https://storage.example.com/product-pitch.pptx"
  }],
  voiceOver: {
    enabled: true,
    aiVoices: [{
      speaker: "Matthew",    // Professional male voice
      speed: 105,            // Slightly faster for energy
      amplificationLevel: 0.2  // Louder for emphasis
    }]
  }
}
```

**Result:** Dynamic sales video with energetic, engaging narration.

### Webinar Content

```javascript theme={null}
{
  videoName: "webinar_slides_video",
  scenes: [{
    pptUrl: "https://storage.example.com/webinar-slides.pptx"
  }],
  voiceOver: {
    enabled: true,
    aiVoices: [{
      speaker: "Joanna",     // Friendly female voice
      speed: 100,            // Normal pace
      amplificationLevel: 0
    }]
  }
}
```

**Result:** Professional webinar video with natural narration.

## Best Practices

<AccordionGroup>
  <Accordion title="Prepare Your PowerPoint File">
    Optimize your slides for video conversion:

    * **Clear Text**: Use readable fonts and sufficient font size (24pt minimum)
    * **Simple Layouts**: Avoid overly complex slide designs
    * **Concise Content**: Keep text brief - narration works better with short phrases
    * **Consistent Style**: Use consistent formatting across all slides
    * **High Quality Images**: Use high-resolution images that look good in video
  </Accordion>

  <Accordion title="Make Files Publicly Accessible">
    Ensure your PowerPoint file can be accessed:

    * **Cloud Storage**: Upload to Google Drive, Dropbox, OneDrive, or AWS S3
    * **Public Link**: Generate a public sharing link (no login required)
    * **Direct URL**: Use the direct file URL, not a preview or viewer link
    * **Test Access**: Open the URL in an incognito browser to verify public access
    * **Stable URL**: Ensure the link will not expire during processing
  </Accordion>

  <Accordion title="Choose Appropriate Voice Settings">
    Select voice settings that match your content:

    * **Training/Education**: Use slower speeds (90-100) for comprehension
    * **Sales/Marketing**: Use slightly faster speeds (105-115) for energy
    * **Technical Content**: Use clear voices like Brian or Emma
    * **Consistency**: Use the same voice across related presentations
    * **Test First**: Create a sample video to preview voice quality
  </Accordion>

  <Accordion title="Optimize Slide Content for Narration">
    Structure your slides for voice-over:

    * **Full Sentences**: Write complete sentences, not just bullet points
    * **Natural Language**: Text should sound natural when read aloud
    * **Proper Punctuation**: Use periods, commas for natural pauses
    * **Avoid Abbreviations**: Spell out acronyms on first use
    * **Logical Flow**: Ensure text flows naturally from slide to slide
  </Accordion>

  <Accordion title="Consider Presentation Length">
    Plan for appropriate video duration:

    * **Short Presentations**: 5-10 slides work well for social media
    * **Medium Presentations**: 15-25 slides for training or tutorials
    * **Long Presentations**: Break 30+ slide decks into multiple videos
    * **Processing Time**: More slides = longer processing time
    * **Viewer Attention**: Keep videos under 10 minutes for better engagement
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Error: Unable to access PowerPoint file">
    **Problem:** The API cannot download or access your PPT file.

    **Solution:**

    * Verify the URL is publicly accessible (test in incognito browser)
    * Check that the URL is a direct file link, not a preview page
    * For Google Drive: Right-click → Share → "Anyone with the link"
    * For Dropbox: Use the direct download link, not the preview link
    * Ensure the file hasn't expired or been deleted
    * Try re-uploading the file and generating a new link
  </Accordion>

  <Accordion title="Slides appear in wrong order or missing">
    **Problem:** Video does not include all slides or they are out of sequence.

    **Solution:**

    * Verify all slides are present in the original PowerPoint
    * Check for hidden slides in PowerPoint - unhide them before uploading
    * Ensure slide numbers are sequential
    * Re-save the PowerPoint file and upload again
    * Try exporting as .pptx if using an older .ppt format
  </Accordion>

  <Accordion title="Voice-Over Does Not Match Slide Content">
    **Problem:** Narration seems unrelated to what is shown on slides.

    **Solution:**

    * The AI narrates visible text on slides
    * Check that slides contain actual text content (not just images)
    * If using images with embedded text, add actual text boxes
    * For slides with minimal text, consider using speaker notes instead
    * See the [PowerPoint with Speaker Notes](/guides/presentation-to-video/powerpoint-speaker-notes) guide
  </Accordion>

  <Accordion title="Some slides have no narration">
    **Problem:** Video plays slides with no voice-over.

    **Solution:**

    * Verify those slides contain text in PowerPoint
    * Text must be in actual text boxes, not part of images
    * Add descriptive text to image-only slides
    * Or use the `useSpeakerNotes: true` parameter with speaker notes
    * Check that text is not white-on-white or otherwise hidden
  </Accordion>

  <Accordion title="Processing takes too long">
    **Problem:** Job status shows "in-progress" for extended periods.

    **Solution:**

    * PowerPoint processing time depends on number of slides
    * Expected times:
      * 5-10 slides: 5-8 minutes
      * 15-20 slides: 10-15 minutes
      * 30+ slides: 20-30 minutes
    * Large file sizes (with many images) take longer
    * Check job status every 5-10 seconds (not more frequently)
    * If stuck for over an hour, contact support with job ID
  </Accordion>
</AccordionGroup>

## Next Steps

Enhance your PowerPoint videos with these features:

<CardGroup cols={2}>
  <Card title="Speaker Notes Narration" icon="note-sticky" href="/guides/presentation-to-video/powerpoint-speaker-notes">
    Use speaker notes instead of slide text for narration
  </Card>

  <Card title="Animated Slides" icon="wand-magic-sparkles" href="/guides/presentation-to-video/powerpoint-animated-slides">
    Add AI-generated animations and multilingual narration
  </Card>

  <Card title="Background Music" icon="music" href="/guides/advanced-features/background-music">
    Add music to complement your presentation
  </Card>

  <Card title="Brand Settings" icon="palette" href="/guides/branding-customization/brand-settings">
    Apply consistent branding to all your videos
  </Card>
</CardGroup>

## API Reference

For complete technical details, see:

* [Render Storyboard Video](/api-reference/videos/render-storyboard-video) - Full API specification
* [Get Voiceover Tracks](/api-reference/voiceovers/get-voiceover-tracks) - List available AI voices
* [Get Job Status](/api-reference/jobs/get-video-render-job-by-id) - Monitor job status and progress
