The voice-production request became more specific: once a character had been chosen, its voice should remain recognisable while the emotion changed. A later request asked for fixed characters across age and gender categories, each reading the same sentence with joy, sadness and anger.
The first question is what counts as the same voice. Repeating a description is different from reusing a reference recording. Even with matching references, someone must listen to decide whether the result sounds like the same character. I used those distinctions to read the local code and existing verification records.
Recall the same character for the next script
Combining style, age direction and emotion helps explore a new voice. To use the same character in the next script, the selected reference needs to be kept. This work added a character profile to store it.
The registration code links a reference recording and its transcript with a speaker vector, reference audio codes, the basic style, age direction and seed. The vector and audio codes are conditions supplied to subsequent synthesis. They are not a measured probability that two recordings belong to the same person.
When a saved character is selected, the current planning code uses its stored style and age. It rejects a request that simultaneously changes the mode or age. A new vocal identity belongs in a new character registration; a new performance by the selected character reuses its existing basis.
Store the reference separately from the performance
Selecting joy or anger does not overwrite the character’s reference recording or speaker data. The generation code loads the saved reference and appends the emotional direction to the fixed instructions. It checks the reference tensor hashes before and after generation and records which basis was used.
The profile loader also stops when the recording or cache file no longer matches its stored hash. A familiar name should not silently select different material. Registration refuses to overwrite an existing character name as well. These choices preserve the basis needed to compare repeated production.
The installed local implementation is experimental: it supplies emotional instructions together with fixed speaker and reference conditions to the existing Qwen3-TTS inference core. Saying that it simply reuses a seed would omit that work. Equally, matching reference conditions does not establish perfectly matching perceived timbre. The program fixes inputs; the audible result needs its own review.
Describe the performance instead of endlessly extending a list
The current modules combine 60 emotion presets with free descriptions and blended directions. A familiar feeling can use a preset; a subtle situation can be described in a sentence. An unfamiliar label need not create another character or require another hard-coded emotion.
The numbers in a blend have a defined limit too. Anger at 3 and sadness at 1 become relative emphasis values in the acting instruction. They do not measure 75% anger in the output audio. The code rejects non-finite, zero and negative weights, and the existing tests cover those distinctions.
For production, an emotion label becomes easier to assess when followed by a reading direction. Loud anger and anger held back in a low voice ask for different performances. Separating the emotion, its intensity and the intended breathing or pace also makes a correction more specific.
Keep the sentence constant for a more focused comparison
The age-category project registered 20 characters across male and female voice designs, then generated joy, sadness and anger for each using the same sentence. Its existing verification record reports 20 reference recordings, 60 emotional samples, reused fixed conditions and file checks. For this article I read that record and the checking code; I did not generate or listen to new audio.
The 60 emotion presets and 60 comparison recordings are different counts. The recordings represent three emotions for each of 20 characters. They do not establish verification of all 1,200 combinations of 20 characters and 60 presets. Age labels describe synthesis directions, rather than ages established by listening.
Using the same script avoids changing the wording and length at the same time as the performance. The example below was written independently for this article. It is neither a registered character name nor an execution command, and it has not been synthesised. It shows how instructions can change while character and wording stay fixed.
Explore the implementation
Independent writing example · no generated or reviewed audio
Keep fixed: Narrator A’s reference and the same script
Script: It is all right to stop here and rest for a while.
Calm guidance: low energy, even pace, a gentle sentence ending.
Happy but cautious: begin brightly, then ease off towards the end.
Holding back hurt: take a short breath before speaking; avoid a strong upward ending.File checks leave an audible choice to make
The existing automated checks examine whether reference files and caches remain intact, whether the expected character and emotion were recorded and whether the audio file is valid. The finaliser also checks the shared comparison script, reference hashes, recorded generation device and generation termination. It checks that the listening page links the expected files.
These checks make the comparison traceable. A file hash cannot judge natural breathing, recognisable character identity or whether an emotion feels exaggerated or too faint. The existing result documents explicitly leave perceptual timbre, age and emotional review separate.
For another production, start with a short shared sentence to choose the character and emotional direction, then listen again with the full script. Check pronunciation, pauses, emotional transitions and overall level. This is a suggested sequence; no long-script listening review was performed for this article.
Leave enough information to choose the next take
For a website introduction video or a series of spoken guides, I would want the next session to begin with more than a request for a warm voice. Record the character reference, script, emotional instructions, selected take and remaining concerns together. The implementation’s generation JSON likewise separates the character basis, emotion plan, text, effective instructions and output hash.
When revising a take, preserve the character and script first, then narrow the acting change. If the vocal identity itself is unsuitable, return to character design. Changing one emotion should not silently replace the reference voice. Keeping the previously selected result makes comparison and reversal possible.
This is a local workflow for keeping a reference while trying different performances, not a fully reviewed library of every emotion. None of the original recordings, samples or speaker data is attached. The work also does not include a voice feature on another website or a public audio demonstration.