PowerPoint to Video with AI Voice Over

This example demonstrates how to create a video from a PowerPoint presentation URL with AI-generated voice-over narration. The API will extract slides and text from the PPT and generate a professional video presentation.

Overview

This example covers:

  • Getting an access token
  • Creating a video from a PowerPoint presentation URL
  • Adding AI voice-over narration to slides
  • Using the "Brian" AI voice speaker
  • Monitoring job status and retrieving the final video

Node.js Example

Prerequisites

npm install axios

Complete Code

import axios from "axios";

const API_BASE_URL = "https://api.pictory.ai/pictoryapis";
const CLIENT_ID = "YOUR_CLIENT_ID";
const CLIENT_SECRET = "YOUR_CLIENT_SECRET";

// PowerPoint URL to convert to video
const PPT_URL = "https://pictory-static.s3.us-east-2.amazonaws.com/Mindfulness1736335431895.pptx";

async function createPPTToVideoWithVoiceOver() {
  try {
    // Step 1: Get Access Token
    console.log("Step 1: Getting access token...");
    const tokenResponse = await axios.post(
      `${API_BASE_URL}/v1/oauth2/token`,
      {
        client_id: CLIENT_ID,
        client_secret: CLIENT_SECRET,
      },
      {
        headers: {
          "Content-Type": "application/json",
        },
      }
    );

    const accessToken = tokenResponse.data.access_token;
    console.log("Access token obtained successfully");
    console.log("Token expires in:", tokenResponse.data.expires_in, "seconds\n");

    // Step 2: Create Video from PowerPoint with AI Voice Over
    console.log("Step 2: Creating video from PowerPoint with AI voice-over...");
    const storyboardResponse = await axios.post(
      `${API_BASE_URL}/v2/video/storyboard/render`,
      {
        videoName: "ppt_to_video_with_voice",
        voiceOver: {
          enabled: true,
          aiVoices: [
            {
              speaker: "Brian",
            },
          ],
        },
        scenes: [
          {
            pptUrl: PPT_URL,
          },
        ],
      },
      {
        headers: {
          "Content-Type": "application/json",
          Authorization: accessToken,
        },
      }
    );

    const renderJobId = storyboardResponse.data.data.jobId;
    console.log("PPT to video with voice-over render job created");
    console.log("Job ID:", renderJobId, "\n");

    // Step 3: Monitor Job Status
    console.log("Step 3: Monitoring job status...");
    let jobCompleted = false;
    let jobResult = null;

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

      const status = jobStatusResponse.data.data.status;
      console.log("Current status:", status);

      if (status === "completed") {
        jobCompleted = true;
        jobResult = jobStatusResponse.data;
        console.log("\nVideo from PowerPoint with AI voice-over created successfully!");
        console.log("Video URL:", jobResult.data.videoUrl);
      } else if (status === "failed") {
        throw new Error("Job failed: " + JSON.stringify(jobStatusResponse.data));
      } else {
        // Wait 5 seconds before checking again
        await new Promise(resolve => setTimeout(resolve, 5000));
      }
    }

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

// Run the function
createPPTToVideoWithVoiceOver();

Python Example

Prerequisites

pip install requests

Complete Code

import requests
import time
import json

API_BASE_URL = 'https://api.pictory.ai/pictoryapis'
CLIENT_ID = 'YOUR_CLIENT_ID'
CLIENT_SECRET = 'YOUR_CLIENT_SECRET'

# PowerPoint URL to convert to video
PPT_URL = "https://pictory-static.s3.us-east-2.amazonaws.com/Mindfulness1736335431895.pptx"

def create_ppt_to_video_with_voiceover():
    try:
        # Step 1: Get Access Token
        print('Step 1: Getting access token...')
        token_response = requests.post(
            f'{API_BASE_URL}/v1/oauth2/token',
            json={
                'client_id': CLIENT_ID,
                'client_secret': CLIENT_SECRET
            },
            headers={
                'Content-Type': 'application/json'
            }
        )
        token_response.raise_for_status()

        access_token = token_response.json()['access_token']
        print('Access token obtained successfully')
        print(f"Token expires in: {token_response.json()['expires_in']} seconds\n")

        # Step 2: Create Video from PowerPoint with AI Voice Over
        print('Step 2: Creating video from PowerPoint with AI voice-over...')
        storyboard_response = requests.post(
            f'{API_BASE_URL}/v2/video/storyboard/render',
            json={
                'videoName': 'ppt_to_video_with_voice',
                'voiceOver': {
                    'enabled': True,
                    'aiVoices': [
                        {
                            'speaker': 'Brian'
                        }
                    ]
                },
                'scenes': [
                    {
                        'pptUrl': PPT_URL
                    }
                ]
            },
            headers={
                'Content-Type': 'application/json',
                'Authorization': access_token
            }
        )
        storyboard_response.raise_for_status()

        render_job_id = storyboard_response.json()['data']['jobId']
        print('PPT to video with voice-over render job created')
        print(f'Job ID: {render_job_id}\n')

        # Step 3: Monitor Job Status
        print('Step 3: Monitoring job status...')
        job_completed = False
        job_result = None

        while not job_completed:
            job_status_response = requests.get(
                f'{API_BASE_URL}/v1/jobs/{render_job_id}',
                headers={
                    'Authorization': access_token
                }
            )
            job_status_response.raise_for_status()

            status = job_status_response.json()['data']['status']
            print(f'Current status: {status}')

            if status == 'completed':
                job_completed = True
                job_result = job_status_response.json()
                print('\nVideo from PowerPoint with AI voice-over created successfully!')
                print(f"Video URL: {job_result['data']['videoUrl']}")
            elif status == 'failed':
                raise Exception(f"Job failed: {json.dumps(job_status_response.json())}")
            else:
                # Wait 5 seconds before checking again
                time.sleep(5)

        return job_result

    except requests.exceptions.RequestException as error:
        print(f'Error: {error}')
        if hasattr(error, 'response') and error.response is not None:
            print(f'Response: {error.response.text}')
        raise

# Run the function
if __name__ == '__main__':
    create_ppt_to_video_with_voiceover()

Key Parameters

  • pptUrl: The full URL of the PowerPoint file (.pptx) to convert (max 3000 characters, must be a valid URI)
  • voiceOver: Configuration for AI voice-over narration
    • enabled: Set to true to enable voice-over
    • aiVoices: Array of AI voice configurations
      • speaker: The name of the AI voice (e.g., "Brian")

How It Works

  1. The API fetches the PowerPoint file from the provided URL
  2. Slides are extracted and converted to images
  3. Text content from each slide is extracted
  4. AI voice-over is generated to narrate the slide content
  5. Each slide becomes a scene in the video
  6. Voice-over is synchronized with the slide transitions
  7. A complete video presentation is generated

Supported PowerPoint Formats

  • .pptx (PowerPoint 2007 and later)
  • The file must be accessible via a publicly reachable URL

Use Cases

  • Convert presentations to video format for sharing
  • Create narrated video presentations automatically
  • Repurpose PowerPoint content for video platforms
  • Generate training videos from existing presentations
  • Make presentations accessible on platforms that don't support PPT

Response

The API returns a job ID for monitoring the video creation progress. Once completed, you'll receive a video URL containing your PowerPoint slides as a narrated video.

Notes

  • Replace YOUR_CLIENT_ID and YOUR_CLIENT_SECRET with your actual API credentials
  • The PowerPoint file must be accessible via a public URL
  • Each slide typically becomes one scene in the video
  • The AI voice-over narrates the text content from the slides
  • You can customize voice speed and amplification if needed
  • Speaker notes can be included using the useSpeakerNotes parameter (see related example)