Between the Words¶
What the mouth does while no sound is coming out: the pauses inside a line, the moment it ends, and the silence before the next one.
Watch someone talk and their mouth is almost never shut, and never slack. Between words it stays a little open, still shaped by what was just said. When a sentence ends it holds for a beat before it lets go. Before they speak, it is already getting ready. A mouth that drops at every gap reads as a machine switching on and off, however good the shapes in between are.
FaceCue keeps the mouth lived in through those moments. It happens on baked lines, and most of it is on by default, so most characters never need a setting touched here. The controls are on the Speech driver, in two sections named for the two kinds of silence: Intra-Speech Residual for the pauses inside a line, and Inter-Speech Postures for the time around it.
Inside a Line¶
A line is full of small silences: a breath between clauses, a pause for effect, a moment of hesitation. The mouth does not reset in each one. It keeps a trace of the shape it just made and carries it into the next word, so the line holds together as one thought.
Mode, under Intra-Speech Residual, is how much of that trace stays, from least to most:
- None lets the mouth drop through the pause.
- Fade, the default, eases the shape away.
- Hold And Fade holds it for a moment, then eases it away.
- Hold keeps it until the next word.
When the trace fades, two more things shape how it lets go. On Fade, Waypoint, under De-articulation, is where the shape settles before it fades. Spoken, the default, fades straight from the shape as it was said, and Base softens into a resting version of it first, a gentler letting go.
Under Fade, Target is where the fade ends. Neutral, the default, lets the trace go completely. Base stops at a resting version of the shape, so the mouth never quite goes slack between words.
Reference Tail (s) is how long you want the longest tail to be, the time the slowest phoneme takes to fade. FaceCue sets each phoneme's own tail from it, by its character, so a quick one lets go sooner. Lengthen it and pauses feel softer and more joined up. Shorten it and each pause reads cleaner, closer to a mouth that resets.
As a Line Ends¶
The audio stopping is not the same moment as the speaker finishing. Sustain Spoken, under Inter-Speech Postures, holds the mouth for a beat after the last word and then lets it go, so the character looks like someone who just finished talking rather than someone switched off. It is on by default.
Its Pose is how it lands. Base, the default, softens into a resting version of the last phoneme, a gentle settle. Spoken holds the last shape exactly as it was, a more literal ending.
Hold (s) and Fade (s) are how long the last shape holds, and how long it then takes to let go.
When a Line Is Cut Short¶
Sometimes a line does not get to finish. It is cut short when it loses the mouth while it is still speaking: another line starts over it, from the Audio Source, a PlayPhonemes call or a Timeline clip, or it is stopped after its first sound and before its last, by stopping the Audio Source or releasing its handle. What the mouth should do then depends on what the moment means, and from the inside a skip and two lines running into each other look the same. Each character carries its own choice. When your code knows what the next cut means, it can make the choice for that one moment.
The choice is an InterruptedLineMode:
| Value | What it does |
|---|---|
InterruptedLineMode.WindDown |
The cut-short line relaxes the way a line that finishes does. Reads as two lines genuinely running into each other |
InterruptedLineMode.Clear |
The cut-short line lets go at speaking speed, and the mouth settles where it rests between lines. Reads as a clean break, like a skipped line |
Left alone, a cut-short line winds down. That is what every character does until something says otherwise, and it is the safer of the two when nothing knows what the cut meant: a line relaxing into the next one reads as speech either way, where a clean break in the middle of a conversation reads as a glitch. So a project that never touches any of this still holds up, and the reason to reach for Clear is a cut you know is a skip.
The character's own choice is Mode, under Interruption at the foot of Inter-Speech Postures on the Speech driver. Set it where a character is cut short the same way all through a game, and leave it alone where only the moment knows, which is what the calls below are for.
One case makes the two read alike. A character that holds nothing after a line, with no sustain and no standby pose, has nothing to let go of, so both choices leave the mouth in the same place. Winding down is something to hear only when there is something still being held.
public class SkippableLine : MonoBehaviour
{
[SerializeField] SpeechDriver speech;
[SerializeField] AudioSource voice;
public void Play(AudioClip line)
{
// the player may skip this line, so a skip should read as a clean break
speech.SetNextInterruption(InterruptedLineMode.Clear);
voice.clip = line;
voice.Play();
}
}
All three are on the Speech driver:
| Member | What it does |
|---|---|
void SetNextInterruption(InterruptedLineMode mode) |
Chooses what happens to the next line cut short, in place of the character's own choice for that one time. mode is the choice: WindDown or Clear. Calling it again replaces the earlier choice |
void CancelNextInterruption() |
Takes a pending choice back, so the next line cut short follows the character's own choice again. Does nothing when none is pending |
InterruptedLineMode? NextInterruption { get; } |
The choice still waiting to be used, or null when there is none. Reads null again once the choice has been used or dropped |
When a choice is used. It belongs to the line playing when you make it, as long as that line has not yet said its last sound. Otherwise, with nothing playing or a line only trailing off, it waits for the next line to start. It is used once, if that line is cut short. It is dropped if that line finishes speaking on its own, or ends before its first sound, so a choice never waits around for some later line. A line that had already finished speaking when it was cut always winds down, whatever was chosen. A choice is also cleared when the Speech driver is disabled or its Speech Mode changes, and it only has an effect while the character speaks in Baked Phoneme.
The calls that play cues without audio take the same choice as their interruption argument, for the line that call cuts short, as Lip Sync Without Audio explains. A Timeline clip has no argument of its own: when it cuts a line short, it follows a pending choice, else the character's own.
Between Lines¶
Standby is how the mouth looks while nothing is being said, at idle and after the character speaks. On Neutral, the default, it goes back to the character's own resting face. Hold gives it a relaxed ready pose instead, like someone in a conversation rather than someone waiting to be switched on. Fade settles into that pose, then lets it go after a while.
On Fade, Hold Duration (s) is how long the ready pose stays before it starts to go, and Fade Duration (s) how long it takes to let go. A long hold keeps a character present through a long silence. A short one lets it drift back to rest sooner.
The pose is yours to author. It is the Inter-Speech Standby recipe, under Speech Postures on the Speech Channel of the Face Rig Designer. The OneClick Wizard authors it very mildly on every family, just off rest.
Make the Standby Pose Your Character's Own
Standby is off by default for a reason. How a mouth sits in silence is one of the most personal things about a face, and after the expressions it is the most subjective recipe in FaceCue. A lip that stays slightly parted, a jaw held a touch forward, a mouth pressed shut: each says something about who the character is before they say a word.
So there is no right answer to ship. Open the recipe, shape it to the character, switch Standby on, and play with it. Keep it gentle, since it is on the face whenever the character is quiet, and if it starts to read as an expression, pull it back.
Before a Line¶
In the silence just before a line, the mouth eases into a ready shape, so the character looks about to speak rather than starting from nothing. It is Prepare, and it is on by default.
Fade In (s) is how long the mouth takes to get ready, and Hold (s) how long it rests there before the first phoneme. When the silence before a line is too short for both, the rest gives way first, so a hurried line reads as a smaller setup rather than a faster one.
Waiting to Speak¶
Some silences come with a turn attached. The player is picking a reply the character will answer, or a character waits for someone else to finish before it speaks. Prepare cannot see those moments, because nothing has started playing yet. Your own code can, and Ready, under Inter-Speech Postures, is how it tells the mouth.
Call it up and the mouth settles into a ready pose and holds it, for as long as the wait lasts. When the line starts, the pose gives way to speech on its own. If the character ends up not speaking at all, release it and the mouth settles back.
Source is what the mouth holds. Last Spoken Base, the default, is a faint version of what the character last said, so the wait reads as a continuation of the conversation. Authored holds the Inter-Speech Standby recipe, the same pose Standby uses. How quickly the mouth settles in and lets go is set by Enter Duration (s) and Release Duration (s).
public class AnswerTurn : MonoBehaviour
{
[SerializeField] SpeechDriver speech;
// the player is choosing a line this character will answer
public void OnChoicesShown() => speech.FireReady();
// the conversation ended before the character spoke
public void OnConversationClosed() => speech.ReleaseReady();
}
Both are on the Speech driver:
| Member | What it does |
|---|---|
void FireReady(int visemeIndex = -1) |
Settles the mouth into the ready pose and holds it until a line starts or it is released. Leave the index out to hold what Source picks, or pass a viseme's index in the character's viseme map to hold that viseme instead |
void ReleaseReady() |
Lets a held ready pose go when no line follows |
Ready works in play, on baked lines, like everything on this page. Before a character has said anything, Last Spoken Base has nothing to hold, so it holds the authored pose instead.
They Rest on the Base Pose
The shapes the mouth keeps between words, settles into after a line, and holds on standby are softened versions of each phoneme, its base pose. Tuning a viseme's base pose in the Face Rig Designer tunes how it lingers too.