Rendering and Export - on22s/Side-Story GitHub Wiki
Render, edit, and export audio
Use Editor to turn reviewed text and voice assignments into audio. Use Result to download the finished MP3 or create other export formats.
If you have not prepared the book yet, start with Scripts and Review and Voices. For setup problems, see Installation and Troubleshooting.
Audition before a full render
Choose several representative rows: the narrator, principal characters, a long sentence, unusual names, and a line with strong emotion. Click Gen on each and listen with its audio player.
Check the actual spoken result against the text. Listen for omissions, repetition, pronunciation, unwanted sounds, pacing, and whether the speaker sounds as intended. A green done status means a generated audio result is available; it does not certify those qualities.
If a voice is wrong throughout, correct its card in Voices. If only one line needs a different delivery, edit that row. Remember that ordinary clone voices do not respond to delivery instructions in the same way as Custom and LoRA voices.
Edit individual chunks
Each Editor row has Speaker, Text, Delivery, Status, and Audio / Actions.
- Select a different Speaker from the row's list.
- Edit Text for the actual words to speak. Preserve the source unless you deliberately want a change.
- Edit Delivery for performance instructions.
- Use the expand arrow to show Pause after (ms). Blank uses the normal pause rule;
0means no extra pause after that chunk. - Use Insert line below to add an empty row with the same speaker. Supply its text before generating it.
- Use Delete line to remove a row. A brief Undo toast is available for the last deletion; do not rely on it as long-term recovery.
- Use Gen to generate or regenerate that row.
Edits save when the field changes, and generation saves the row's current fields first. Changing text, speaker, or delivery detaches the old audio from that row and returns it to pending. Regenerate before exporting. A pause-only change is applied when assembling the audio, so it does not need a new TTS performance.
If an edit reports a save failure, keep the text you entered and resolve the failure before rendering. Editor edits live in the active chunk state: Save Current in Script does not archive them. See Updates and Backups before loading another book.
Render the remaining rows
Render Pending processes non-empty chunks that are not done. It chooses the appropriate path for your TTS mode:
- Local TTS uses local batch generation for supported voices. Custom, Clone, and LoRA support local batching; Voice Design and ensemble paths render sequentially.
- External TTS uses parallel requests to the configured server or servers.
The main UI has one Render Pending control; there is no separate “Standard” versus “Batch (Fast)” choice to make.
Regenerate All re-renders all non-empty rows, including completed ones, and asks before replacing existing audio. Use it when you intentionally want a new full performance.
During rendering, Cancel requests a stop. Wait for the task to finish cancelling, then inspect the row statuses. Completed chunks remain available, and Render Pending can pick up the unfinished work. Do not start another render just because the browser lost its status connection; first check the current audio task and refreshed rows.
When a batch stops, read the counts for succeeded, failed, cancelled, and unfinished chunks. Resolve every required row before merging. Empty rows are skipped by rendering and should not be left as accidental gaps in the script.
Memory and batching
In Setup, Parallel Workers controls the outer local batch size or external concurrency. Max Items/Batch can cap local sub-batches; 0 uses the app's estimate. Auto-configure sets Parallel Workers to 4 on 12–20 GB cards (measured on an RX 9070 XT: about 23% faster than 2, same Whisper recall, passed a listening check). Start conservatively and reduce these values after an out-of-memory error.
Leave room for the LLM if it shares the GPU. Compile Codec currently has no effect: the pinned TTS library (qwen-tts 0.1.1) decodes outside the compiled code, so render speed is unchanged. Leave it off. Batch Seed applies to local batched Custom/Clone/LoRA generation; it is not a promise of identical output across every voice path or installation. Measure on your own hardware instead of assuming a throughput figure.
Review the assembled performance
Text integrity
Open Text integrity and review additions, omissions, and replacements. The check compares saved Editor text against the available source, not against the spoken contents of the audio. A saved-script JSON alone may not provide the original prose needed for comparison.
If Needs delivery review appears, inspect the affected directions. Use Retry delivery only if appropriate, then regenerate changed lines. See Scripts and Review.
Voice drift
Check Voices uses SpeechBrain/ECAPA speaker analysis to flag possible drift. SpeechBrain is included in the current app dependencies, and the app prefers its own environment. Older or custom installations may need a compatible interpreter; the configured Voice Lab interpreter is a fallback. Installing the optional native Voice Tools is not a prerequisite. If the app reports not measured, the check did not pass or fail; it was unavailable. See Troubleshooting.
Clone voices are compared with their reference clip, and LoRA voices with the adapter's reference sample. Custom, Voice Design, and ensemble voices use the speaker's earliest completed chunk as the comparison reference. For those voices, a low-drift result indicates consistency with that generated chunk, not a match to an independent recording of the intended voice.
Use flagged only to focus on reported rows, listen to them, and regenerate with Gen where needed. Checking does not regenerate anything automatically. Missing reference comparisons and unflagged rows still need sensible listening review.
Playback and pauses
Use Play Sequence to audition generated row audio in order. It is useful for checking performances and neighboring lines; it is not proof that all rows have audio or a substitute for listening to the merged result.
Merge/export uses Speaker Change Pause and Same Speaker Pause from Setup, initially 500 ms and 250 ms respectively. A row's Pause after (ms) overrides that transition. The final row does not add a trailing transition pause.
Merge the MP3
- Confirm every intended row has usable audio and the right text.
- Click Merge All.
- Read Continue with this source text?. The dialog reports either a source match, word differences, or unavailable source comparison. Cancel to fix unexpected differences, or select Continue with text only after reviewing them.
- The app opens Result. Wait for the merge outcome in Generation Logs. Cancel Merge is available while the task is active.
- Play the final result and use Download MP3.
The source confirmation is tied to the reviewed text. If the source or Editor chunks change before the merge starts, the app can refuse and ask you to review again.
Important: merge and export can produce a partial result. Missing or corrupt chunk audio is skipped, and the task result/log reports the number skipped. A downloadable file or “Done” indicator does not establish that every line is included. Check completion before exporting and investigate any skipped-chunk message.
Export a chaptered M4B
After merging, expand M4B Export Options in Result:
- Fill in Title, Author, Narrator, Year, and Description as needed.
- Optionally choose a Cover Image and wait for its upload result. Use cover art you have permission to use.
- Leave Per-chunk chapters off for automatic chapter grouping, or turn it on for a navigation marker for every rendered chunk.
- Optionally enable Require ready to require the relevant voice assignments to be marked Ready.
- Click Export M4B and wait for completion. Cancel M4B is available during the export.
M4B contains AAC audio with metadata and chapter markers. Automatic chapter detection recognizes headings such as Chapter, Part, Prologue, and Epilogue, plus some structural narrator titles. If no headings are detected, it falls back to per-chunk chapters. Inspect the chapter structure in your player rather than assuming it exactly matches the book's table of contents.
Require ready checks user-set voice readiness, not audio completeness. Use an audiobook player that supports AAC M4B files and embedded chapter markers; player behavior varies.
Export separate chapter files
Open Chapter-by-Chapter Export:
- Choose Format: MP3 or WAV.
- Set Filename template. Available fields are
{chapter_number},{chapter_name},{book_name},{series_name}, and{volume_number}. The app adds the extension. - Choose Number padding and fill in the book, series, and volume fields used by the template.
- Optionally enter a Chapters (optional) selection such as
1, 3, 5-7. Leave it blank for all chapters. - Set Per-chunk and Require ready if wanted.
- Check Changed only carefully. It is enabled initially and exports chapters whose tracked audio files or pause settings changed since the previous export. Text or delivery edits still need their affected audio regenerated first. It can reuse existing unchanged chapter files. Turn it off when you want every selected chapter written again.
- Select Preview names and inspect the filenames and number of files that would be written. Then select Export chapters.
- Download individual files from the resulting list or use Download all (zip) in this section.
Chapter export uses the same chapter-detection logic as M4B. A zero-file preview with Changed only enabled may mean there is nothing new to write. Check the existing download list, or turn Changed only off when you want to rebuild the complete selection.
Filename presets can be saved, exported, and imported with the nearby controls. They are stored in the browser, so export them if you need to move them to another browser or computer.
Export to Audacity
Choose Export to Audacity in Result. The downloaded ZIP contains:
project.lof, which imports the tracks togetherlabels.txt, with chunk annotations- One full-length WAV track per speaker, with silence where that speaker is not talking
Unzip the package, then open project.lof in Audacity. Import labels.txt through File → Import → Labels. Keep all the extracted files together so the LOF can find its tracks. Playing the aligned tracks together reconstructs the audiobook timeline, subject to any skipped-audio warning from export.
Download and keep the right files
Download All (zip) beside the main MP3 controls packages whichever main MP3 and M4B files already exist. It does not generate a missing M4B, include the Audacity package, or archive the whole project. The chapter section has its own separate ZIP.
After changing text, voices, or pauses, regenerate any affected audio and rebuild the outputs you want. A previous downloadable export may still exist, including after a cancelled or failed new export. Check the latest task outcome before treating a file as current.
Individual rendered lines live under voicelines/ using stable chunk identifiers and speaker names, not simple timeline numbers. Use Editor or chunk metadata for order. The application may retain WAV when MP3 conversion fails.
Download completed exports before loading another saved script. For preserving an editable render, follow Updates and Backups. Return to Home for the rest of the guide.
Sources
Checked against shipped main commit 8c7a33cb310ab9264594a09ca27e48271585094f: Editor and Result controls, render and export UI, export and readiness routes, voice-drift references, speaker-analysis environment, and chunk edits, pauses, chapter detection, and audio assembly.