{"slug": "how-to-make-faceless-youtube-shorts-with-ai", "title": "how to make faceless youtube shorts with ai", "summary": "A developer has detailed a fully automated pipeline for creating faceless YouTube Shorts using AI, combining OpenAI's GPT-4o for script generation, ElevenLabs for voice synthesis, and stock footage from Pexels or Pixabay, orchestrated via the n8n workflow engine. The system can generate, assemble, and publish 15-second vertical videos without human intervention, with an estimated build time of two to three weeks. The workflow includes optional integrations with Midjourney, RunwayML, and Descript for enhanced visuals and voice options.", "body_md": "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.\n\n**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.**\n\nBelow 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.\n\n| Tool | Plan / Price | Role |\n|---|---|---|\n| OpenAI API (GPT-4o) | pay-as-you-go (check current pricing) | Generate video scripts and title ideas |\n| ElevenLabs API | pay-as-you-go (check current pricing) | Convert scripts to lifelike voice-overs |\n| Midjourney (or Stable Diffusion) | Basic $10 /mo (Midjourney) or free self-hosted | Create thumbnail graphics on the fly |\n| Canva Pro | $12.99 /mo (or free trial) | Quick layout for overlay text and branding |\n| Pexels / Pixabay | Free (commercial-use) | Source royalty-free footage and B-roll |\n| YouTube Data API | Pay-as-you-go (check YouTube pricing) | Upload Shorts and set metadata |\n| Descript (Overdub) | $12 /mo (optional) | Alternate voice synthesis if ElevenLabs isn't enough |\n| RunwayML (Gen-2) | $19 /mo (check current pricing) | Optional AI video generation for niche topics |\n| n8n (self-hosted Docker) | Free (self-hosted) | Orchestrate all API calls and file handling |\n| Git (GitHub) | Free | Store workflow JSON and version control |\n\n**Estimated build time:** 2 - 3 weeks of part-time work (research, API key setup, workflow debugging, and publishing automation).\n\nThe 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.\n\n1.1. **OpenAI:** Log into [https://platform.openai.com](https://platform.openai.com) and create a new API key. Store it as `OPENAI_API_KEY`\n\nin your n8n environment variables.\n\n1.2. **ElevenLabs:** Sign up at [https://elevenlabs.io](https://elevenlabs.io), generate an API key, and set `ELEVENLABS_API_KEY`\n\n.\n\n1.3. **YouTube:** Follow the YouTube Creators guide ([https://www.youtube.com/creators](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.\n\n1.4. **Midjourney (optional):** If you use the Discord-based service, add your Discord token to `MIDJOURNEY_DISCORD_TOKEN`\n\n. For a self-hosted Stable Diffusion instance, expose the `/v1/text2img`\n\nendpoint and set `STABLEDIFFUSION_URL`\n\n.\n\n1.5. **RunwayML (optional):** Obtain a Runway API key and store it as `RUNWAY_API_KEY`\n\n.\n\nTip:Keep all keys in a`.env`\n\nfile that n8n loads on startup. Never commit secrets to Git.\n\n```\n# Pull the official Docker image\ndocker run -d \\\n --name n8n \\\n -p 5678:5678 \\\n -v ~/.n8n:/home/node/.n8n \\\n -e N8N_BASIC_AUTH_ACTIVE=true \\\n -e N8N_BASIC_AUTH_USER=admin \\\n -e N8N_BASIC_AUTH_PASSWORD=strongpassword \\\n -e OPENAI_API_KEY \\\n -e ELEVENLABS_API_KEY \\\n -e YOUTUBE_CLIENT_SECRET=/home/node/.n8n/google-client-secret.json \\\n n8nio/n8n\n```\n\nAfter 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.\n\nAdd an **HTTP Request** node named *GetKeyword* that calls a simple Google Sheet JSON endpoint you maintain (or a third-party keyword API).\n\n`GET`\n\n`https://script.google.com/macros/s/your-script-id/exec`\n\n`JSON`\n\nMap the first element of the returned array to a workflow variable `{{ $json[0] }}`\n\n. This will be the seed for the rest of the pipeline.\n\nAdd an **OpenAI** node called *WriteScript*.\n\n`gpt-4o`\n\n(or the latest model) \n\n```\nWrite a 45-word YouTube Shorts script about \"{{ $node[\"GetKeyword\"].json[\"keyword\"] }}\". Include a hook in the first 5 seconds, a clear benefit, and a call-to-action to like or follow. Use a conversational tone.\n```\n\n`0.7`\n\n`150`\n\nThe node returns a JSON object with `text`\n\n. Store it in `{{ $json[\"text\"] }}`\n\nfor later steps.\n\nAdd an **HTTP Request** node named *VoiceOver*.\n\n`POST`\n\n`https://api.elevenlabs.io/v1/text-to-speech/your-voice-id`\n\n```\n{\n \"xi-api-key\": \"{{ $env.ELEVENLABS_API_KEY }}\",\n \"Content-Type\": \"application/json\"\n}\n{\n \"text\": \"{{ $node[\"WriteScript\"].json[\"text\"] }}\",\n \"voice_settings\": {\n \"stability\": 0.75,\n \"similarity_boost\": 0.85\n }\n}\n```\n\nSet **Response format** to `Binary`\n\nand name the output file `voice.mp3`\n\n.\n\nWhat this does:Sends the script to ElevenLabs and receives an MP3 audio file that sounds like a human narrator.\n\nCreate an **HTTP Request** node *SearchFootage*.\n\n`GET`\n\n`https://api.pexels.com/videos/search`\n\n| Parameter | Value |\n|---|---|\n| query | `{{ $node[\"GetKeyword\"].json[\"keyword\"] }}` |\n| orientation | `vertical` |\n| size | `medium` |\n| per_page | `5` |\n\n```\n{\n \"Authorization\": \"YOUR_PEXELS_API_KEY\"\n}\n```\n\nParse the JSON response and pick the first video URL (`{{ $json[\"videos\"][0][\"video_files\"][0][\"link\"] }}`\n\n). Store it as `{{ $node[\"SearchFootage\"].json[\"selectedUrl\"] }}`\n\n.\n\nAdd a **HTTP Request** node *DownloadClip* with\n\n`GET`\n\n`{{ $node[\"SearchFootage\"].json[\"selectedUrl\"] }}`\n\n`Binary`\n\n`clip.mp4`\n\nIf 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.\n\n```\nffmpeg -y -i /data/clip.mp4 -i /data/voice.mp3 -c:v libx264 -c:a aac -shortest /data/output.mp4\n```\n\n`{{ $node[\"DownloadClip\"].binary[\"data\"] }}`\n\nand `{{ $node[\"VoiceOver\"].binary[\"data\"] }}`\n\nare saved to `/data`\n\n. `output.mp4`\n\n(vertical, 9:16 aspect ratio).\n\nWhat this does:Merges the stock video and AI voice into a single, YouTube-compatible MP4 file.\n\nAdd a **Midjourney** node *MakeThumbnail* (or use a self-hosted Stable Diffusion endpoint).\n\n```\nA bold, colorful YouTube Shorts thumbnail featuring the text \"{{ $node[\"GetKeyword\"].json[\"keyword\"] }}\" in large sans-serif, with a subtle AI-generated abstract background.\n```\n\n`thumbnail.png`\n\n. If you use Midjourney's Discord bot, configure the node to forward the prompt and capture the image URL from the bot response.\n\nCreate a **YouTube** node *UploadShort*.\n\n`google-client-secret.json`\n\n. `{{ $node[\"GetKeyword\"].json[\"keyword\"] }} - Quick Tips`\n\n`{{ $node[\"WriteScript\"].json[\"text\"] }}`\n\n`{{ $node[\"GetKeyword\"].json[\"keyword\"] }}, short, tip, AI`\n\n`public`\n\n(or `unlisted`\n\nfor testing) `{{ $node[\"Execute Command\"].binary[\"data\"] }}`\n\n(the MP4 from step 8) `{{ $node[\"MakeThumbnail\"].binary[\"data\"] }}`\n\nn8n will handle the OAuth token refresh automatically after you authorize the first upload.\n\nAdd 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.\n\nRun the workflow manually the first time. Verify:\n\nIf any node fails, consult the \"Where this breaks\" section below.\n\n| Failure point | Symptom | Fix |\n|---|---|---|\n| OpenAI rate limit | 429 response, script node stalls | Implement an If node that catches `429` and adds a `{{ $wait(60) }}` delay before retrying. |\n| ElevenLabs token expiry | 401 Unauthorized from VoiceOver node | Refresh the API key in the ElevenLabs dashboard and update `ELEVENLABS_API_KEY` . |\n| YouTube upload quota exhausted | API error `quotaExceeded`\n|\nYouTube 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. |\n| Pexels returns no results | Empty `videos` array, downstream FFmpeg error |\nAdd a fallback node that selects a generic \"b-roll\" clip from a pre-downloaded library when the search yields nothing. |\n| 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. |\n| FFmpeg missing on host | \"command not found\" error | Install FFmpeg in the Docker container by extending the image: |\n\n```\nFROM n8nio/n8n:latest\nRUN apk add --no-cache ffmpeg\n```\n\nRebuild and redeploy the container. |\n\n| Incorrect aspect ratio | YouTube shows black bars on the sides | Add `-vf \"scale=720:1280,setsar=1:1\"`\n\nto the FFmpeg command to force 9:16. |\n\n| OAuth token revocation | UploadShort node fails after 30 days | Re-authorize the YouTube node through the UI; n8n stores refreshed tokens automatically thereafter. |\n\nImportant: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.\n\nFor a deeper technical reference, see [n8n's documentation](https://docs.n8n.io/).\n\nThe limit depends on your YouTube Data API daily quota (≈10 000 units) and the OpenAI usage you permit. A single Short upload costs roughly 160 units, leaving room for dozens of videos. Adjust the cron schedule to stay within your budget.\n\nYes. The *VoiceOver* node only expects a POST endpoint that returns an audio file. Swap the URL and required headers for Amazon Polly, Google Cloud Text-to-Speech, or any self-hosted TTS engine, keeping the same binary output handling.\n\nMidjourney's free trial provides a limited number of generation credits. For a production pipeline you'll want at least the Basic $10 /mo plan, which grants 200 generations per month. If you prefer an entirely self-hosted solution, replace the Midjourney node with a Stable Diffusion API call.\n\nAdd a **Canva** node after *MakeThumbnail* that loads a pre-designed template and injects the keyword as overlay text via the Canva API. Then feed the resulting PNG into the YouTube upload node as the thumbnail.\n\nTechnically yes, but you'll hit multiple bottlenecks: OpenAI token limits, ElevenLabs concurrent synthesis, and YouTube quota. Mitigate by running several n8n instances behind a load balancer, using batch keyword lists, and negotiating higher API quotas with the providers.\n\nBuilding a **Faceless YouTube Automation System** once gives you a reusable engine for countless niches - tech tips, finance hacks, cooking shortcuts, or any micro-learning content you can script in under a minute. By following the exact steps above, you now have a concrete, production-ready pipeline that answers the core question **how to make faceless youtube shorts with ai** without any guesswork.\n\nReady to start selling these automations? Check out our guide on [AI automations you can sell](https://getaab.com/ai-automations-to-sell) and grab the free cheat-sheet at the end of the article: [https://getaab.com/free](https://getaab.com/free).\n\nHappy building, and may your Shorts go viral.", "url": "https://wpnews.pro/news/how-to-make-faceless-youtube-shorts-with-ai", "canonical_source": "https://dev.to/samchenreviews/how-to-make-faceless-youtube-shorts-with-ai-1o3k", "published_at": "2026-08-26 02:25:46+00:00", "updated_at": "2026-08-26 02:43:02.699309+00:00", "lang": "en", "topics": ["artificial-intelligence", "generative-ai", "ai-tools", "developer-tools"], "entities": ["OpenAI", "ElevenLabs", "Midjourney", "Stable Diffusion", "Canva", "Pexels", "Pixabay", "YouTube Data API"], "alternates": {"html": "https://wpnews.pro/news/how-to-make-faceless-youtube-shorts-with-ai", "markdown": "https://wpnews.pro/news/how-to-make-faceless-youtube-shorts-with-ai.md", "text": "https://wpnews.pro/news/how-to-make-faceless-youtube-shorts-with-ai.txt", "jsonld": "https://wpnews.pro/news/how-to-make-faceless-youtube-shorts-with-ai.jsonld"}}