Kovati Docs

Sessions and takes

The teleprompter, the ledger, and the two dials that replace two products.

Documented in depthPerformanceForge0.1.1Paid

The session asset

A session is a PS_ data asset with four kinds of field on it. It lives in project content because it references banks and should travel with the project.

GroupFieldWhat it is
SessionNotesWhat this session is for, for whoever inherits it. "EP1 pickups with Mara."
bAdHocRead-only. True when Record Selected… made it rather than a person
CreatedAtRead-only
BankPathsRead-only, asset-registry searchable — every speech bank this session's lines belong to
FixturesModeVoice Only or Voice and Video
bFaceOnlyThe camera is the point and the line's audio is out of bounds
TreatmentConvert to cast voice, or Use performance as-is
FaceBankPathWhere solves land. Empty skips the face chain entirely
DialsSave TakesWhether recordings accumulate as candidates, or the newest becomes the line
bProcessImmediatelyWhether the finisher runs at stop, or nothing spends until a take is chosen
LinesLinesThe planned lines, in performance order

BankPaths is a list, not a path, and that is deliberate. A character-centric session — all of one artist's lines — legitimately spans banks, so it appears under each of them. Being registry-searchable is what makes "which sessions cover this bank?" a query with nothing loaded, which is what keeps a session findable from the bank it serves instead of lost under a timestamp in the Content Browser.

The two treatments

TreatmentWhat happens to the performance
Convert to cast voiceSpeech-to-speech into the line's cast voice. The performance stays; the identity changes
Use performance as-isThe performer's own voice becomes the line's audio. The classic studio flow

Both graduate the line to Recorded and both keep the generated take as the reference. They differ only in which WAV is applied.

A session is two dials, not two products

The temptation was to ship "solo mode" and "production mode". Instead, a session asset carries two independent dials:

DialWhat it decides
Save takesWhether every take is kept, or latest wins
Process immediatelyWhether the finisher runs on stop, or waits for a choice

Save Takes is not about saving to disk. Every take is written to disk and its audio imported either way. The dial decides whether the recordings accumulate as candidates or whether the newest one simply becomes the line.

It matters afterwards, too: turn it on mid-session and the ledger lists everything from that point, but the takes made while it was off will not be found, because they were never written down. The panel says so where the list would otherwise read as broken.

Two actions set them for you:

  • Record Selected… auto-creates an ad-hoc session defaulted to solo behaviour: latest wins, process immediately.
  • Plan Session… creates a planned one: every take kept, nothing processed until a take is chosen.

Two dials rather than two modes means the in-between cases exist. "Keep every take and process immediately" is a real way to work — you want the result now and the options later — and a two-product design would have made it unreachable.

The teleprompter

Lines queued from elsewhere — today, the Speech Library — turn the panel into a line-by-line flow.

Stopping a take runs the finisher: convert the voice, apply it to the line, solve the video into the face clip's layer, merge and bake.

Every one of those steps is a call into a sibling plugin's toolset, invoked by name through reflection. So:

  • A missing plugin is a missing step with a reason, not a crash and not a link error.
  • The finisher works with any subset installed.
  • PerformanceForge links against none of them.

The Session page — the ledger

The panel's other page, and the one a director lives on. It is four quadrants, arranged around what a person is actually doing: the work upstairs, the facts downstairs.

An earlier single-column version put the video last and the settings behind a twirl-down, which is why neither got used. The layout below is the fix.

LeftRight
UpstairsRecorded takes — the takes of the selected lineThe take under review, playing
DownstairsPlanned lines — the jobDetails, with a Session tab and a Line tab
The Performance Capture panel on its Session page. A Session picker reads PS_20260908_235921 (loaded) with browse and Load buttons, and a line beneath: 'Queued 2 line(s) from PS_20260908_235921.' Under 'Recorded takes' with an Import take button sit two takes: T_20260909_000006, Recorded, 6.45s; and the selected T_20260909_000327, Recorded, 6.70s, marked IN USE in blue and expanded to show two voice rows - 'Original 6.70s' with a Make primary button, and 'Lily - Velvety Actress 6.73s' in blue marked PRIMARY with a drop cross. Four buttons sit under them: Re-voice, Open, Re-solve, Remove. To the right, a 'Hear with' picker reads Lily - Velvety Actress above a video pane showing a man mid-performance, with a transport reading 3.63s and 'frame 110/201'. Below left, 'Planned lines' with a Record This Line button lists DLG_Generato... Player 'I'll leave you now, it's been...' Pending, and GEN_Doric_Rule Astronaut 'Not alone, you are not. The...' Pending. Below right, a Session/Line switch with Line selected shows 'Line details': the line text, Speaker Player, Voice 'T_20260909_000327, re-voiced as Lily - Velvety Actress', Face 'not solved yet', and five navigation buttons - Show Dialogue Line, Find Speech Bank in Content Browser, Find Face Bank in Content Browser, Show in Speech Bank, Show in Face Bank.
One take expanded, and the model is visible: the performance on the outside, the voices it can be heard in inside it. Original keeps its Make primary button; the re-voiced Lily is PRIMARY and is the only one that can be dropped. IN USE, on the take, is a separate badge from PRIMARY, on the voice.

Read the transport: 3.63s frame 110/201. The review pane plays the take's own frames on their own measured timing, counted rather than interpolated from a nominal frame rate — which is what the manifest exists to make possible.

The two pages list takes from different places, and the ids show it. The Session page's Recorded takes are T_20260909_000327; the Record page's Takes are folders like PF_Player_DLG_GeneratorBriefing_Player_IllLeaveYouNow_20260909_000321.

They are not the same list. The Record page lists the capture library on disk — folders this panel wrote. The Session page asks SpeechForge for the line's take ledger, by reflection, and comes back empty without it.

That split is the design stated in the session asset's own header: take truth lives on the speech lines themselves; this asset is the plan and the fixtures, not a second copy of the takes. It is also why your takes survive not paying for this plugin.

Face reads not solved yet in that capture even though the voice is settled. That is the state the Line tab exists to surface: a take chosen and re-voiced, with no face solved from the audio that resulted. It is not an error — it is work outstanding, and it is legible at a glance instead of being discovered when the mouth does not move.

Above all four sits the session picker: every PS_ asset, with the loaded one marked (loaded) in blue in the list as well as in the closed box — because picking from a column of near-identical date-stamped names with no indication of which is already open is how the wrong session gets loaded over the right one. Choosing one loads it; Load re-loads it; the folder icon shows it in the Content Browser.

A take is a folder, and the voices live inside it

This is the part that is easiest to miss. A take row expands, and under it sits one row per voice that take can be heard in:

RowWhat it is
OriginalThe take's own recording. Always first, and it is the take — it cannot be dropped
Any othersRe-voicings of that same performance, added by Re-voice

In the capture above that reads: the performer's own 6.70s recording, and Lily - Velvety Actress at 6.73s — the same delivery in the line's cast voice, 30 milliseconds longer, which is the conversion preserving pacing rather than re-speaking the words.

Each voice row carries four controls, and the split between them is the whole design:

ControlWhat it does
"Hear this. Listening decides nothing."
Make primary"Make this the take's primary voice — the one that goes into the speech bank, and that the face is solved from, when this take is in use."
PRIMARYShown instead of the button on the voice that already is
"Drop this voice from the take. Its audio asset stays in the project." Hidden on Original

Preview and decision are deliberately different controls. Listening to a voice must never change which one the line uses — otherwise comparing two of them silently rewrites the answer.

The same reasoning gives the review pane its own Hear with picker: which voice plays over the picture is a question about listening, not about the take. Having to promote a voice in order to hear it made comparing impossible without changing the result.

PRIMARY is about the voice; IN USE is about the take. They are two different decisions, and calling both "in use" made them look like one.

What you can do to a take

ButtonWhat it does
Use this take"Make this take the line's — its voice into the speech bank, and its face re-solved from that same audio so the two cannot disagree."
Re-voice"Re-voice this performance into the line's cast voice, keeping the delivery. Another voice for this take, not another take. Billed by its duration."
Re-solve"Run the finishing pass again for this take — the face solved from its current voice, merged and baked. Nothing is re-voiced and nothing is charged for."
OpenThe take's folder — the video side lives there
RemoveDeletes the take and its folder: the video, the recording, the manifest. Refused while the line is playing its audio
Import take…"Bring an existing recording in as a take — an actor's studio WAV… It is copied into the capture library, so the take is self-contained."

Re-voice and Re-solve look alike and one of them costs money. Re-voice sends audio to a provider and is billed by duration. Re-solve runs the local face solve again and is free. If a mouth is wrong, Re-solve is almost always the one you want.

Two warnings the list can show

Save Takes is off — the list is off, not empty. Without saying so it reads as a broken panel, and the takes recorded while it was off are genuinely not there, because they were never written down.

The line is playing audio that is not from any take listed here — a latest-wins recording, or something made in the Speech Library. Saying so is the honest alternative to letting some older take keep the badge and imply otherwise.

Line details

The Line tab answers everything about the selected line in one place, and one of its three facts is the point of the whole take model:

FactValues
SpeakerFrom the line
VoiceWhich take and voice it is using
Facethis session has no face bank / not solved yet / solved from the voice in use / OUT OF STEP — solved from other audio; use a take to re-solve it

A face is solved from audio. If the clip's audio is not what the line plays, the mouth is shaped for a voice nobody will hear — the same failure as a drifted subtitle, and just as invisible. This line is the one that catches it.

Under the facts sit four navigations, one to each stage the line touches: Show Dialogue Line (the script it was harvested from), Find Speech Bank in Content Browser, Find Face Bank in Content Browser, Show in Speech Bank and Show in Face Bank.

Record This Line points the teleprompter at the selected planned line and switches to Record — which is how a director jumps from reviewing to a pickup without rebuilding the session.

Playback

Playback decodes frames one at a time into a single reused texture, on their own measured timing, with audio. That is a deliberate constraint against cache pressure — a take of a few hundred 720p JPEGs would otherwise be hundreds of megabytes of textures.

Generate Take

Adds a detached synthesis candidate to a line's ledger without touching the line.

That is the quietly important one. It means a director reviewing four recorded takes can put a synthesised option beside them, compare, and choose — without the act of generating having already changed what the game plays.

A candidate that is not chosen changes nothing. That is keep options, make choices visible as a concrete mechanism rather than a slogan.

Take folders

Forge/Library/Performance/Takes/PF_<slate>_<stamp>/

Inside: the WAV master, the JPEG frames named by media-clock ticks, and take_manifest.json written last.

The manifest being written last is the completeness protocol. A take folder without one is an interrupted recording, and nothing downstream has to guess.

The slate is the line id, so a folder name carries its whole provenance:

PF_Player_DLG_GeneratorBriefing_Player_IllLeaveYouNow_20260909_000321
   └ speaker  └ line id                             └ when

That is why the ledger can list three takes of two lines and say which is which without a database.

Session assets

PS_ assets have a factory, so double-clicking one opens the capture panel on that session rather than a generic details view.

Small thing; it is the difference between a session being a document you work in and a struct you inspect.

Settings

WhereWhat
Editor Preferences ▸ Automation Forge ▸ PerformanceForge DevicesThe device choice — per user, per machine
Project Settings ▸ Automation Forge ▸ PerformanceForgeThe take folder path

Device choice being per-machine rather than per-project is the correct tier: your microphone is not a property of the game.

On this page