> ## 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.

# Podcast/Audio to Video

> Convert podcast episodes or audio files into engaging videos with automated visuals

This guide shows you how to convert podcast episodes or audio files into engaging videos with automatically generated visuals. Perfect for repurposing audio content for YouTube, social media, or video platforms.

## What You'll Learn

<CardGroup cols={2}>
  <Card title="Audio to Video" icon="podcast">
    Convert podcasts and audio files to videos
  </Card>

  <Card title="Auto Transcribe" icon="waveform">
    Automatically transcribe audio content
  </Card>

  <Card title="Smart Visuals" icon="images">
    Generate visuals synchronized to audio
  </Card>

  <Card title="Captions Included" icon="closed-captioning">
    Auto-generated subtitles from transcription
  </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
* Audio file accessible via public URL
* Basic understanding of audio/podcast formats

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

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

## How Podcast-to-Video Works

When you convert audio to video:

1. **Audio Processing** - Your audio file is accessed and analyzed
2. **Transcription** - AI automatically transcribes the audio content
3. **Scene Generation** - Content is split into logical scenes based on the transcript
4. **Visual Selection** - Appropriate stock visuals are selected to match the audio content
5. **Caption Generation** - Subtitles are created from the transcription
6. **Video Rendering** - Final video is assembled with audio, visuals, and captions synchronized

<Note>
  The audio file must be accessible via a public URL. Upload to cloud storage (Google Drive, Dropbox, AWS S3) and use the public share link. Processing time is proportional to audio length.
</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 audio URL - replace with your own audio file URL
  const AUDIO_URL = "https://pictory-static.pictorycontent.com/sample_podcast.mp3";

  async function createPodcastToVideo() {
    try {
      console.log("Creating video from podcast/audio...");

      const response = await axios.post(
        `${API_BASE_URL}/v2/video/storyboard/render`,
        {
          videoName: "podcast_to_video",
          scenes: [
            {
              audioUrl: AUDIO_URL,           // Audio file URL at scene level
              audioLanguage: "en-US",        // Required for audio processing
            }
          ],
        },
        {
          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 podcast 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;
    }
  }

  createPodcastToVideo();
  ```

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

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

  # Sample audio URL - replace with your own audio file URL
  AUDIO_URL = "https://pictory-static.pictorycontent.com/sample_podcast.mp3"

  def create_podcast_to_video():
      try:
          print("Creating video from podcast/audio...")

          response = requests.post(
              f'{API_BASE_URL}/v2/video/storyboard/render',
              json={
                  'videoName': 'podcast_to_video',
                  'scenes': [
                      {
                          'audioUrl': AUDIO_URL,           # Audio file URL at scene level
                          'audioLanguage': 'en-US'         # Required for audio processing
                      }
                  ]
              },
              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 podcast 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_podcast_to_video()
  ```
</CodeGroup>

## Understanding the Parameters

### Main Request Parameters

| Parameter   | Type   | Required | Description                               |
| ----------- | ------ | -------- | ----------------------------------------- |
| `videoName` | string | Yes      | A descriptive name for your video project |
| `scenes`    | array  | Yes      | Array of scene objects                    |

### Scene Parameters

| Parameter       | Type   | Required | Description                                             |
| --------------- | ------ | -------- | ------------------------------------------------------- |
| `audioUrl`      | string | Yes      | Public URL to the audio file (podcast, interview, etc.) |
| `audioLanguage` | string | Yes      | Language code for audio transcription (e.g., "en-US")   |

## Supported Audio Formats

| Format | Extension | Description                              |
| ------ | --------- | ---------------------------------------- |
| MP3    | `.mp3`    | Most common podcast format (recommended) |
| WAV    | `.wav`    | Uncompressed audio, high quality         |
| M4A    | `.m4a`    | Apple audio format, good quality         |
| AAC    | `.aac`    | Advanced audio codec                     |
| FLAC   | `.flac`   | Lossless audio compression               |
| OGG    | `.ogg`    | Open-source audio format                 |

<Tip>
  **Best Format:** Use MP3 for the best balance of quality and processing speed. Ensure audio is mono or stereo with clear speech.
</Tip>

## Common Use Cases

### Podcast Episodes for YouTube

```javascript theme={null}
{
  videoName: "podcast_episode_042_youtube",
  scenes: [{
    audioUrl: "https://storage.example.com/episode-042.mp3",
    audioLanguage: "en-US"
  }]
}
```

**Result:** Full podcast episode as video with matching visuals and captions.

### Interview Clips for Social Media

```javascript theme={null}
{
  videoName: "interview_highlight_linkedin",
  scenes: [{
    audioUrl: "https://storage.example.com/interview-segment.mp3",
    audioLanguage: "en-US"
  }]
}
```

**Result:** Short interview clip with professional visuals for LinkedIn.

### Audio Blog Posts

```javascript theme={null}
{
  videoName: "audio_blog_marketing_tips",
  scenes: [{
    audioUrl: "https://storage.example.com/blog-audio.mp3",
    audioLanguage: "en-US"
  }]
}
```

**Result:** Audio blog converted to video format with relevant visuals.

### Webinar Audio Archives

```javascript theme={null}
{
  videoName: "webinar_q_and_a_session",
  scenes: [{
    audioUrl: "https://storage.example.com/webinar-audio.m4a",
    audioLanguage: "en-US"
  }]
}
```

**Result:** Webinar audio transformed into watchable video content.

## Best Practices

<AccordionGroup>
  <Accordion title="Optimize Audio Quality">
    Ensure high-quality audio for best transcription:

    * **Clear Speech**: Use good microphones for recording
    * **Minimize Noise**: Reduce background noise and echo
    * **Proper Levels**: Avoid audio that is too quiet or distorted
    * **Single Speaker**: One speaker at a time works best for transcription
    * **Speaking Pace**: Natural speaking pace (not too fast) improves accuracy
    * **File Quality**: Use 128kbps or higher bitrate for MP3
  </Accordion>

  <Accordion title="Choose Appropriate Content Length">
    Match content length to your platform and audience:

    * **Social Media**: Extract 1-3 minute clips for maximum engagement
    * **YouTube**: 5-15 minutes works well for episodic content
    * **Full Episodes**: Consider breaking 30+ minute podcasts into segments
    * **Processing Time**: Longer audio = longer processing (plan accordingly)
    * **Viewer Retention**: Shorter clips often perform better on social platforms
  </Accordion>

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

    * **Cloud Storage**: Upload to Google Drive, Dropbox, or AWS S3
    * **Public Link**: Generate a direct, public download link
    * **Test Access**: Verify link works in incognito browser
    * **Stable URL**: Ensure link will not expire during processing
    * **Direct URL**: Use direct file URL, not streaming or preview links
  </Accordion>

  <Accordion title="Plan for Transcription Accuracy">
    Improve AI transcription results:

    * **Clear Audio**: Clean recordings transcribe more accurately
    * **Standard Accents**: Clear, standard pronunciation works best
    * **Avoid Jargon**: Technical terms may not transcribe perfectly
    * **Speaker Separation**: Clear pauses between speakers help
    * **Background Music**: Minimize or remove background music for better transcription
  </Accordion>

  <Accordion title="Extract Key Segments">
    Create focused, engaging content:

    * **Highlight Reels**: Extract best moments from full episodes
    * **Topic Segments**: Create separate videos for different topics
    * **Intro Clips**: Use episode intros as social media teasers
    * **Quotes**: Extract powerful quotes or insights as short clips
    * **Series**: Create a series of related short videos from one episode
  </Accordion>
</AccordionGroup>

## Troubleshooting

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

    **Solution:**

    * Verify the URL is publicly accessible (test in incognito browser)
    * Ensure it is a direct download link, not a streaming or preview link
    * For Google Drive: Right-click → Share → "Anyone with the link" → Copy link
    * For Dropbox: Share → Create link → change "dl=0" to "dl=1" at end of URL
    * Check file hasn't been deleted or moved
    * Verify file format is supported (see table above)
  </Accordion>

  <Accordion title="Transcription is inaccurate">
    **Problem:** Auto-generated captions do not match the audio.

    **Solution:**

    * Improve audio quality (reduce background noise, use better microphone)
    * Ensure speakers speak clearly and at moderate pace
    * Reduce background music volume if present
    * Check audio is not distorted or too quiet
    * Try re-recording with better equipment/conditions
    * Consider professional audio editing before conversion
  </Accordion>

  <Accordion title="Visuals Do Not Match Audio Content">
    **Problem:** Selected stock visuals seem unrelated to podcast topic.

    **Solution:**

    * The AI selects visuals based on transcribed content
    * Ensure speakers mention key visual concepts in the audio
    * More descriptive language helps AI select better visuals
    * Consider extracting specific segments with clearer topics
    * Review final video - sometimes visuals are thematic rather than literal
  </Accordion>

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

    **Solution:**

    * Audio processing time depends on length and quality
    * Expected times:
      * 1-5 minutes audio: 5-10 minutes processing
      * 10-30 minutes audio: 15-30 minutes processing
      * 60+ minutes audio: 45-90 minutes processing
    * Large file sizes take longer to download and process
    * Check status every 5-10 seconds, not more frequently
    * If stuck for 2x expected time, contact support with job ID
  </Accordion>

  <Accordion title="Video has no captions">
    **Problem:** Expected auto-generated captions but they are missing.

    **Solution:**

    * Captions are automatically generated from transcription
    * Verify audio contains clear, audible speech
    * Check that audio is not purely music or sound effects
    * Ensure audio file is not corrupted
    * Try with a different audio file to test
    * Contact support if issue persists
  </Accordion>
</AccordionGroup>

## Next Steps

Enhance your podcast videos with these features:

<CardGroup cols={2}>
  <Card title="Background Music" icon="music" href="/guides/advanced-features/background-music">
    Add music layers to your podcast videos
  </Card>

  <Card title="Custom Captions" icon="closed-captioning" href="/guides/text-to-video/text-to-video-captions">
    Customize or translate auto-generated captions
  </Card>

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

  <Card title="Intro/Outro" icon="clapperboard" href="/guides/advanced-features/intro-outro">
    Add branded intro and outro sequences
  </Card>
</CardGroup>

## API Reference

For complete technical details, see:

* [Render Storyboard Video](/api-reference/videos/render-storyboard-video) - Full API specification
* [Get Job Status](/api-reference/jobs/get-video-render-job-by-id) - Monitor job status and progress
