Narrator Cinema

Paste a story. Get a cinematic experience.
  • SDXL cinematic images
  • Cartesia TTS narration
  • Kevin MacLeod music
  • Real sound effects
  • Zoom-dive camera
  • 1 image per 200 words
0 words ~0 scenes
◐ Artist controls auto · natural palette
0 soft · 72 default · 100 heavy abstraction
0 B&W · 50 natural · 100 Coop/Kozik pop
◐ Use your own imagery (2x ink) off · painter chooses every scene
Upload a photo (paints the same image for every scene) or a video (extracts a frame at each scene cut, paints each one). Each scene runs through Flux img2img at fal.ai — ink charge doubles to cover the extra painter calls.
Story length0 words
Base (first 5 scenes)2 ink
Total cost2 ink
  • Analyzing text & breaking into scenes
  • Generating cinematic images (SDXL)
  • Generating narration (TTS)
  • Selecting music & sound effects
  • Building cinematic player
Watch Your Cinema
Remix Scene
current frame
\n'; } function buildReadmeMd(title, author, sceneCount){ return "# "+title+"\n\n" + "_by "+author+"_\n\n" + "This bundle contains everything you need to publish **"+title+"** to Amazon KDP, ACX (audiobook), and Draft2Digital (ebook distribution).\n\n" + "## Contents\n\n" + "- `audio/` — per-scene narration MP3s ("+sceneCount+" files) + `full_story.mp3` (concatenated for ACX upload)\n" + "- `images/` — one image per scene at original resolution\n" + "- `covers/cover_kdp_2560x1600.jpg` — Kindle-spec cover (portrait 1600×2560 or landscape 2560×1600 depending on first-scene aspect)\n" + "- `covers/cover_d2d_1600x2400.jpg` — Draft2Digital / IngramSpark portrait cover\n" + "- `manuscript.html` — single-file HTML manuscript with embedded images (uploadable to KDP and Draft2Digital)\n\n" + "## KDP (Kindle Direct Publishing)\n\n" + "1. Sign in at https://kdp.amazon.com\n" + "2. Create a new Kindle eBook.\n" + "3. For the manuscript, upload `manuscript.html`. KDP will convert it to a reflowable Kindle format automatically.\n" + "4. For the cover, upload `covers/cover_kdp_2560x1600.jpg`, or use KDP's cover creator and upload it as the background.\n" + "5. Preview thoroughly — KDP's previewer is the source of truth for layout.\n\n" + "## ACX (audiobook)\n\n" + "1. Register/sign in at https://www.acx.com\n" + "2. ACX requires each chapter to be its own MP3. Upload `audio/full_story.mp3` if your story is a single chapter (under 120 minutes), or split the per-scene files into chapters to suit your structure.\n" + "3. **Mastering warning:** Narrator currently exports at 128 kbps. ACX requires **192 kbps CBR MP3, 44.1 kHz**. Re-encode with a tool like Audacity or ffmpeg before uploading:\n" + " ```\n" + " ffmpeg -i full_story.mp3 -b:a 192k -ar 44100 full_story_acx.mp3\n" + " ```\n" + "4. **Loudness:** ACX requires RMS between −23 dB and −18 dB, peak at or below −3 dB, and noise floor below −60 dB. Run the files through Auphonic (https://auphonic.com) or the Audacity ACX check plugin before uploading.\n" + "5. **Opening credits:** Add a short spoken intro at the start of the first MP3 — `\""+title+", by "+author+". Narrated by [your voice artist credit].\"`\n" + "6. Retail audio sample (1–5 minutes) required — pick a representative chunk.\n\n" + "## Draft2Digital\n\n" + "1. Sign in at https://draft2digital.com\n" + "2. Create a new book. Upload `manuscript.html` as the manuscript.\n" + "3. Upload `covers/cover_d2d_1600x2400.jpg` as the cover.\n" + "4. D2D will distribute to Apple Books, Barnes & Noble, Kobo, Scribd, and many libraries.\n\n" + "## Notes\n\n" + "- Covers are generated from your first scene image with the title and author name overlaid. If you want something custom, replace them before uploading.\n" + "- The manuscript uses the story text you pasted into Narrator. If you edited scenes via remix, the manuscript text is unchanged — only the visuals update.\n" + "- Generated with Narrator — https://inkwell.wiki/narrator\n"; } async function exportBundle(){ if(pubBusy) return; if(!currentRunId || !currentSceneData || currentSceneData.length===0){ pubSetProgress("Generate a cinema first.","err");return; } pubBusy=true; document.getElementById("pubGoBtn").disabled=true; resetPubUi(); var wantAudio = document.getElementById("pubAudio").checked; var wantImages = document.getElementById("pubImages").checked; var wantCovers = document.getElementById("pubCovers").checked; var wantMs = document.getElementById("pubManuscript").checked; var titleInp = document.getElementById("title"); var title = (titleInp && titleInp.value.trim()) || "Untitled"; var author = (document.getElementById("pubAuthor").value || "").trim(); if(!author){ // Fallback: email local-part, title-cased. var em = (emailEl && emailEl.value || "").trim(); var lp = em.split("@")[0] || "Anonymous"; author = lp.replace(/[._-]+/g," ").replace(/\b\w/g,function(c){return c.toUpperCase();}); } var safeTitle = cleanFs(title) || "narrator"; try { pubSetProgress("Loading JSZip..."); var JSZ = await loadJSZip(); var zip = new JSZ(); var sceneCount = currentSceneData.length; // Audio files. var allMp3 = []; if(wantAudio){ pubSetProgress("Fetching narration audio (0/"+sceneCount+")..."); for(var i=0;i 0){ // Naive MP3 concat: just append the frame data. Works for same-encoder MP3s. var concat = concatBytes(allMp3); zip.file("audio/full_story.mp3", concat); } } // Images. var imgBlobs = []; // for manuscript embedding if(wantImages || wantCovers || wantMs){ pubSetProgress("Fetching scene images (0/"+sceneCount+")..."); for(var i=0;i0){ firstImg = await new Promise(function(resolve, reject){ var img=new Image(); var blob=new Blob([imgBlobs[0].bytes], {type:imgBlobs[0].mime}); var url=URL.createObjectURL(blob); img.onload=function(){ URL.revokeObjectURL(url); resolve(img); }; img.onerror=function(){ URL.revokeObjectURL(url); resolve(null); }; img.src=url; }); } var kdp = drawCover(2560, 1600, title, author, firstImg); var d2d = drawCover(1600, 2400, title, author, firstImg); var kdpBytes = await canvasToJpegBytes(kdp, 0.90); var d2dBytes = await canvasToJpegBytes(d2d, 0.90); zip.file("covers/cover_kdp_2560x1600.jpg", kdpBytes); zip.file("covers/cover_d2d_1600x2400.jpg", d2dBytes); } // Manuscript. if(wantMs){ pubSetProgress("Building manuscript..."); var storyText = (storyEl && storyEl.value) || ""; var embedImgs = imgBlobs.slice(0, Math.min(imgBlobs.length, 12)).map(function(b){ return { mime: b.mime, b64: bytesToBase64(b.bytes) }; }); var manuscript = buildManuscriptHtml(title, author, storyText, embedImgs); zip.file("manuscript.html", manuscript); } // README. zip.file("README.md", buildReadmeMd(title, author, allMp3.length || sceneCount)); pubSetProgress("Compressing ZIP..."); var blob = await zip.generateAsync({ type:"blob", compression:"DEFLATE", compressionOptions:{level:6} }); var url = URL.createObjectURL(blob); if(pubLastUrl){try{URL.revokeObjectURL(pubLastUrl);}catch(e){}} pubLastUrl = url; var dl=document.getElementById("pubDlBtn"); dl.href=url; dl.download = safeTitle + "_bundle.zip"; document.getElementById("pubDlRow").classList.add("ready"); pubSetProgress("Bundle ready: " + (blob.size/1024/1024).toFixed(2) + " MB","ok"); showToast("Publishing bundle ready","ok"); } catch(err){ pubSetProgress("Failed: " + (err && err.message || err), "err"); } finally { pubBusy=false; document.getElementById("pubGoBtn").disabled=false; } }

Buy Ink

Ink powers narrator cinema generation · 2 ink per story base + 1 per 4 extra scenes
Enter your email above first — ink is tied to your email address.
10 INK $1.00 50 INK $4.00 150 INKBest value $10.00 500 INK $25.00

Clone your voice

For the best clone: 30–45 seconds per take, in a quiet room, 6–8 inches from your mic. Read naturally, not as a performance. Warm up first; skip the first awkward line.
Hi. My name is ____ and this is a voice sample so Inkwell can narrate stories for me. Let me warm up a moment. When the story goes quiet, I soften. When it builds, I lift a little. I can whisper, and I can land a line with weight. The quick brown fox jumped over the lazy dog. She sold seashells by the seashore. Ships sail through stormy seas. Question — how was your day today? Exclamation — what a beautiful morning! And here is something gentle, the kind of line you would say late at night to someone you love. That should give the clone plenty to learn from.
0:00

Before we begin

A few questions so I read it right