You can spin up a fully automated pipeline that takes a keyword list, writes a concise script, turns it into a natural-sounding voice, matches the narration to royalty-free footage, assembles a 15-second vertical video, and publishes it to your YouTube channel without ever showing a human face. The result is a Faceless YouTube Automation System that churns out viral-ready Shorts on demand.
Faceless YouTube Automation System is a workflow that combines AI-generated copy, synthetic speech, and stock video clips to create face-less YouTube Shorts automatically.
Below you'll find every component you need, a step-by-step build guide, the common failure points, and a concise FAQ. By the end of this article you'll be able to answer the question "how to make faceless youtube shorts with ai" for yourself and for clients who want to scale short-form content without hiring a production crew.
What you need
| Tool | Plan / Price | Role |
|---|---|---|
| OpenAI API (GPT-4o) | pay-as-you-go (check current pricing) | Generate video scripts and title ideas |
| ElevenLabs API | pay-as-you-go (check current pricing) | Convert scripts to lifelike voice-overs |
| Midjourney (or Stable Diffusion) | Basic $10 /mo (Midjourney) or free self-hosted | Create thumbnail graphics on the fly |
| Canva Pro | $12.99 /mo (or free trial) | Quick layout for overlay text and branding |
| Pexels / Pixabay | Free (commercial-use) | Source royalty-free footage and B-roll |
| YouTube Data API | Pay-as-you-go (check YouTube pricing) | Upload Shorts and set metadata |
| Descript (Overdub) | $12 /mo (optional) | Alternate voice synthesis if ElevenLabs isn't enough |
| RunwayML (Gen-2) | $19 /mo (check current pricing) | Optional AI video generation for niche topics |
| n8n (self-hosted Docker) | Free (self-hosted) | Orchestrate all API calls and file handling |
| Git (GitHub) | Free | Store workflow JSON and version control |
Estimated build time: 2 - 3 weeks of part-time work (research, API key setup, workflow debugging, and publishing automation).
How to make faceless youtube shorts with ai
The core of the system lives in n8n, an open-source workflow engine. Each node performs a single, testable action: fetch a keyword, generate a script, synthesize speech, pull matching footage, assemble the video, and push it to YouTube. Follow the numbered steps precisely; missing a flag or mis-naming a field will break the chain.
1. Prepare API credentials
1.1. OpenAI: Log into <https://platform.openai.com> and create a new API key. Store it as OPENAI_API_KEY in your n8n environment variables.
1.2. ElevenLabs: Sign up at <https://elevenlabs.io>, generate an API key, and set ELEVENLABS_API_KEY.
1.3. YouTube: Follow the YouTube Creators guide (<https://www.youtube.com/creators>) to create a Google Cloud project, enable the YouTube Data API v3, and download the OAuth 2.0 client credentials JSON.
1.4. Midjourney (optional): If you use the Discord-based service, add your Discord token to MIDJOURNEY_DISCORD_TOKEN. For a self-hosted Stable Diffusion instance, expose the /v1/text2img endpoint and set STABLEDIFFUSION_URL.
1.5. RunwayML (optional): Obtain a Runway API key and store it as RUNWAY_API_KEY.
Tip: Keep all keys in a
.envfile that n8n loads on startup. Never commit secrets to Git.
2. Install and launch n8n
After the container starts, open http://localhost:5678 and log in with the basic-auth credentials you set. The UI will be your visual canvas for the workflow.
3. Create the keyword source node
Add an HTTP Request node named GetKeyword that calls a simple Google Sheet JSON endpoint you maintain (or a third-party keyword API).
- Method:
GET - URL:
https://script.google.com/macros/s/your-script-id/exec - Response format:
JSON
Map the first element of the returned array to a workflow variable {{ $json[0] }}. This will be the seed for the rest of the pipeline.
4. Generate a script with OpenAI
Add an OpenAI node called WriteScript.
- Model:
gpt-4o(or the latest model) - Prompt:
- Temperature:
0.7 - Max tokens:
150
The node returns a JSON object with text. Store it in {{ $json["text"] }} for later steps.
5. Synthesize voice with ElevenLabs
Add an HTTP Request node named VoiceOver.
- Method:
POST - URL:
https://api.elevenlabs.io/v1/text-to-speech/your-voice-id - Headers:
- Body (JSON):
Set Response format to Binary and name the output file voice.mp3.
What this does: Sends the script to ElevenLabs and receives an MP3 audio file that sounds like a human narrator.
6. Find matching footage on Pexels
Create an HTTP Request node SearchFootage.
- Method:
GET - URL:
https://api.pexels.com/videos/search - Query Parameters:
| Parameter | Value |
|---|---|
| query | {{ $node["GetKeyword"].json["keyword"] }} |
| orientation | vertical |
| size | medium |
| per_page | 5 |
- Headers:
Parse the JSON response and pick the first video URL ({{ $json["videos"][0]["video_files"][0]["link"] }}). Store it as {{ $node["SearchFootage"].json["selectedUrl"] }}.
7. Download the video clip
Add a HTTP Request node DownloadClip with
- Method:
GET - URL:
{{ $node["SearchFootage"].json["selectedUrl"] }} - Response format:
Binary - File name:
clip.mp4
8. Assemble the final short in Descript (or FFmpeg)
If you have a Descript account, use its API (beta) to concatenate the clip and voiceover. Otherwise, run an FFmpeg command via the Execute Command node.
#### Using FFmpeg (self-hosted)
- Input paths:
{{ $node["DownloadClip"].binary["data"] }}and{{ $node["VoiceOver"].binary["data"] }}are saved to/data. - Output:
output.mp4(vertical, 9:16 aspect ratio).
What this does: Merges the stock video and AI voice into a single, YouTube-compatible MP4 file.
9. Generate a thumbnail with Midjourney
Add a Midjourney node MakeThumbnail (or use a self-hosted Stable Diffusion endpoint).
- Prompt:
- Output:
thumbnail.png.
If you use Midjourney's Discord bot, configure the node to forward the prompt and capture the image URL from the bot response.
10. Upload to YouTube
Create a YouTube node UploadShort.
- OAuth2 credentials: select the client JSON you placed in
google-client-secret.json. - Title:
{{ $node["GetKeyword"].json["keyword"] }} - Quick Tips - Description:
{{ $node["WriteScript"].json["text"] }} - Tags:
{{ $node["GetKeyword"].json["keyword"] }}, short, tip, AI - Privacy status:
public(orunlistedfor testing) - Video file:
{{ $node["Execute Command"].binary["data"] }}(the MP4 from step 8) - Thumbnail file:
{{ $node["MakeThumbnail"].binary["data"] }}
n8n will handle the OAuth token refresh automatically after you authorize the first upload.
11. Loop and schedule
Add a Cron node at the top of the workflow to trigger the entire pipeline every 6 hours (or any cadence you prefer). Connect its output to GetKeyword to start a new Short automatically.
12. Test end-to-end
Run the workflow manually the first time. Verify:
- The script is readable and under 60 words.
- The voice file is ~45 seconds long.
- The video plays in a vertical format without black bars.
- The thumbnail appears correctly on the YouTube Shorts page.
If any node fails, consult the "Where this breaks" section below.
Where this breaks
| Failure point | Symptom | Fix |
|---|---|---|
| OpenAI rate limit | 429 response, script node stalls | Implement an If node that catches 429 and adds a {{ $wait(60) }} delay before retrying. |
| ElevenLabs token expiry | 401 Unauthorized from VoiceOver node | Refresh the API key in the ElevenLabs dashboard and update ELEVENLABS_API_KEY. |
| YouTube upload quota exhausted | API error quotaExceeded | YouTube grants 10 000 units per day; a Short upload costs 160 units. Monitor usage via the Google Cloud console and request a higher quota if needed. |
| Pexels returns no results | Empty videos array, downstream FFmpeg error | Add a fallback node that selects a generic "b-roll" clip from a pre-downloaded library when the search yields nothing. |
| Midjourney Discord latency | No image URL returned within timeout | Increase the node's timeout to 120 seconds and ensure the bot is in the same server as the n8n webhook. |
| FFmpeg missing on host | "command not found" error | Install FFmpeg in the Docker container by extending the image: |
Rebuild and redeploy the container. |
| Incorrect aspect ratio | YouTube shows black bars on the sides | Add -vf "scale=720:1280,setsar=1:1" to the FFmpeg command to force 9:16. |
| OAuth token revocation | UploadShort node fails after 30 days | Re-authorize the YouTube node through the UI; n8n stores refreshed tokens automatically thereafter. |
Important: All external APIs have usage caps that can become costly if you run the workflow too frequently. Set explicit budget alerts in your OpenAI and Google Cloud consoles.
For a deeper technical reference, see n8n's documentation.