Skip to main content

kara-templater

An ASS karaoke template engine rewritten in Python and C++. It runs without Aegisub or Lua.

The package keeps the karaoke templater's ASS template format, $variables, modifiers, and helper functions. Expressions inside !…! and code lines use Python. Lua code in existing templates must be rewritten manually; there is no Lua compatibility interpreter.

Installation

Requires Python 3.12 or newer. Wheels target CPython 3.12–3.14 on Linux x86-64 and Windows 10+ x64. Windows wheels bundle their native DLL dependencies. Linux wheels carry a manylinux_2_28 tag but leave native libraries dynamically linked to the host; pip does not install these OS-level dependencies. They require glibc 2.28 or newer and do not support musl-based systems such as Alpine Linux.

On Linux, install the runtime libraries before installing the package. For Arch Linux:

sudo pacman -S --needed freetype2 harfbuzz fribidi fontconfig libpng gcc-libs

For Debian or Ubuntu:

sudo apt install libfreetype6 libharfbuzz0b libfribidi0 libfontconfig1 libpng16-16 libstdc++6

Package names may vary across distribution releases. Install the fonts specified by your subtitle styles. Missing fonts use system font fallback, and different fonts can change the layout.

python -m pip install kara-templater

Build from source on Linux

Install a C/C++ toolchain and native dependencies.

Arch Linux:

sudo pacman -S --needed base-devel python python-pip autoconf automake libtool nasm \
  freetype2 harfbuzz fribidi fontconfig libpng

Debian / Ubuntu, with Python 3.12+:

sudo apt install build-essential python3-dev python3-venv autoconf automake \
  libtool nasm pkg-config libfreetype-dev libharfbuzz-dev libfribidi-dev \
  libfontconfig-dev libpng-dev

From the project directory:

python -m venv .venv
. .venv/bin/activate
python -m pip install .

Build from source on Windows

Use 64-bit Python from python.org and MSYS2. In the MSYS2 UCRT64 shell, install the native toolchain:

pacman -Syu
pacman -S --needed patch mingw-w64-ucrt-x86_64-gcc \
  mingw-w64-ucrt-x86_64-pkgconf mingw-w64-ucrt-x86_64-nasm \
  mingw-w64-ucrt-x86_64-freetype mingw-w64-ucrt-x86_64-harfbuzz \
  mingw-w64-ucrt-x86_64-fribidi

Restart the shell and complete the update if MSYS2 requests it. Then, in PowerShell at the project directory, build and install a wheel. Adjust the MSYS2 path if it is not installed at C:\msys64.

$env:Path = "C:\msys64\ucrt64\bin;C:\msys64\usr\bin;$env:Path"
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install delvewheel
python tools/collect_licenses.py
python -m pip wheel . --no-deps --wheel-dir dist
python -m delvewheel repair --strip --no-mangle libharfbuzz-0.dll --wheel-dir wheelhouse (Get-ChildItem dist\*.whl).FullName
python -m pip install --no-index --find-links wheelhouse kara-templater

The repaired wheel bundles the required DLLs so it can run without MSYS2 on the destination machine. Windows uses the system DirectWrite/GDI font provider.

Command line

kara-templater input.ass output.ass
python -m kara_templater input.ass output.ass

Try the included example from a source checkout:

kara-templater examples/karaoke.ass output.ass

To correct horizontal coordinates for the video's actual dimensions:

kara-templater input.ass output.ass --video-size 1920 1080

Templates are ASS Comment events. Put the template type and modifiers in the Effect field. For example:

  • Effect: template syl noblank
  • Text: !retime("syl")!{\an5\pos($scenter,$smiddle)\fad(50,80)}

For lyrics such as {\k50}你{\k50}好, this generates one positioned effect event per nonblank syllable.

The output preserves templates, turns processed lyrics into comments with Effect karaoke, and marks generated events with Effect fx. Running the engine again removes old fx events and regenerates them.

Python API

from kara_templater import Document, Style, apply_templates, text_extents

source = Document.load("input.ass")
result = apply_templates(source)
result.save("output.ass")

width, height, descent, external_leading = text_extents(
    Style(fontname="Noto Sans CJK SC", fontsize=48), "你好"
)

apply_templates returns a new document without modifying its input. Document.parse(text) and result.dumps() support in-memory use.

Templates

Type Behavior
template syl, or no explicit type Generate effects per syllable, including the empty syllable at index 0; usually combined with noblank
template char / template syl char Generate effects per Unicode code point, retaining syllable timing
template line Concatenate the per-syllable template into one complete effect event
template pre-line Prefix a complete event; use the same identifier to merge it with a line template
template furi Generate effects for furigana
code once / line / syl / furi Execute Python statements in that scope; defaults to once

Modifiers include all, repeat N / loop N, notext, keeptags, noblank, multi, fx NAME, and fxgroup NAME. Templates match their own style by default; all matches every style. Unknown modifiers, variables, and execution errors report the template event number instead of being silently ignored.

  • \k, \K, \kf, \ko: syllable duration in centiseconds.
  • \-NAME: inline effect name, inherited by subsequent syllables.
  • # / #: continue the preceding syllable; multi runs the template separately for each highlight.
  • 漢|かん / 漢|かん: separate base text from furigana. A furigana prefix ! starts a new group; < allows spillback to the left. Full-width prefixes are also accepted. A missing furigana style is created as STYLE-furigana at half the base font size.

Variables and execution environment

$variables are case-insensitive:

  • Line timing and indices: $lstart, $lend, $ldur, $lmid, $li, $syln.
  • Syllable timing and indices: $sstart, $send, $sdur, $skdur, $smid, $si.
  • Layout: prefix l or s to left, center, right, width, top, middle, bottom, height, x, or y.
  • Current-scope aliases: $start, $end, $dur, $kdur, $mid, $i, and unprefixed layout variables.
  • Other values: $layer, $style, $actor, $margin_l, $margin_r, $margin_v, $margin_t, $margin_b.

Expressions and code share Python variables. The environment provides math, random, meta, styles, orgline, line, syl, basesyl, j, maxj, fxgroup, and text_extents. line is the current mutable output event; in a code template it is the source lyric event. syl is a dictionary with attribute access.

Example Effect and Text pairs:

code once                  → amplitude = 12
code line                  → fxgroup["spark"] = orgline.actor == "solo"
template syl repeat 3      → !retime("syl")!{\an5\pos(!$x + amplitude * j!,$y)}

An expression returning None produces an empty string. Integral floating-point values are written without a trailing .0.

Helpers

  • retime(mode, addstart=0, addend=0): modes are syl, presyl, postsyl, line, preline, postline, start2syl, syl2end, sylpct, and set / abs. Offsets are milliseconds, except that sylpct uses percentages of syllable duration. Timing is based on the current line, so consecutive calls use the previously modified times.
  • relayer(layer), restyle(style): modify the current output event.
  • maxloop(count) / maxloops(count), loopctl(j, count): control template loops dynamically.
  • remember(name, value, decorator=None), recall(name, default=None), remember_if(name, value, condition, decorator=None): store and retrieve values. The optional decorator is a Python function mapping a name to a memory key.
  • remember_line, remember_syl, remember_basesyl: isolate remembered values by source event, current syllable, or base syllable.

Limitations and safety

  • Only process trusted subtitles. Python expressions and code have the permissions of the current process. This is not a sandbox. Template iteration and output limits cannot stop arbitrary Python code from looping forever or performing malicious operations.
  • The defaults are 10,000 iterations per template loop and 100,000 output events. The Python API accepts max_iterations and max_output_lines to change these limits.
  • Only ASS v4.00+ is supported, not legacy SSA styles. Extra fields, unknown sections, and attachments are preserved, but byte-for-byte formatting is not guaranteed.
  • Layout targets single-line karaoke using the base style. It does not simulate automatic wrapping, event collisions, inline style overrides, \pos / \move, or drawing geometry. text_extents supports \N hard breaks; syllable layout is not multiline-aware.
  • text_extents returns logical advance width, font height, and descent, not visible glyph bounds. It preserves edge spaces and measures braces literally. External leading is always 0. Pixel-identical results across fonts, platforms, or Aegisub's native font interfaces are not guaranteed.
  • No GUI, video/audio processing, Automation plugin interface, or other Aegisub features are included.

Metadata

Release files for kara-templater 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kara-templater 0.1.1
File Size Uploaded
kara_templater-0.1.1.tar.gz 391.0 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for kara-templater 0.1.1
File
kara_templater-0.1.1-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
kara_templater-0.1.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 Details
kara_templater-0.1.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
kara_templater-0.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 Details
kara_templater-0.1.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
kara_templater-0.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.24+ x86-64, Linux glibc 2.28+ x86-64 Details

Total release size: 18.3 MB

Release files / kara_templater-0.1.1.tar.gz

Download URL kara_templater-0.1.1.tar.gz
Size 391.0 kB
Tags Source
SHA-256 checksum
How to use checksums
d8183030b44576bdb099b33a52452884f5ea50e29a6ad4b86dd1f97c0efad149
BLAKE2b-256 checksum
How to use checksums
4b6cba65a9f6ac915207c77ebc704fa0b07b4bacb44e39d96c21c48932221ecb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / kara_templater-0.1.1-cp314-cp314-win_amd64.whl

Download URL kara_templater-0.1.1-cp314-cp314-win_amd64.whl
Size 5.4 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
dd753349894e84e0a9236b4827e0258a1898b020c20ad54919263dc2915e8a7c
BLAKE2b-256 checksum
How to use checksums
c3aac231c9fc07a5c69da440ca4c3366ecbb445ea52992ce2f783eef8e517beb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / kara_templater-0.1.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL kara_templater-0.1.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 695.2 kB
Tags CPython 3.14 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
726ddb4cc90c5a6cc3166c29cd3aa289c8817cfc95dbb8d97b0ea394a8f5f7af
BLAKE2b-256 checksum
How to use checksums
83fb0ec4e4127dc35f42c648b423b7fb89fcebd45af89676bf5730717dc2aeaa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / kara_templater-0.1.1-cp313-cp313-win_amd64.whl

Download URL kara_templater-0.1.1-cp313-cp313-win_amd64.whl
Size 5.2 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
34f1bfa17a3fe1ec6c89b8ad492d91b9eced8495712f88e144d58739d15dd7e3
BLAKE2b-256 checksum
How to use checksums
450e5ed92b96649f87a011e969fde385aeacf9d6d0ce7a2edc64dfb2f0b3b24d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / kara_templater-0.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL kara_templater-0.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 695.2 kB
Tags CPython 3.13 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
70ac6a8aeb6be3c37e1ff62a09b1a228e17336166dee595c6f31365957c34641
BLAKE2b-256 checksum
How to use checksums
bd4554781d7c041d6013e5223b4836365d081eeaab2bf4d1f2878c06266450a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / kara_templater-0.1.1-cp312-cp312-win_amd64.whl

Download URL kara_templater-0.1.1-cp312-cp312-win_amd64.whl
Size 5.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
3bfefd73fd75c774e110db30cccbba6598ededf48c9e27f945cdb25aacaee907
BLAKE2b-256 checksum
How to use checksums
3ec4cbd00179b9387aef6b23bd8c05c572e65066e1fc1e994ec16e34ad5e9372
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / kara_templater-0.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl

Download URL kara_templater-0.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Size 695.0 kB
Tags CPython 3.12 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
434f6baf49b1850e4a09ac4057578ff0dfafdd34d7e9729367366ec9054c9c09
BLAKE2b-256 checksum
How to use checksums
7584e255778cf2131b7cd61975898f992daa0a6e7c726a24a6a4e73a7d55023f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

7 release files

0.1.0

7 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page