# Consistent Voiceover for Training Videos: Keep One Narrator Across 40 Modules

Published: October 22, 2026 · Author: Govind Kumar

Consistent voiceover for training videos comes from three locked choices: one voice, one set of settings (speed, volume, emotion) and one script style, applied to every module. Generate one audio file per slide, and when content changes, regenerate only the changed lines, not the module.

*Last updated: October 16, 2026. Plan allowances come from kveeky.com/pricing.md, read on that date.*

<div style="margin:28px 0;padding:20px 22px;background:var(--kv-blue-50);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-md);min-width:0;box-sizing:border-box;overflow-wrap:anywhere;border-left:4px solid var(--kv-blue-700)"><div style="font:700 17px/1.3 var(--kv-font-heading);color:var(--kv-blue-950);margin-bottom:8px">Quick answer</div><p style="margin:0;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)">Write a one-page voice spec sheet before module 1: voice, transcript language, speed, volume, emotion, pronunciation list. Reuse it for all 40 modules, save a reference clip, and normalize loudness after export. Use the picker and calculator below for your own course.</p></div>

This guide is for instructional designers and L&amp;D teams who maintain a training library over many months, with several authors. You'll get a spec sheet to copy, a drift diagnosis table, a rule for what to regenerate after each kind of change and a calculator for the rebuild budget. [Kveeky](https://kveeky.com) is the example tool, and its limits are stated where they matter. **Disclosure: Kveeky makes an AI voice generator.**

## Why does narration drift across a training course?

Narration drifts when small choices are made per module instead of per course: a different voice, a nudged speed slider, a term pronounced two ways or files exported at different loudness. Listeners hear the seams long before they can name them.

Human recording drifts for the same reasons, plus the studio, the microphone and the narrator's mood on the day. AI narration removes the performer from the equation, but not the choices around it. Settings still get changed, and scripts still get written by five people.

Use the table to find the cause of the drift you hear, then filter by where the fix lives.

<div style="margin:28px 0;padding:20px 22px;background:var(--kv-white);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-md);min-width:0;box-sizing:border-box;overflow-wrap:anywhere"><div style="font:700 17px/1.3 var(--kv-font-heading);color:var(--kv-blue-950);margin-bottom:8px">Drift diagnosis table</div><p style="margin:0 0 12px;font:400 15px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Tap a group to filter the causes.</p><div role="group" aria-label="Filter drift causes" style="display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px"><button type="button" class="cvf-b" aria-pressed="false" data-f="all" style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">All</button><button type="button" class="cvf-b" aria-pressed="false" data-f="voice" style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">Voice and settings</button><button type="button" class="cvf-b" aria-pressed="false" data-f="script" style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">Script</button><button type="button" class="cvf-b" aria-pressed="false" data-f="audio" style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">Audio files</button></div><div style="overflow-x:auto"><table id="cvf-t" style="min-width:480px"><thead><tr><th style="white-space:nowrap">Cause</th><th>What listeners notice</th><th>Fix</th></tr></thead><tbody><tr data-cat="voice"><td style="white-space:nowrap">Different voices in different modules</td><td>Learners wonder if the course was stitched together</td><td>Name one voice in the spec sheet; never choose per module</td></tr><tr data-cat="voice"><td style="white-space:nowrap">Speed or emotion changed between sessions</td><td>Module 12 sounds rushed next to module 3</td><td>Write down speed, volume and emotion; reset to the same values each session</td></tr><tr data-cat="script"><td style="white-space:nowrap">Names and jargon said two ways</td><td>The product name changes pronunciation between slides</td><td>One say-it-as list for the whole course; edit it before generating</td></tr><tr data-cat="script"><td style="white-space:nowrap">Terminology differs between authors</td><td>A feature is a dashboard in one module and a console in the next</td><td>One glossary; search it before you generate</td></tr><tr data-cat="script"><td style="white-space:nowrap">Slides generated in long blocks</td><td>Pacing and pauses differ from one block to the next</td><td>One file per slide, similar length, same punctuation style</td></tr><tr data-cat="audio"><td style="white-space:nowrap">Loudness differs between files</td><td>Learners keep touching the volume control</td><td>Normalize every file to one loudness target after export</td></tr><tr data-cat="voice"><td style="white-space:nowrap">Voice replaced mid-project</td><td>New modules sound slightly different from old ones</td><td>Keep reference clips; regenerate all if you must switch</td></tr><tr data-cat="audio"><td style="white-space:nowrap">Different export format or sample rate</td><td>Some files sound duller or fail to import</td><td>Download every file the same way and keep one audio format</td></tr></tbody></table></div></div>
<script>(function(){try{var bs=document.querySelectorAll(".cvf-b"),t=document.getElementById("cvf-t");if(!t||!bs.length)return;function go(f){var r=t.querySelectorAll("tbody tr");for(var i=0;i<r.length;i++){r[i].style.display=(f==="all"||r[i].getAttribute("data-cat")===f)?"":"none"}for(var j=0;j<bs.length;j++){var on=bs[j].getAttribute("data-f")===f;bs[j].setAttribute("aria-pressed",on?"true":"false");bs[j].style.background=on?"var(--kv-blue-700)":"var(--kv-white)";bs[j].style.color=on?"var(--kv-white)":"var(--kv-blue-700)"}}for(var k=0;k<bs.length;k++){bs[k].addEventListener("click",function(){go(this.getAttribute("data-f"))})}go("all")}catch(e){}})();</script>

## What should a course voice spec sheet contain?

A voice spec sheet is a one-page record of every choice that shapes how the narrator sounds, so any author can reproduce it. It is the most useful consistency tool, because it replaces memory with a file.

In the Kveeky editor the settings are the voice, Transcript Language, Speed (default 1x), Volume (default 100%), Emotion (Neutral, Happy, Love, Angry, Calm or Sad) and Custom Punctuation. There is no pitch control, so leave pitch out of your sheet. Most compliance and process courses can stay on Neutral for every module.

<figure style="margin:28px 0;padding:0"><img src="/blog/product/app-text-to-speech.webp" alt="The Kveeky text-to-speech editor with a script in the text box and the Settings panel showing Voice, Transcript Language, Speed, Volume, Emotion and Custom Punctuation." width="1150" height="850" loading="lazy" decoding="async" style="display:block;width:100%;height:auto;border-radius:var(--kv-radius-md);border:1px solid var(--kv-blue-100)"><figcaption style="margin-top:10px;font:400 14px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Every control on the Settings panel is a line in your spec sheet. Record the voice, Transcript Language, Speed, Volume and Emotion values, and keep pronunciation notes for the Custom Punctuation field.</figcaption></figure>

<div style="margin:28px 0;padding:20px 22px;background:var(--kv-blue-50);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-md);min-width:0;box-sizing:border-box;overflow-wrap:anywhere"><div style="font:700 17px/1.3 var(--kv-font-heading);color:var(--kv-blue-950);margin-bottom:8px">Copy this voice spec sheet</div><p style="margin:0 0 12px;font:400 15px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Fill it in once, store it with the course files, and paste it into every new module brief.</p><div id="cvs-t" data-copytext="COURSE VOICE SPEC&#10;Course: ____&#10;Voice: ____ (name exactly as shown in the voice list)&#10;Transcript Language: ____&#10;Speed: 1x (change only by team decision)&#10;Volume: 100%&#10;Emotion: Neutral&#10;Custom Punctuation / say-it-as list: ____&#10;Words per minute for scripts: 150 (130 for technical slides)&#10;File rule: one file per slide, named M##-S## (example M12-S04)&#10;Loudness target after export: ____ LUFS, same for every file&#10;Reference clip: ____ (module 1, slide 1, 30 seconds)&#10;Approved by / date: ____" style="padding:14px 16px;background:var(--kv-white);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)">Course: ____<br>Voice: ____ (name exactly as shown in the voice list)<br>Transcript Language: ____<br>Speed: 1x (change only by team decision)<br>Volume: 100%<br>Emotion: Neutral<br>Custom Punctuation / say-it-as list: ____<br>Words per minute for scripts: 150 (130 for technical slides)<br>File rule: one file per slide, named M##-S## (example M12-S04)<br>Loudness target after export: ____ LUFS, same for every file<br>Reference clip: ____ (module 1, slide 1, 30 seconds)<br>Approved by / date: ____</div><div style="display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-top:12px"><button type="button" id="cvs-b" style="min-height:44px;padding:0 18px;border:0;border-radius:var(--kv-radius-sm);background:var(--kv-blue-700);color:var(--kv-white);font:600 16px/1 var(--kv-font-body);cursor:pointer">Copy</button></div></div>
<script>(function(){try{var b=document.getElementById("cvs-b"),t=document.getElementById("cvs-t");if(!b||!t)return;b.addEventListener("click",function(){try{var x=t.getAttribute("data-copytext");if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(x).then(function(){b.textContent="Copied";setTimeout(function(){b.textContent="Copy"},1800)},function(){})}else{var r=document.createRange();r.selectNodeContents(t);var s=window.getSelection();s.removeAllRanges();s.addRange(r)}}catch(e){}})}catch(e){}})();</script>

## How do you generate 40 modules so they match?

Generate slide by slide, in the same order, from the spec sheet, and compare each new module's first file with your reference clip. Consistency is mostly process, so a repeatable routine beats careful listening on day one.

1. **Write the glossary and say-it-as list first.** Expected result: every product name, acronym and person has one spelling for the narrator.
2. **Test the voice on your hardest slide.** Pick the slide with jargon, numbers and a list. Expected result: a 30-second clip you'd happily hear 200 times. Save it as the reference clip.
3. **Fill in the spec sheet and freeze it.** Expected result: a dated file that every author can open.
4. **Draft all scripts at the same pace.** At 150 words per minute a 5-minute module is about 750 words. Our [guide to AI voiceover scripts](https://kveeky.com/blog/ai-voiceover-script) covers writing for the ear.
5. **Generate one file per slide, named by slide ID.** Expected result: `M12-S04` style names, so a fix replaces exactly one file.
6. **Listen to each module's first and last file next to the reference clip.** Expected result: same voice, same speed, same level.
7. **Export every file the same way, then normalize loudness once.** Expected result: no learner reaches for the volume control between modules.

On loudness, the European Broadcasting Union recommends an average programme loudness of -23 LUFS in its R 128 recommendation (retrieved 2026-10-16). That is a broadcast reference. For training, the key rule is the same target for every file, whichever number your platform or house style sets.

<div style="margin:28px 0;padding:20px 22px;background:var(--kv-white);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-md);min-width:0;box-sizing:border-box;overflow-wrap:anywhere"><div style="font:700 17px/1.3 var(--kv-font-heading);color:var(--kv-blue-950);margin-bottom:8px">Production checklist for each module</div><p style="margin:0 0 12px;font:400 15px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Tick as you go. Your ticks are saved in this browser only.</p><label style="display:flex;align-items:flex-start;gap:12px;min-height:44px;padding:8px 0;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800);cursor:pointer"><input type="checkbox" class="cvk-c" style="width:22px;height:22px;margin-top:2px;flex:none;accent-color:var(--kv-blue-700)"><span><strong>Spec sheet opened,</strong> and the voice, language, speed, volume and emotion match it.</span></label><label style="display:flex;align-items:flex-start;gap:12px;min-height:44px;padding:8px 0;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800);cursor:pointer"><input type="checkbox" class="cvk-c" style="width:22px;height:22px;margin-top:2px;flex:none;accent-color:var(--kv-blue-700)"><span><strong>Say-it-as list applied:</strong> new names or terms are added to the master list first.</span></label><label style="display:flex;align-items:flex-start;gap:12px;min-height:44px;padding:8px 0;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800);cursor:pointer"><input type="checkbox" class="cvk-c" style="width:22px;height:22px;margin-top:2px;flex:none;accent-color:var(--kv-blue-700)"><span><strong>One file per slide,</strong> named with the slide ID.</span></label><label style="display:flex;align-items:flex-start;gap:12px;min-height:44px;padding:8px 0;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800);cursor:pointer"><input type="checkbox" class="cvk-c" style="width:22px;height:22px;margin-top:2px;flex:none;accent-color:var(--kv-blue-700)"><span><strong>First and last file compared</strong> with the reference clip from module 1.</span></label><label style="display:flex;align-items:flex-start;gap:12px;min-height:44px;padding:8px 0;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800);cursor:pointer"><input type="checkbox" class="cvk-c" style="width:22px;height:22px;margin-top:2px;flex:none;accent-color:var(--kv-blue-700)"><span><strong>Loudness normalized</strong> to the course target, the same as every other module.</span></label><label style="display:flex;align-items:flex-start;gap:12px;min-height:44px;padding:8px 0;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800);cursor:pointer"><input type="checkbox" class="cvk-c" style="width:22px;height:22px;margin-top:2px;flex:none;accent-color:var(--kv-blue-700)"><span><strong>Captions match the final audio,</strong> not the earlier draft.</span></label><div id="cvk-o" style="margin-top:10px;font:600 15px/1.4 var(--kv-font-body);color:var(--kv-blue-950)" aria-live="polite"></div></div>
<script>(function(){try{var c=document.querySelectorAll(".cvk-c"),o=document.getElementById("cvk-o");if(!c.length||!o)return;var key="kv-cv-check";var saved=[];try{saved=JSON.parse(localStorage.getItem(key)||"[]")}catch(e){}function upd(){var n=0,a=[];for(var i=0;i<c.length;i++){a.push(c[i].checked);if(c[i].checked)n++}o.textContent=n+" of "+c.length+" done";try{localStorage.setItem(key,JSON.stringify(a))}catch(e){}}for(var i=0;i<c.length;i++){if(saved[i])c[i].checked=true;c[i].addEventListener("change",upd)}upd()}catch(e){}})();</script>

### How Kveeky helps

[Kveeky](https://kveeky.com) lets you choose a voice from its library, set the language, speed, volume and emotion, generate the speech and download the audio, which is all the routine above needs. Search the library by language and gender, preview each voice, and note whether it is tagged FREE or PRO before you commit the course to it.

<figure style="margin:28px 0;padding:0"><img src="/blog/product/app-voice-library.webp" alt="The Kveeky voice library with search, gender and language filters, and voice cards with preview buttons and FREE or PRO tags." width="1150" height="850" loading="lazy" decoding="async" style="display:block;width:100%;height:auto;border-radius:var(--kv-radius-md);border:1px solid var(--kv-blue-100)"><figcaption style="margin-top:10px;font:400 14px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Use the filters to shortlist voices, play the preview on each, and write the winner's exact name into the spec sheet. Browse the full catalog on the <a href="https://kveeky.com/ai-voices" style="color:var(--kv-blue-700)">AI voices page</a>.</figcaption></figure>

Kveeky's limits are worth knowing: there is no pitch control, and the app does not enforce your course settings for you, so the spec sheet and file naming are your safeguards. The free plan (500 credits a month, about 40 seconds, no credit card) is for testing voices. For voice cloning, check the [pricing page](https://kveeky.com/pricing) for what each plan includes.

## What do you regenerate when content changes?

Regenerate the smallest unit that contains the change, using the unchanged voice and settings. For most edits that is one slide file, not a module and never the course.

<div style="margin:28px 0;padding:20px 22px;background:var(--kv-blue-50);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-md);min-width:0;box-sizing:border-box;overflow-wrap:anywhere"><div style="font:700 17px/1.3 var(--kv-font-heading);color:var(--kv-blue-950);margin-bottom:8px">What changed? Pick one</div><p style="margin:0 0 12px;font:400 15px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Tap the change you are facing for the smallest safe fix.</p><div role="group" aria-label="What changed in the course" style="display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px"><button type="button" class="cvp-b" aria-pressed="false" data-a="Regenerate only that line (or that slide), with the same voice and settings. Replace the single file and leave the other 39 modules alone." style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">A sentence changed</button><button type="button" class="cvp-b" aria-pressed="false" data-a="Search the script sheet for the old term, edit each row, and regenerate only rows that contain it. Update the say-it-as list first so every new file pronounces it the same way." style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">A product or UI term changed everywhere</button><button type="button" class="cvp-b" aria-pressed="false" data-a="Fix it once in the say-it-as list, respell it in the script, and regenerate only the rows that contain that word. Add it to the master list so module 41 gets it right." style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">A word is mispronounced</button><button type="button" class="cvp-b" aria-pressed="false" data-a="Open the voice spec sheet, copy the voice, language, speed, volume and emotion exactly, and generate the new module slide by slide. Compare its first slide with the reference clip from module 1." style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">A new module is added</button><button type="button" class="cvp-b" aria-pressed="false" data-a="Treat it as a rebuild, not an edit. A voice swap changes every file, so decide once, test on your hardest slide, and regenerate the whole course in one pass." style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">You want a different voice</button><button type="button" class="cvp-b" aria-pressed="false" data-a="Keep your reference clips and the spec sheet. Pick the closest replacement by ear against the clip, then regenerate the whole course so no module is left on the old voice." style="min-height:44px;padding:8px 14px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);background:var(--kv-white);color:var(--kv-blue-700);font:600 15px/1.3 var(--kv-font-body);cursor:pointer">A voice is renamed or removed</button></div><div id="cvp-o" aria-live="polite" style="padding:14px 16px;background:var(--kv-white);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)">Select a change above.</div></div>
<script>(function(){try{var bs=document.querySelectorAll(".cvp-b"),o=document.getElementById("cvp-o");if(!bs.length||!o)return;for(var i=0;i<bs.length;i++){bs[i].addEventListener("click",function(){for(var j=0;j<bs.length;j++){bs[j].setAttribute("aria-pressed","false");bs[j].style.background="var(--kv-white)";bs[j].style.color="var(--kv-blue-700)"}this.setAttribute("aria-pressed","true");this.style.background="var(--kv-blue-700)";this.style.color="var(--kv-white)";o.textContent=this.getAttribute("data-a")})}}catch(e){}})();</script>

The exception is a voice change: a new voice means regenerating everything, because even a close match is audible when learners move from module 7 to module 8. Mixing narrators on purpose is a different decision, covered in our post on [when to use different narrators in one course](https://kveeky.com/blog/multi-voice-courses-narrator-strategy).

## How much does a 40-module rebuild cost?

A 40-module course of 5-minute modules is 200 finished minutes, and with a 50% allowance for retakes you generate about 300 minutes. On Kveeky's monthly plans that is 3 months of Basic or 2 months of Premium, and later updates are small.

The calculator uses the plan allowances from kveeky.com/pricing.md (retrieved 2026-10-16). Change the numbers to match your course.

<div style="margin:28px 0;padding:20px 22px;background:var(--kv-blue-50);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-md);min-width:0;box-sizing:border-box;overflow-wrap:anywhere"><div style="font:700 17px/1.3 var(--kv-font-heading);color:var(--kv-blue-950);margin-bottom:8px">Rebuild and update calculator</div><p style="margin:0 0 12px;font:400 15px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Allowances per month: Free about 40 seconds, Basic 100 at $9, Pro 133 at $19.99, Premium 200 at $29, Business 1,000 at $99, monthly billing. The free plan is 500 credits.</p><div style="display:flex;flex-wrap:wrap;gap:12px;margin-bottom:14px"><label for="cvc-m" style="display:flex;flex-direction:column;gap:4px;flex:1 1 150px;min-width:0;font:600 14px/1.3 var(--kv-font-body);color:var(--kv-gray-800)">Modules<input id="cvc-m" type="number" inputmode="numeric" min="1" step="1" value="40" style="box-sizing:border-box;width:100%;min-width:0;min-height:44px;padding:0 12px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1 var(--kv-font-body);color:var(--kv-gray-800);background:var(--kv-white)"></label><label for="cvc-l" style="display:flex;flex-direction:column;gap:4px;flex:1 1 150px;min-width:0;font:600 14px/1.3 var(--kv-font-body);color:var(--kv-gray-800)">Minutes per module<input id="cvc-l" type="number" inputmode="decimal" min="1" step="0.5" value="5" style="box-sizing:border-box;width:100%;min-width:0;min-height:44px;padding:0 12px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1 var(--kv-font-body);color:var(--kv-gray-800);background:var(--kv-white)"></label><label for="cvc-w" style="display:flex;flex-direction:column;gap:4px;flex:1 1 150px;min-width:0;font:600 14px/1.3 var(--kv-font-body);color:var(--kv-gray-800)">Words per minute<input id="cvc-w" type="number" inputmode="numeric" min="50" step="10" value="150" style="box-sizing:border-box;width:100%;min-width:0;min-height:44px;padding:0 12px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1 var(--kv-font-body);color:var(--kv-gray-800);background:var(--kv-white)"></label><label for="cvc-r" style="display:flex;flex-direction:column;gap:4px;flex:1 1 150px;min-width:0;font:600 14px/1.3 var(--kv-font-body);color:var(--kv-gray-800)">Retake allowance (%)<input id="cvc-r" type="number" inputmode="numeric" min="0" step="10" value="50" style="box-sizing:border-box;width:100%;min-width:0;min-height:44px;padding:0 12px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1 var(--kv-font-body);color:var(--kv-gray-800);background:var(--kv-white)"></label><label for="cvc-c" style="display:flex;flex-direction:column;gap:4px;flex:1 1 150px;min-width:0;font:600 14px/1.3 var(--kv-font-body);color:var(--kv-gray-800)">Lines changed per update (%)<input id="cvc-c" type="number" inputmode="decimal" min="0" step="1" value="8" style="box-sizing:border-box;width:100%;min-width:0;min-height:44px;padding:0 12px;border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1 var(--kv-font-body);color:var(--kv-gray-800);background:var(--kv-white)"></label></div><div id="cvc-o" aria-live="polite" style="padding:14px 16px;background:var(--kv-white);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-sm);font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)"></div></div>
<script>(function(){try{var ids=["m","l","w","r","c"],e={};for(var i=0;i<ids.length;i++){e[ids[i]]=document.getElementById("cvc-"+ids[i]);if(!e[ids[i]])return}var o=document.getElementById("cvc-o");if(!o)return;var P=[["Free",0.67,0],["Basic",100,9],["Pro",133,19.99],["Premium",200,29],["Business",1000,99]];function n(k){var v=parseFloat(e[k].value);return isFinite(v)&&v>=0?v:0}function calc(){var fin=n("m")*n("l"),words=Math.round(fin*n("w")),build=fin*(1+n("r")/100),upd=fin*n("c")/100*(1+n("r")/100);var best=null,rows="";for(var i=1;i<P.length;i++){var mo=Math.max(1,Math.ceil(build/P[i][1])),cost=mo*P[i][2];rows+="<li>"+P[i][0]+": "+mo+" month"+(mo>1?"s":"")+", $"+cost.toFixed(2)+"</li>";if(!best||cost<best[1])best=[P[i][0],cost,mo]}var fit="none of the plans";for(var j=0;j<P.length;j++){if(P[j][1]>=upd){fit=P[j][0];break}}o.innerHTML="<strong>Finished audio:</strong> "+fin.toFixed(0)+" minutes, about "+words.toLocaleString("en-US")+" words.<br><strong>First build, with retakes:</strong> about "+build.toFixed(0)+" minutes of generation.<ul style=\"margin:8px 0;padding-left:20px\">"+rows+"</ul><strong>Cheapest first build:</strong> "+(best?best[0]+", $"+best[1].toFixed(2)+" over "+best[2]+" month(s)":"n/a")+".<br><strong>Each update:</strong> about "+upd.toFixed(1)+" minutes of generation, which fits in one month of "+fit+"."}for(var i2=0;i2<ids.length;i2++){e[ids[i2]].addEventListener("input",calc)}calc()}catch(x){}})();</script>

### Worked example: 40 modules with quarterly policy updates

At the defaults, the course is 200 finished minutes and about 30,000 words. The cheapest first build is 3 months of Basic at $27, or 2 months of Premium at $58 if you want it done sooner. An update touching 8% of lines is about 24 minutes of generation, which any paid plan covers in one month.

<table>
<thead>
<tr><th style="white-space:nowrap">Item</th><th>Number</th><th>How it is worked out</th></tr>
</thead>
<tbody>
<tr><td style="white-space:nowrap">Finished audio</td><td>200 minutes</td><td>40 modules x 5 minutes</td></tr>
<tr><td style="white-space:nowrap">Script words</td><td>30,000</td><td>200 minutes x 150 words</td></tr>
<tr><td style="white-space:nowrap">Generation with retakes</td><td>300 minutes</td><td>200 x 1.5</td></tr>
<tr><td style="white-space:nowrap">Quarterly update (8%)</td><td>about 24 minutes</td><td>200 x 0.08 x 1.5</td></tr>
<tr><td style="white-space:nowrap">Free plan test</td><td>about 40 seconds a month</td><td>500 credits, about 13 slides at 75 words</td></tr>
</tbody>
</table>

The 50% retake allowance and the 8% change rate are planning assumptions, not measurements. For general per-video pricing, see [AI voiceover cost per video](https://kveeky.com/blog/ai-voiceover-cost-per-video), and use the [words to minutes calculator](https://kveeky.com/resources/words-to-minutes-calculator) for any script.

## How do you check consistency before you publish?

Compare a sample from the first, middle and last module with your reference clip, at normal speed and on the same headphones. Three samples catch most drift for about 10 minutes of listening.

<div style="margin:28px 0;padding:20px 22px;background:var(--kv-white);border:1px solid var(--kv-blue-100);border-radius:var(--kv-radius-md);min-width:0;box-sizing:border-box;overflow-wrap:anywhere"><div style="font:700 17px/1.3 var(--kv-font-heading);color:var(--kv-blue-950);margin-bottom:8px">Show me</div><p style="margin:0 0 12px;font:400 15px/1.5 var(--kv-font-body);color:var(--kv-gray-600)">Open what you need.</p><details style="border-top:1px solid var(--kv-blue-100);padding:10px 0"><summary style="min-height:44px;display:flex;align-items:center;cursor:pointer;font:600 16px/1.4 var(--kv-font-body);color:var(--kv-blue-950)">What if two authors both generate audio?</summary><div style="padding:4px 0 8px;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)">Give both the same spec sheet and the same say-it-as list, and name files by slide ID so a duplicate is obvious. One person should own the reference clip and approve each module's first and last file.</div></details><details style="border-top:1px solid var(--kv-blue-100);padding:10px 0"><summary style="min-height:44px;display:flex;align-items:center;cursor:pointer;font:600 16px/1.4 var(--kv-font-body);color:var(--kv-blue-950)">How do I stop a narrator sounding flat in a long course?</summary><div style="padding:4px 0 8px;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)">Vary the script, not the voice: shorter sentences, a question every few slides, a different slide layout. Changing speed or emotion per module recreates the drift you are avoiding. Our guide on <a href="https://kveeky.com/blog/how-to-make-your-ai-voiceover-sound-less-robotic-in-5-minutes" style="color:var(--kv-blue-700)">making AI voiceover sound less robotic</a> has line-level fixes.</div></details><details style="border-top:1px solid var(--kv-blue-100);padding:10px 0"><summary style="min-height:44px;display:flex;align-items:center;cursor:pointer;font:600 16px/1.4 var(--kv-font-body);color:var(--kv-blue-950)">Is narration really why learners drop out?</summary><div style="padding:4px 0 8px;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)">It is one of several reasons. Read <a href="https://kveeky.com/blog/course-narration-quality-and-dropouts" style="color:var(--kv-blue-700)">why students drop off your course</a> before deciding whether narration is your real problem.</div></details><details style="border-top:1px solid var(--kv-blue-100);padding:10px 0"><summary style="min-height:44px;display:flex;align-items:center;cursor:pointer;font:600 16px/1.4 var(--kv-font-body);color:var(--kv-blue-950)">What about a course in several languages?</summary><div style="padding:4px 0 8px;font:400 16px/1.6 var(--kv-font-body);color:var(--kv-gray-800)">Keep one spec sheet per language, with the same speed, volume and emotion values and a voice chosen for each language. Check the <a href="https://kveeky.com/languages" style="color:var(--kv-blue-700)">Kveeky language pages</a> for which languages have voices.</div></details></div>

For the wider course workflow, including captions and accessibility, read the [e-learning voiceover guide](https://kveeky.com/blog/e-learning-voiceover-guide).

**Keep reading:** [E-learning voiceover guide](/blog/e-learning-voiceover-guide) · [AI voiceover scripts](/blog/ai-voiceover-script) · [Multi-voice courses](/blog/multi-voice-courses-narrator-strategy) · [Why students drop off your course](/blog/course-narration-quality-and-dropouts) · [AI voiceover cost per video](/blog/ai-voiceover-cost-per-video) · [Less robotic AI voiceover](/blog/how-to-make-your-ai-voiceover-sound-less-robotic-in-5-minutes) · [Kveeky pricing](https://kveeky.com/pricing)

## Frequently asked questions

### How do you keep the same voice across a whole training course?

Choose one voice, language, speed, volume and emotion setting, write them in a spec sheet, and use the same values for every module. Generate slide by slide and keep a reference clip to compare new files against.

### Can you change one line of narration without redoing the whole module?

Yes, if you generate one file per slide. Edit the script row, regenerate that one file with the same voice and settings, and replace it in your authoring tool.

### What loudness should training video narration be?

Pick one target and apply it to every file. The European Broadcasting Union recommends an average programme loudness of -23 LUFS for broadcast, which is a sensible reference if your platform has no stricter rule.

### How many words is a 5-minute training module?

About 750 words at 150 words per minute, or 650 at 130. A 40-module course of 5-minute modules is about 30,000 words at 150.

### Will AI narration sound the same next year?

Not guaranteed. Vendors can change or retire voices, so save reference clips and your settings. If a voice changes noticeably, regenerate the whole course in one pass instead of mixing old and new files.

### Can the free plan narrate a 40-module course?

No. The free plan gives 500 credits a month, about 40 seconds, which is enough to test voices on a few slides. A 40-module course needs a paid plan, and paid plans include commercial usage rights.

## How we checked this guide

This guide is written by Govind Kumar for the [Kveeky](https://kveeky.com) team. **Disclosure: Kveeky makes an AI voice generator.** No Kveeky usage data is used here. We did not run listening tests, so we make no claim about how any voice sounds.

- Kveeky plans, minutes and commercial rights wording: [kveeky.com/pricing.md](https://kveeky.com/pricing.md), retrieved 2026-10-16.
- Kveeky editor settings: observed in the app on 2026-10-15 (voice, Transcript Language, Speed, Volume, Emotion, Custom Punctuation; no pitch control).
- Loudness reference: -23 LUFS average programme loudness, [EBU R 128](https://tech.ebu.ch/publications/r128), retrieved 2026-10-16. We did not confirm the current tolerance and don't quote it.
- 150 words per minute average speaking rate: as used on our words to minutes calculator.
- The 130 wpm slow pace, the 50% retake allowance and the 8% update rate are our planning assumptions.

Your next step: write the spec sheet today, then paste the hardest slide of module 1 into [Kveeky](https://kveeky.com/voiceover/training-videos/) to record your reference clip before you generate anything else.

<script type="application/ld+json">
{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "How do you keep the same voice across a whole training course?", "acceptedAnswer": {"@type": "Answer", "text": "Choose one voice, language, speed, volume and emotion setting, write them in a spec sheet, and use the same values for every module. Generate slide by slide and keep a reference clip to compare new files against."}}, {"@type": "Question", "name": "Can you change one line of narration without redoing the whole module?", "acceptedAnswer": {"@type": "Answer", "text": "Yes, if you generate one file per slide. Edit the script row, regenerate that one file with the same voice and settings, and replace it in your authoring tool."}}, {"@type": "Question", "name": "What loudness should training video narration be?", "acceptedAnswer": {"@type": "Answer", "text": "Pick one target and apply it to every file. The European Broadcasting Union recommends an average programme loudness of -23 LUFS for broadcast, which is a sensible reference if your platform has no stricter rule."}}, {"@type": "Question", "name": "How many words is a 5-minute training module?", "acceptedAnswer": {"@type": "Answer", "text": "About 750 words at 150 words per minute, or 650 at 130. A 40-module course of 5-minute modules is about 30,000 words at 150."}}, {"@type": "Question", "name": "Will AI narration sound the same next year?", "acceptedAnswer": {"@type": "Answer", "text": "Not guaranteed. Vendors can change or retire voices, so save reference clips and your settings. If a voice changes noticeably, regenerate the whole course in one pass instead of mixing old and new files."}}, {"@type": "Question", "name": "Can the free plan narrate a 40-module course?", "acceptedAnswer": {"@type": "Answer", "text": "No. The free plan gives 500 credits a month, about 40 seconds, which is enough to test voices on a few slides. A 40-module course needs a paid plan, and paid plans include commercial usage rights."}}]}
</script>
