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.
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.
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.
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.
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.
[calm]. Keep them sparse and remove them from display captions. Fish's emotion guide distinguishes this from S1's parentheses.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.reference_id, not the speech engine's model name and not your secret API key.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.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.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.
/exit and return to your own terminal in the same folder. The following commands go in the terminal, not the AI chat.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.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.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.
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.