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

# Blog URL to Video with AI Voice-Over

> Convert blog articles into videos with AI-generated voice-over narration

This guide shows you how to convert blog articles into engaging videos with professional AI-generated voice-over narration. Perfect for repurposing written content into narrated video format for social media, YouTube, or podcasts.

## What You'll Learn

<CardGroup cols={2}>
  <Card title="Blog to Video" icon="newspaper">
    Convert blog URLs to video storyboards automatically
  </Card>

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

  <Card title="Voice Customization" icon="sliders">
    Control speaker, speed, and amplification settings
  </Card>

  <Card title="Auto Sync" icon="waveform">
    Voice-over syncs automatically with video scenes
  </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
* The URL of a publicly accessible blog article
* Basic understanding of voice-over concepts

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

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

## How Blog-to-Video with Voice-Over Works

When you convert a blog to video with voice-over narration:

1. **Content Extraction** - The API scrapes your blog URL for text content
2. **Scene Generation** - The content is analyzed and split into logical scenes
3. **Visual Selection** - Appropriate stock visuals are automatically matched to each scene
4. **Voice Generation** - AI creates natural voice-over narration from the extracted text
5. **Synchronization** - Voice-over is automatically synchronized with video timing
6. **Video Rendering** - The final video is rendered with narration and visuals combined

<Note>
  The blog URL must be publicly accessible. Password-protected or paywalled content cannot be extracted. The AI will automatically determine the best way to structure your content into scenes.
</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 blog URL - replace with your own blog URL
  const BLOG_URL = "https://blog.pictory.ai/10-best-text-to-video-ai-tools/";

  async function createBlogUrlToVideoWithVoiceOver() {
    try {
      console.log("Creating video from blog URL with AI voice-over...");

      const response = await axios.post(
        `${API_BASE_URL}/v2/video/storyboard/render`,
        {
          videoName: "blog_url_to_video_with_voiceover",

          // Voice-over configuration
          voiceOver: {
            enabled: true,                    // Enable voice-over
            aiVoices: [
              {
                speaker: "Brian",              // AI voice name
                speed: 100,                    // Normal speaking speed (50-200)
                amplificationLevel: 0,         // Normal volume (-1 to 1)
              },
            ],
          },

          scenes: [
            {
              blogUrl: BLOG_URL,               // Blog article URL
              createSceneOnNewLine: true,      // Create new scene on each new line
              createSceneOnEndOfSentence: true, // Create new scene at end of sentences
            }
          ],
        },
        {
          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 blog URL with voice-over 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;
    }
  }

  createBlogUrlToVideoWithVoiceOver();
  ```

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

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

  # Sample blog URL - replace with your own blog URL
  BLOG_URL = "https://blog.pictory.ai/10-best-text-to-video-ai-tools/"

  def create_blog_url_to_video_with_voiceover():
      try:
          print("Creating video from blog URL with AI voice-over...")

          response = requests.post(
              f'{API_BASE_URL}/v2/video/storyboard/render',
              json={
                  'videoName': 'blog_url_to_video_with_voiceover',

                  # Voice-over configuration
                  'voiceOver': {
                      'enabled': True,                    # Enable voice-over
                      'aiVoices': [
                          {
                              'speaker': 'Brian',              # AI voice name
                              'speed': 100,                    # Normal speaking speed (50-200)
                              'amplificationLevel': 0         # Normal volume (-1 to 1)
                          }
                      ]
                  },

                  'scenes': [
                      {
                          'blogUrl': BLOG_URL,             # Blog article URL
                          'createSceneOnNewLine': True,    # Create new scene on each new line
                          'createSceneOnEndOfSentence': True  # Create new scene at end of sentences
                      }
                  ]
              },
              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 blog URL with voice-over 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_blog_url_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                           |
| `voiceOver`                           | object  | Yes      | Voice-over configuration object                                     |
| `scenes`                              | array   | Yes      | Array of scene objects                                              |
| `scenes[].blogUrl`                    | string  | Yes      | The URL of the blog article or webpage to convert                   |
| `scenes[].createSceneOnNewLine`       | boolean | No       | Create a new scene on each new line in the content (default: false) |
| `scenes[].createSceneOnEndOfSentence` | boolean | No       | Create a new scene at the end of each sentence (default: false)     |

### 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 (currently supports one voice) |
| `speaker`            | string  | Yes      | The name of the AI voice (e.g., "Brian", "Emma")                |
| `speed`              | number  | No       | Voice speed from 50-200 (default: 100 = normal speed)           |
| `amplificationLevel` | number  | No       | Volume level from -1 to 1 (default: 0 = normal volume)          |

<Tip>
  To get a complete list of available AI voices, use the [Get Voiceover Tracks](/api-reference/voiceovers/get-voiceover-tracks) API endpoint. This returns all available voices with their names, languages, and characteristics.
</Tip>

## Voice Speed Reference

| Speed Value | Playback Rate              | Best Used For                                     |
| ----------- | -------------------------- | ------------------------------------------------- |
| 50          | 0.5x (Very slow)           | Complex technical content, detailed explanations  |
| 75          | 0.75x (Slower)             | Educational content, learning materials           |
| 90          | 0.9x (Slightly slower)     | Professional presentations, important information |
| 100         | 1.0x (Normal)              | Standard content, most blog articles              |
| 110-120     | 1.1-1.2x (Slightly faster) | Casual content, quick summaries                   |
| 150         | 1.5x (Fast)                | Quick recaps, energetic content                   |
| 200         | 2.0x (Very fast)           | Speed reading, urgent updates                     |

## Amplification Level Reference

| Level | Effect              | Best Used For                                |
| ----- | ------------------- | -------------------------------------------- |
| -1.0  | Quietest            | Background narration, ambient voice          |
| -0.5  | Quieter than normal | Subtle emphasis, secondary information       |
| 0     | Normal volume       | Standard narration, most use cases           |
| 0.3   | Slightly louder     | Important points, key messages               |
| 0.5   | Moderately louder   | Strong emphasis, calls-to-action             |
| 1.0   | Loudest             | Maximum emphasis, attention-grabbing moments |

<Warning>
  **Volume Considerations:** Very high amplification levels (0.7-1.0) may cause audio distortion. Test your settings and use moderation for professional results.
</Warning>

## Supported Content Types

The API can extract and convert content from:

* Blog posts and articles
* News websites
* Medium articles
* WordPress sites
* Most publicly accessible web pages
* Content management system (CMS) pages

<Note>
  The URL must be publicly accessible without authentication. Password-protected, paywalled, or login-required content cannot be extracted.
</Note>

## Common Use Cases

### Content Marketing and Social Media

```javascript theme={null}
{
  videoName: "social_media_video",
  voiceOver: {
    enabled: true,
    aiVoices: [{
      speaker: "Emma",      // Female voice for lifestyle content
      speed: 110,           // Slightly faster for engaging delivery
      amplificationLevel: 0.2  // Slightly louder for emphasis
    }]
  },
  scenes: [
    {
      blogUrl: "https://yourblog.com/latest-article",
      createSceneOnNewLine: true,
      createSceneOnEndOfSentence: true
    }
  ]
}
```

**Result:** Engaging social media video with professional female narration.

### Educational and Tutorial Content

```javascript theme={null}
{
  videoName: "tutorial_video",
  voiceOver: {
    enabled: true,
    aiVoices: [{
      speaker: "Brian",     // Clear male voice for tutorials
      speed: 90,            // Slower for comprehension
      amplificationLevel: 0   // Normal volume
    }]
  },
  scenes: [
    {
      blogUrl: "https://tutorial-site.com/how-to-guide",
      createSceneOnNewLine: true,
      createSceneOnEndOfSentence: true
    }
  ]
}
```

**Result:** Clear instructional video with slower narration for better understanding.

### Business and Corporate Content

```javascript theme={null}
{
  videoName: "corporate_update",
  voiceOver: {
    enabled: true,
    aiVoices: [{
      speaker: "Matthew",   // Professional male voice
      speed: 100,           // Normal pace
      amplificationLevel: 0   // Standard volume
    }]
  },
  scenes: [
    {
      blogUrl: "https://company-blog.com/quarterly-update",
      createSceneOnNewLine: true,
      createSceneOnEndOfSentence: true
    }
  ]
}
```

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

### Quick News and Updates

```javascript theme={null}
{
  videoName: "news_update",
  voiceOver: {
    enabled: true,
    aiVoices: [{
      speaker: "Joanna",    // Dynamic female voice
      speed: 120,           // Faster for news delivery
      amplificationLevel: 0.3  // Louder for energy
    }]
  },
  scenes: [
    {
      blogUrl: "https://news-site.com/latest-update",
      createSceneOnNewLine: true,
      createSceneOnEndOfSentence: true
    }
  ]
}
```

**Result:** Energetic news-style video with faster delivery.

## Best Practices

<AccordionGroup>
  <Accordion title="Choose the Right Voice Speed">
    Match voice speed to your content type and audience:

    * **Technical/Complex**: Use 75-90 for slower, clearer delivery
    * **Standard Content**: Use 100 for natural, comfortable pacing
    * **Casual/Social**: Use 110-120 for energetic, engaging delivery
    * **Quick Updates**: Use 120-150 for fast-paced content
    * **Test First**: Always preview before production to ensure the pace feels right
  </Accordion>

  <Accordion title="Select Appropriate Amplification">
    Use volume strategically for emphasis:

    * **Subtle Changes**: Use 0.1-0.3 for gentle emphasis on key points
    * **Normal Content**: Keep at 0 for most narration
    * **Strong Emphasis**: Use 0.4-0.6 sparingly for critical messages
    * **Avoid Extremes**: Don't exceed 0.7 to prevent audio distortion
    * **Consistency**: Maintain similar levels across similar content types
  </Accordion>

  <Accordion title="Pick the Right AI Voice">
    Choose voices that match your brand and content:

    * **Professional/Business**: Brian, Matthew, or Joanna
    * **Casual/Friendly**: Emma, Amy, or Joey
    * **Technical/Educational**: Brian or Emma for clarity
    * **Brand Consistency**: Use the same voice across all your videos
    * **Test Options**: Try different voices to find the best fit

    Use the [Get Voiceover Tracks API](/api-reference/voiceovers/get-voiceover-tracks) to explore all available voices.
  </Accordion>

  <Accordion title="Verify URL Accessibility">
    Ensure your blog URL will work:

    * **Public Access**: URL must be accessible without login
    * **No Paywalls**: Content behind paywalls cannot be extracted
    * **Clean URLs**: Avoid URLs with session parameters or tracking codes
    * **Test First**: Manually check the URL opens in a browser
    * **Well-Structured**: Articles with clear HTML structure work best
  </Accordion>

  <Accordion title="Optimize Blog Content">
    Prepare your blog for better video conversion:

    * **Clear Structure**: Use headings and paragraphs effectively
    * **Concise Writing**: Shorter sentences work better for narration
    * **Relevant Length**: 500-2000 words is ideal for video conversion
    * **Visual Content**: Include images that can be used in the video
    * **Clean Formatting**: Remove excessive ads or sidebars when possible
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Error: Unable to extract content from URL">
    **Problem:** The API cannot access or parse the blog content.

    **Solution:**

    * Verify the URL is publicly accessible (test in incognito browser)
    * Check that the article does not require login or subscription
    * Ensure the URL is complete and correctly formatted
    * Try removing URL parameters (everything after `?`)
    * Verify the blog page loads correctly and has text content
    * Check if the site has anti-scraping protection
  </Accordion>

  <Accordion title="Voice sounds robotic or unnatural">
    **Problem:** The voice-over sounds artificial or choppy.

    **Solution:**

    * Try a different AI voice speaker (some sound more natural)
    * Adjust the speed to 95-105 for more natural cadence
    * Ensure your blog content has proper punctuation
    * Avoid using all caps or unusual formatting in source content
    * Use the [Get Voiceover Tracks API](/api-reference/voiceovers/get-voiceover-tracks) to find higher-quality voices
  </Accordion>

  <Accordion title="Voice-Over Does Not Match Video Length">
    **Problem:** Narration is too fast/slow for the video scenes.

    **Solution:**

    * The API automatically syncs voice to video duration
    * If issues persist, adjust the `speed` parameter:
      * Increase speed (110-120) if narration is too slow
      * Decrease speed (80-90) if narration is too fast
    * Very long articles may be automatically summarized
    * Consider breaking long articles into multiple videos
  </Accordion>

  <Accordion title="Audio quality is poor or distorted">
    **Problem:** Voice-over audio sounds muffled or distorted.

    **Solution:**

    * Reduce `amplificationLevel` to 0 or below
    * Avoid levels above 0.7 which can cause clipping
    * Try a different AI voice - some have better audio quality
    * Check if the source content has unusual characters or formatting
    * Ensure punctuation in source content is correct
  </Accordion>

  <Accordion title="Video created but no content extracted">
    **Problem:** Video completes but appears empty or very short.

    **Solution:**

    * Check that the URL points to an article, not the homepage
    * Verify the page has substantial text content (300+ words)
    * Remove URL parameters and tracking codes
    * Try a direct link to the article, not a shortened URL
    * Ensure the page is in a supported language
  </Accordion>
</AccordionGroup>

## Next Steps

Enhance your blog-to-video content with these features:

<CardGroup cols={2}>
  <Card title="Background Music" icon="music" href="/guides/advanced-features/background-music">
    Add music to complement voice-over narration
  </Card>

  <Card title="Custom Captions" icon="closed-captioning" href="/guides/text-to-video/text-to-video-captions">
    Add translated or custom subtitles to your videos
  </Card>

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

  <Card title="Multi-Level Voice-Over" icon="layer-group" href="/guides/text-to-video/multi-level-voiceover">
    Use different voices for different scenes
  </Card>
</CardGroup>

## API Reference

For complete technical details, see:

* [Get Voiceover Tracks](/api-reference/voiceovers/get-voiceover-tracks) - List all available AI voices
* [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
