Skip to content
acteme

Importing scripts

Bring dialogue in from the spreadsheet or dialogue tool you already use. Acteme reads CSV/TSV, JSON and Yarn Spinner, and re-importing an edited file updates only what changed.

Keys come first

Every line has a key. Keys are how Acteme matches a re-imported line to the one it already has, how file names are built, and how your runtime finds the clip. Treat them like asset GUIDs: never reuse one for a different line.

Keys may contain letters, digits and . _ : - /, up to 120 characters. The importer fixes keys it can't use and lists every change in the preview:

ReasonWhat happens
invalidUnsupported characters are cleaned up.
duplicateA key used twice in the same file gets _2, _3 …
generatedRows without a key get one from the file name and row number, such as chapter1/0001.

Generated keys work for a first import. Add real keys to your source before you import again, or changed row order will change the keys.

Importing

Press Import script in a project and drop a file, or paste its contents. You can put every imported line into an existing or new scene, and choose whether unknown character names create new characters.

The importer always shows a preview first: how many lines are new, changed and unchanged, which characters will be created, key changes and warnings. Nothing is written until you confirm.

CSV and TSV

Comma, semicolon and tab delimiters are detected automatically; .tsv files are always tab-separated. Quoted fields may contain delimiters and newlines, and a quote that doesn't wrap the whole field ("Run!" she said) is kept as text.

Header names are case-insensitive. These aliases are accepted:

FieldAccepted headers
keykey, id, line_id, lineid, string id, line (when there is also a text column)
charactercharacter, speaker, actor, char
texttext, dialogue, line_text, transcript, source, line (when there is no other text column)
stylestyle, direction, emotion, delivery
notesnotes, note, comment, context
translationany locale tag: de-DE, text_ja-JP, fr_fr, de (matched to the project's German locale)

Columns that don't match are ignored and listed in the warnings. If two columns map to the same field, the first one wins and you get a warning.

dialogue.csv
key,character,text,style,notes,de-DE
gc_alert_01,Guard Captain,Did you hear that?,,first alert bark,Hast du das gehört?
varga_wounded_01,Varga,I'm fine. <cough> It's just a scratch.,"wounded, trying to sound calm",after the ambush,Mir geht's gut. <cough> Nur ein Kratzer.

Yarn Spinner string tables

CSV string tables exported by ysc are recognized by their id, text, node and lineNumber columns. The Character: prefix in the text becomes the character, the Yarn node goes into the notes, and lines containing inline expressions are skipped with a warning.

JSON

These shapes are accepted:

  • an array of line objects;
  • an object with a lines array, or any wrapper object holding exactly one array of objects;
  • a flat map of key → text, common for existing localization tables.

Field names are flexible:

FieldAccepted names
keykey, id, lineId, line_id (numbers are fine)
texttext, dialogue, line, transcript
charactercharacter, speaker, actor
stylestyle, direction, emotion
notesnotes, context, comment

Translations go in a translations object keyed by locale, or in flat text_de-DE style fields.

[
  { "key": "gc_alert_01", "character": "Guard Captain", "text": "Did you hear that?" },
  {
    "key": "varga_wounded_01",
    "character": "Varga",
    "text": "I'm fine. <cough> It's just a scratch.",
    "style": "wounded, trying to sound calm",
    "translations": { "de-DE": "Mir geht's gut. <cough> Nur ein Kratzer." }
  }
]

Yarn Spinner

.yarn files are parsed directly:

  • Character: text lines get a character.
  • Options (->) and line-group items (=>) are imported too.
  • Commands (<<…>>), // comments and markup such as [wave] are stripped.
  • #shadow: lines are skipped, since they reuse another line's audio.
  • The #line: hashtag becomes the key, which is exactly what Yarn's localization system looks up at runtime, so audio maps to lines without an extra table.
  • An optional #style: hashtag fills the style note; dashes and underscores become spaces.
  • The node title goes into the line's notes.
ambush.yarn
title: Ambush
---
Varga: I'm fine. <cough> It's just a scratch. #line:4f2a1c #style:wounded
-> Let me see it. #line:9b7e02
<<jump Drive>>
===

Run ysc tag before importing so every line has a #line: tag; untagged lines get generated keys. Lines that contain {$variables} produce a warning: render one variant per value or leave them unvoiced.

Format detection

The format comes from the file extension (.csv, .tsv, .json, .yarn). Pasted content is sniffed: content starting with [ or { is JSON, a title: line followed by --- is Yarn, and anything else is read as CSV.

Re-importing

Re-import the same file after your writers edit it:

  • New keys are added in file order.
  • Existing keys get the new text, style and notes. If the text or style changed and the line had audio, it becomes stale.
  • Translations in the file replace the matching translations, with the same stale rule. Only languages the project already has are imported, so add languages before importing their columns.
  • Lines missing from the file are kept. Delete cut lines explicitly.