When I started learning Korean, I'd try to replicate the letters exactly as I saw them in textbooks or on websites. This was before I had a teacher's guidance, so while self-teaching copying the letters I saw in my reference texts seemed to me like the best approach.
It's the equivalent of trying to learn the Latin alphabet by copying Times New Roman. It might end up looking nice and fancy, but it's woefully slow and a huge pain when your goal is communication over calligraphy.
Once I got actual guidance: first from friends, then from actual instructors at Shinheung High School (신흥고등학교) in Jeonju (전주시) — it finally clicked. People's handwriting styles are distinctly faster, more fluid, and more comfortable when writing.
There's some incredible videos online on Hangul, and many dedicated websites but I thought I'd make my own and document my own handwriting. I did notice through my own learning that there's a lot more content out there on how to read Hangul than write it, so I made these little animations showing how I write each letter. When writing Korean, always go up to down, and left to right.
A great extension to this site might be adding the sounds of each letter, but there's plenty of material on that already if you dig around online. Maybe an interactive quiz/letter training tool would be cool?
Creating the GIFs
hangul_timestamps.json
split_video_gifs.py
Not related to Korean, but I thought I had a fun way to go about it. I set up a square canvas in Procreate on my iPad, started screen recording, and wrote out each letter one by one — clearing the canvas between each — in a single take. One long video, all the letters in sequence.
After cropping out the recording to the square canvas, I needed a way to slice it up. I use QuickTime for small video edits, and DaVinci Resolve for more complex ones but this was such a rote task that it didn't seem worthwhile going through software for something that FFmpeg could handle. I went with a JSON file to define the timestamps:
{
"video_file": "hangul_procreate.mov",
"output_folder": "gifs",
"settings": {
"fps": 15,
"width": 400
},
"letters": [
{ "name": "ㄱ", "start": "0:03", "end": "0:06" },
{ "name": "ㄴ", "start": "0:07", "end": "0:10" },
...
]
}
A short Python script loops through this and calls ffmpeg for each letter. The FFmpeg command does the heavy lifting — slicing out the time range, scaling it down, and generating a GIF with a proper color palette (without this, GIFs look really crummy, you might've seen some artifacts from this on a GIF keyboard):
ffmpeg -ss {start} -i {video} -t {duration} \
-vf "fps=15,scale=400:-1:flags=lanczos,split[s0][s1];
[s0]palettegen[p];[s1][p]paletteuse" \
-loop 0 {output}.gif
The palettegen filter builds an optimized 256-color palette from the clip, and paletteuse applies it. This avoids the usual banding you get from GIFs. lanczos is a scaling algorithm that keeps edges sharp when you resize.
That was a quick aside to talk about ffmpeg, I absolutely love the software: it's ridiculously capable for being free. Video editor, format converter, audio processor, image manipulator, streaming server — all in a single free app that you can run from the command line.
Consonants (자음) — 14 basic
ㄱ — giyeok (기역) — g/k
ㄴ — nieun (니은) — n
ㄷ — digeut (디귿) — d/t
ㄹ — rieul (리을) — r/l
ㅁ — mieum (미음) — m
ㅂ — bieup (비읍) — b/p
ㅅ — siot (시옷) — s
ㅇ — ieung (이응) — ng (silent at start)
ㅈ — jieut (지읒) — j
ㅊ — chieut (치읓) — ch
ㅋ — kieuk (키읔) — k
ㅌ — tieut (티읕) — t
ㅍ — pieup (피읖) — p
ㅎ — hieut (히읗) — h