Cindy Zhu.
Free guides
Content creation Claude + Fish Audio

Build a faceless AI channel

Hey, it's Cindy 🌱 Give Claude your niche and one useful idea. It returns a 30-video plan plus the first script and shot list.
btw the waitlist for AI System Club is now open! If you're keen on using AI to automate your content, video editing, job search, business or build AI agents, feel free to sign up (only if you want to hehe). Ps. the waitlist gets first dibs:)
What needs an account or budget? The planning prompt works in Claude chat, including Free within its limits. The automated build uses Claude Code, which needs a supported paid subscription or separately billed API access, plus Python 3. Fish's free developer API is separate from its website credits, and generated visuals or premium CapCut features can cost extra. You can start with your own screenshots and a recorded voice, then add the API when the first video works.
part one

Pick a useful niche you can keep serving

Choose an audience with a recurring problem you can explain accurately and demonstrate on screen. Topic matters, but there is no dependable pay ranking that tells a new channel what it will earn. On YouTube, RPM is a creator revenue metric after the platform's share, while CPM measures advertiser cost. They are not interchangeable, and neither is a forecast for Instagram brand deals. Read YouTube's metric definitions.

AI and practical tech Show a real workflow, its result and the limitation. Screen recordings give you useful original visuals without showing your face.
Money education Explain a concept with sourced examples, not personalised recommendations or promised returns. This lane requires careful evidence and qualified review where appropriate.
Entertainment and stories Build original characters and narratives. Do not assume someone else's character, clips, likeness or voice is yours to reuse.
A workable first choice Pick the topic where you can show one useful result today. Use the prompt below to turn it into a coherent series and the first complete script.
Keep the business maths honest. Revenue depends on eligibility, audience, format, demand and costs. Use your own channel's analytics once available; until then, any revenue model is a scenario with labelled assumptions, not an expected salary.

part two

A month of ideas and the first finished script

Open a new Claude chat and paste this prompt. Replace the niche if you already have one; otherwise the default works. Add your own notes or public source links when the first video teaches a factual claim. The plan is a queue of ideas, not an instruction to publish 30 unreviewed AI videos.

The channel strategist
My niche is AI tools for small business owners unless I specify another. Turn the niche and any notes or sources I supply into a 30-video plan grouped into four or five clear pillars. For each video, return a title under 60 characters, a first-three-seconds hook, a five-beat outline, a candidate search phrase and the useful result the viewer gets. Never promise income, virality or a capability the video cannot demonstrate.

Pick five sensible starting ideas by usefulness, available evidence and ease of making a credible demo. Do not invent search volume, competition scores or performance predictions. If I supply analytics, cite the exact metric and date; otherwise label prioritisation as editorial judgment.

Then fully produce the best first idea: a 110–140-word narration, a second copy with at most three sparse Fish S2 square-bracket delivery directions, and six shot briefs matched to the narration. Each shot needs exact on-screen text, the screen action or original visual, and a source or asset requirement. Draft one title and a short caption that add context without unearned claims.

Use opened primary sources for product facts. If you cannot open a source, say so and omit the unsupported detail. Default to a low-risk workflow using clearly labelled fictional sample business data. Ask at most three necessary questions; otherwise deliver the whole first draft now. Finish with the spoken text alone in a block labelled narration.txt and a separately labelled shot-list.md so I can carry them into the build.
💡 Keep the plan grounded. After publishing, paste actual results with the date range and a comparable baseline. Ask Claude for new angles and testable explanations, not a claim that one successful post proves a universal formula. Remove private audience or customer data first.

part two, the look

Give every shot a job

Use the six shot briefs from the first prompt. The starting route is your own screen recordings, photos and diagrams; generated footage is optional. Every visual should show the step, evidence or story beat being narrated.

Start with material you own Capture the actual workflow using fictional data. Remove private tabs, messages and account details. Keep clips named 01 through 06 in a visuals folder so the edit follows the shot list.
Optional generated shots Higgsfield is an optional visual tool from the stack. Check the selected model's credits and output rights before generating; you do not need a visual subscription for the screenshot-based first video.
Keep the look consistent, the substance original. Reuse a readable type style and restrained colour palette. Do not reuse the same generic footage as a substitute for showing what each new video teaches.

part three

Choose and test your voice

Fish Audio generates the narration. Choose a voice for clarity and fit, then listen to your own text before committing to a full take. No voice tool guarantees retention or a particular result.

Design an original narrator Use Voice Design for a description-based voice that does not imitate a real identifiable person. The exact save path is below.
Or clone your own voice Instant cloning accepts a short clean reference. Professional Voice Clone is a separate paid feature with longer recordings and live ownership verification. Follow the official cloning walkthrough, including its current storage limits, before uploading recordings.
Direct the delivery The S2 family uses square-bracket directions such as [calm]. Keep them sparse and remove them from display captions. Fish's emotion guide distinguishes this from S1's parentheses.
A timed free API offer As checked on 15 September 2026, Fish advertises s2.1-pro-free through 30 November 2026. Its free-tier announcement specifies best-effort access, possible model-improvement use of requests and commercial restrictions. It is not a blanket free commercial licence.
  1. Design the narrator. Sign in and open Create Voice → Voice Design. Describe tone, accent, pacing and use, for example: “A conversational educational narrator with a light Australian accent, measured pacing and a clear, friendly delivery.” Do not request a celebrity or a recognisable character imitation.
  2. Compare and save. Generate Samples, listen to both, select one, then Continue. Add the voice details, choose Private, complete the non-impersonation confirmation and Create Voice. Check the displayed generation cost before confirming. See Fish's Voice Design steps.
  3. Copy the voice's model ID. Open your saved voice and use its copy-ID control, or take the voice ID from its URL, as described in the API quickstart. This ID is the request's reference_id, not the speech engine's model name and not your secret API key.
Voice and data permissions. Use your own voice or explicit permission that covers cloning and the intended use. Do not upload private client scripts or recordings to the free tier. A private voice is still hosted by Fish, and an unlisted link is not private. Confirm current terms for your commercial scenario; if unclear, keep the result as a private prototype and contact Fish before publishing.
the walkthrough

Build a reusable narration tool

  1. Install the two prerequisites. Install Python 3 from python.org and Claude Code using the official quickstart. In a terminal, confirm python3 --version on macOS/Linux or py --version on Windows, then claude --version. Complete Claude's account sign-in. No Fish key belongs in that sign-in.
  2. Start in an empty folder. Create a folder called faceless-first-video in Finder or File Explorer. Open a terminal in that folder, run claude, then paste the build prompt below with your approved narration, shot list and voice ID. Approve only changes in this folder; the build must not make a live Fish request.
  3. Create the Fish key separately. Open Fish API Keys, choose Create New Key and save it in your password manager. Never paste the key into Claude, a source file, a screenshot, a command argument or a shared log. The generated program will ask for it privately when you run it yourself.
The narration builder · paste into Claude Code
Build a complete local Python 3 narration tool in this empty folder. Use only Python's standard library, so there is no SDK or package installation. Work only inside this folder. Do not deploy, publish, upload media, make a live API call or ask me to put a secret in this chat.

Use the approved narration and shot list pasted below. Save them as input/narration.txt and shot-list.md without changing their facts. Create input/preview.txt from the first one or two complete sentences, at most 25 spoken words. Save a voice-config.json with my non-secret reference_id and the exact model string s2.1-pro-free. If the voice ID is missing, ask for that ID, not my API key. Ask at most three necessary questions overall, then build.

Implement generate_voice.py with --preview and --full modes. Use urllib.request to POST JSON to https://api.fish.audio/v1/tts with Authorization: Bearer plus the secret, Content-Type: application/json and model: s2.1-pro-free in the headers. Send text, reference_id and format: mp3 in the JSON body. Use a 120-second timeout. Read input files relative to the program's own folder, not an assumed working directory.

Only accept that exact model string; never omit the header, guess a spelling or silently switch to a paid model. Before any request, show the mode, input UTF-8 byte count and model, then ask me to confirm sending this text to Fish. Reject empty inputs and full inputs over 5,000 UTF-8 bytes. Get the API key using getpass.getpass in a real local terminal after confirmation; fail safely if hidden entry is unavailable. Never read the key from a file or print it, headers or raw response bodies. Keep it only in process memory for this invocation.

On a successful non-empty response, save output/preview.mp3 or output/narration.mp3 using a temporary file and an atomic rename. Check status, audio or binary content type and MP3 signature; reject JSON, HTML, empty or interrupted responses. These checks do not fully decode the recording: label it “audio saved, playback review required.” Do not overwrite an existing good take without my explicit confirmation. Show safe actionable errors for 401, 402, 400/422 and 429. Do not buy credits, auto-retry a possibly accepted request, or automatically regenerate after a timeout. Remove only this run's partial file on failure.

Add test_generate_voice.py using unittest and mocked network responses. Cover the exact endpoint/header/payload, rejection of an unknown model, blank input, missing ID, key redaction, each error status, timeout, invalid audio, successful output and overwrite refusal. Tests must use an obviously fake token and perform no network calls. Run them, fix failures, and give the exact tested command.

Create README.md with the macOS/Linux and Windows preview/full commands, how to enter the key only at the local hidden prompt, how to listen to the saved files and how to replace the next script. Include .gitignore entries for .env, secrets and generated audio, but explain that ignore rules are not a security guarantee. Do not create a .env with real credentials.

Consult these current first-party sources before implementation, and report any discrepancy instead of improvising a paid fallback:
https://docs.fish.audio/api-reference/endpoint/openapi-v1/text-to-speech
https://fish.audio/blog/s2-1-pro-free-api/
https://docs.fish.audio/developer-guide/getting-started/quickstart

Finish with actual created filenames, mock test results and a clear “live synthesis not run” note. Do not claim the MP3 exists until I run the real request myself.

Voice reference ID: [paste the non-secret ID]
Approved tagged narration: [paste narration.txt from the first prompt]
Approved shot list: [paste shot-list.md from the first prompt]

The request shape above is documented in Fish's TTS reference. An omitted or unrecognised model can fall back to s2.1-pro, so exact spelling matters. The current API price table lists the free engine separately from paid S2.1 Pro at US$15 per million UTF-8 input bytes. The program's confirmation is not a billing cap; review your account's usage after the test.

  1. Run tests, then leave Claude Code. Confirm the mocked tests passed. Exit its interactive session with /exit and return to your own terminal in the same folder. The following commands go in the terminal, not the AI chat.
  2. Generate only the preview. Run python3 generate_voice.py --preview on macOS/Linux or py generate_voice.py --preview on Windows. Confirm the text upload, then paste your key at the hidden prompt. Double-click output/preview.mp3. Check the voice identity, pronunciation, naturalness and whether any direction is spoken literally.
  3. Generate the full take. If the preview works, run python3 generate_voice.py --full or py generate_voice.py --full. Listen to the entire output/narration.mp3 while reading the script. Fix skipped words or awkward pacing before using it. Keep a good take before requesting another.
Secrets are not magically safe in environment variables. This first build uses hidden terminal entry so the key is not stored in your project. It still exists in process memory while the request runs, and the program sends it to Fish for authentication. Review generated code before entering it. If a key reaches a chat, repository, recording or public log, revoke it in Fish and create a replacement.
If a request fails: 401 means check the key; 400/422 means inspect the voice ID and request format; 402 means stop and inspect model selection and account billing before any top-up; 429 means wait before trying again. After a timeout, check usage first because the request may already have been processed. Share only a sanitised status and error summary when asking Claude to debug.

finish the first video

Assemble and export in CapCut

The API makes audio, not a finished video. Use CapCut desktop's import, edit and export workflow for the last mile. Stick to your own media and features your account can export; premium effects can trigger a paid requirement.

  1. Import the parts. Choose New project → Import and add narration.mp3 plus your six visual clips or images. For a Reel or Short, use a 9:16 canvas. Put the narration on the audio track and the numbered visuals in sequence above it.
  2. Fit visuals to the actual read. Split and trim at the six narration beats in shot-list.md. Use Text to add the planned on-screen labels. Remove emotion tags from displayed words. Make sure the last visual reaches the end of the narration and the key detail stays readable on a phone.
  3. Export a local draft. Choose Export, MP4, 1080p and 30 fps, then save first-video.mp4 locally. Do not use a sharing button yet. Watch the exported file start to finish and check audio, spelling, sources and crop before approving publication.

read this first

Before you publish or repeat

Original content and rights still matter. YouTube's monetisation policies exclude mass-produced or repetitive inauthentic content. AI narration does not grant rights to someone else's clips, character or voice. Review the destination platform's synthetic-content disclosure controls when uploading, and disclose where required.
🌱 Repeat the proven part. Keep the voice configuration and program, replace narration.txt with the next approved script, and run another preview. Keep the research, judgment and final watch-through in the loop. A monthly plan helps you make decisions; it is not permission to bulk-publish unchecked output.

Your next run

Keep the first-video folder, the original source links and the approved media rights together. The important proof is your own working result: a reviewed script, a playable narration and an MP4 that teaches the promised thing.

the waitlist is now open

AI System Club is launching soon

Build AI systems with me through recorded lessons you can follow at your own pace. Join the waitlist for first access and the founding price.

btw this list gets first dibs
the moment doors open :)