From 2020-06-03
So you want to do hand-drawn animation on Linux and/or entirely with Free Open Source Software, and that animation involves lip syncing? Well, here's some notes as I work on my first decent sized animation in Synfig/Krita/Kdenlive and I get my pipeline ready to go for smooth production work on future animation.
fontconfig
errors and the UI will look weird. Errors mentioning unknown element
.
Lots of them. This happens to me in Krita as well on another machine when
run via AppImage, though this did not fix Krita on that machine.
The solution is to
run the AppImage and provide the system fontconfig libraries via LD_PRELOAD.
The exact line I had to use is:
bash
LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libfontconfig.so:/usr/lib/x86_64-linux-gnu/libfreetype.so" \
Downloads/SynfigStudio-1.3.14-testing-2020.04.30-linux64-b2662.appimage
Hunt down those two libraries in /usr/lib
and replace the paths with
what you have and the fonts will look all pretty and stuff.
Or build Synfig from source and you won't have this issue.
.sif
export is not well supported, even for things like
rectangles. Synfig also doesn't seem to like Inkscape SVG files.
This is fine, as I'm doing titling in Kdenlive and only importing
hand-drawn bitmaps from Krita into Synfig.Which means you'll, at most, need art for: AI, O, E, U, L, WQ, MBP, FV, etc, rest
from PyQt5.QtWidgets import QFileDialog from krita import Krita KID = Krita.instance().activeDocument() active = KID.activeNode() file, _ = QFileDialog.getOpenFileName(None, "Create phoneme layers for Papagayo file", "", "Papagayo File (*.pgo)") # rest is the default when a frame doesn't have a specified phoneme phonemes = ["rest"] with open(file) as f: for line in f: line = line.rstrip() if line.startswith("\t\t\t\t"): _, phoneme = line.split(" ") if not(phoneme in phonemes): phonemes.append(phoneme) for name in phonemes: layer = KID.createGroupLayer(name) active.addChildNode(layer, None) for artName in ["Pencils", "Colors", "Shading", "Inks"]: artLayer = KID.createNode(artName, "paintlayer") if artName == "Shading": artLayer.setBlendingMode("multiply") layer.addChildNode(artLayer, None)
All in all, the process was pretty decent. It took some time to figure out the Synfig way of doing things, but once I got that, the actual pipeline of Krita → Synfig → Kdenlive was very smooth. Expect something way more substantial describing the process in the coming months.