← 강의 목록
LMS-2242 Production log
AI concept lecture video v2 — interactive player with linked review (follow-up to LMS-2241)
Deliverables
- Unit: Linear functions and graphs — Finding the equation of a linear function (the sub-unit after last lesson's "slope and y-intercept")
- Linked review: last lesson (slope, y-intercept) + Grade 7 direct proportion y = ax
- Curriculum: 2022 revised curriculum [9수02-16], understanding and applying the properties of linear function graphs. ⚠️ Matched via a secondary source; confirm against the official NCIC text
- Length: 6:24 (requirement 5–10 min ✅; excludes time paused at checkpoints)
- Voice and subtitles: Korean narration + Korean subtitles ✅
- Avatar: an original character drawn in code (male senior student). No real person's likeness ✅
- Textbook copying: none. All examples and problems are newly written ✅
Acceptance criteria check
| Criterion | Result |
|---|
| Working web player link, source code and script submitted | ✅ Link, source and script ready (attaching and sharing still to do) |
| At least 2 checkpoint problems that block playback until answered | ✅ 3 (1:44 multiple choice, 3:36 number input, 5:32 multiple choice) |
| Section timing 5% / 90% / 5% | ✅ Measured 4.8% / 90.4% / 4.8% |
| Speed control keeps audio and subtitles in sync | ✅ Tested at 0.75×, 1×, 1.25×, 1.5×, 2× (see below) |
| Zero math errors, confirmed by a Korean reviewer | ⏳ Automated check passes — Korean reviewer needed |
| Tools, prompts, time and cost documented, compared with LMS-2241 | ✅ This document |
| No copied textbook content, no real person's likeness | ✅ |
Lesson structure
Section shares are computed from the measured narration. The 2 s intro counts toward the review and the 4 s outro toward the summary.
| Section | Content | Length | Share |
|---|
| Opening (linked review) | Last lesson's y = ax + b; Grade 7 direct proportion y = 2x → y = 2x + 2 | 18.4 s | 4.8% |
| Main (concept + checkpoints) | ① slope and y-intercept ② slope and one point (parallel lines) ③ two points (x- and y-intercepts), 3 checkpoints, comparing the three methods and checking answers | 346.2 s | 90.4% |
| Closing (key summary) | The three cases recapped, next lesson preview | 18.5 s | 4.8% |
Interactive features and test results
Each was checked by running the player in a browser.
| Feature | Behavior | Test result |
|---|
| Checkpoint stop | Stops exactly at the problem and shows the question card | ✅ Stopped exactly at 1:44 and 3:36, audio silent |
| Skip blocking | Space bar, progress-bar click and play button are all blocked | ✅ All three stayed at 1:44 |
| Instant feedback | Correct → explanation / wrong → hint / 2 wrong → answer and explanation revealed | ✅ All three cases confirmed |
| Number-input problem | Typed number; the "−" sign used in the subtitles is also accepted | ✅ "2" → hint, "−2" → correct |
| Continue | Resumes into the solution narration | ✅ (confirmed after fixing one bug) |
| Speed control | 0.75×–2× buttons | ✅ 2×: 9 s of video in 4.2 s; 0.75×: 6 s of video in 8 s |
| Audio/subtitle sync | Subtitles and mouth follow the frame, so they match at any speed | ✅ At 2×, the subtitle matched the playing narration in 6 of 6 samples; pitch preserved |
| Mobile | No sideways scrolling at 375 px | ✅ (subtitles inside the video look small on phones) |
CEO feedback, round 2
| Feedback | Cause | Fix |
|---|
| "No sound for the first 1–2 seconds" | Each line's audio file was only loaded when that line started, so its first syllables were lost while it loaded | Each voice's narration and chimes are mixed into one continuous track, loaded once (scripts/lesson-track.ts). First syllables play; checkpoint stop/resume stays in sync (stopped at 106.6 s → after resume audio 109.5 s / video 1:50) |
| "A bright, high-pitched female instructor voice" | — | Full narration added in ko-KR-SunHiNeural, rate +10%, pitch +15%. Its ~1 s stall after a mid-sentence "!" is fixed by reading it as a comma. Length 6:34, split 4.9% / 90.4% / 4.8% |
| (added) Avatar and theme selector | — | Presenter buttons above the player (male senior = Hyunsu / female teacher = SunHi with the teacher avatar) and theme buttons (classic, chalkboard, night, pastel). Changing voice restarts the lesson; changing theme keeps the position |
Tools
| Step | Tool | Notes |
|---|
| Script, lesson data, avatar, player code | Claude Code (Claude Opus 5.5) | All AI-written |
| Voice | Microsoft Edge neural TTS, ko-KR-HyunsuMultilingualNeural, rate +10%, pitch +4% | Picked from 3 samples |
| Lip sync | ffmpeg extracts voice loudness → avatar mouth shapes | |
| Lesson engine | Remotion 4.0.535 + @remotion/player | Draws the lesson straight from its JSON |
| Web player | React 19, Vite 6.3.5 | Checkpoints, feedback, speed control |
| Hosting | Claude Artifact (private link) | For the pilot |
| Math check | Custom checker scripts/lesson-check.mjs | Verifies every example, point, slope and answer by calculation |
Prompts
User → Claude Code prompts (verbatim, in order):
Currently I have an in progress related to the continuation of this ticket, please retrieve that ticket and analyze it. → LMS-2242 analysis
Go with your recommended defaults: topic = 일차함수의 식 구하기, review = 지난 시간 기울기·y절편 + 중1 정비례, host as a private Artifact link first, keep the illustrated avatar restyled as a friendly senior. Start with the lesson JSON template and script. → lesson template and script
Yes, generate 2-3 short voice samples of the friendly-senior persona (different Edge voices or settings) so I can pick one. → 3 voice samples
Use C (Hyunsu, young male senior) for the lesson. → voice chosen
Yes, restyle the avatar as a young male senior student to match the Hyunsu voice, then generate the full narration. → avatar and full narration
Yes, build the interactive web player: checkpoints that block playback, instant feedback, 0.75x-2.0x speed control with synced subtitles, using the new avatar and narration. → web player
Yes, publish the player as a private Artifact link. → published
- CEO feedback relayed: no sound for the first 1–2 s, a bright high-pitched female instructor voice, plus
I think let's add an avatar and theme selector? → continuous track, SunHi voice, presenter and theme selectors
Time
| Step | Time |
|---|
| Ticket analysis, choosing defaults | ~5 min |
| Lesson template and script, automated math check, section balancing | ~20 min |
| 3 voice samples | ~3 min |
| Avatar + full narration (44 clips) | ~10 min |
| Lesson engine + web player | ~12 min |
| Browser testing, 2 bug fixes | ~5 min |
| Publishing | ~3 min |
| Total | ~1 h (excluding time waiting on user replies) |
Cost
| Item | Cost |
|---|
| TTS (Edge neural TTS) | ₩0 |
| Remotion · @remotion/player (free license for small teams*) | ₩0 |
| React, Vite, ffmpeg, fonts | ₩0 |
| Hosting (Claude Artifact) | Within existing subscription |
| Claude Code usage | Within existing subscription (no extra charge) |
| Total | ₩0 extra |
* Remotion is free for companies with 3 or fewer employees; larger companies need a company license. The same applies to the player (@remotion/player).
Comparison with LMS-2241
| LMS-2241 (v1) | LMS-2242 (v2) |
|---|
| Deliverable | MP4 video | Web player (link) |
| Unit | Linear functions and graphs — slope and y-intercept | Finding the equation of a linear function (next sub-unit) |
| Length | 4:27 | 6:24 |
| Structure | Intro, explanation, summary (no ratio target) | Linked review 5% / main 90% / key summary 5% (measured 4.8 / 90.4 / 4.8) |
| Linked review | None | Last lesson + Grade 7 direct proportion |
| Learner participation | None (watch only) | 3 checkpoints that block playback; correct / hint / explanation feedback |
| Speed control | None (depends on the video player) | 0.75×–2× with audio and subtitles in sync |
| Voice | SunHi (female), polite teacher, rate −4% | Hyunsu (male), casual senior, rate +10% |
| Avatar | Female teacher | Male senior student (hoodie) |
| Lesson content format | Each scene written as code | JSON template; a new lesson is a new JSON file |
| Math check | Checked by AI by eye | Checker script verifies every example, point and answer by calculation |
| Time | First Korean video ~30 min (~3 h 10 min with variants) | ~1 h (including the player) |
| Cost | ₩0 extra | ₩0 extra |
| Making the next lesson | Write new scene code | Write JSON → lesson-check → lesson-tts → build (engine and player reused) |
Math check (automated check passes — Korean reviewer needed)
Result of node scripts/lesson-check.mjs lessons/linear-function-equation/lesson.ko.json:
- Slope 3, y-intercept −2 → y = 3x − 2 ✔
- Graph through (0, −1), right 1 / up 2 → y = 2x − 1 ✔
- Checkpoint 1: slope −2, y-intercept 5 → y = −2x + 5 ✔
- Slope 2 through (1, 5) → y = 2x + 3 ✔
- Slope −3 through (2, −1) → y = −3x + 5 ✔
- Parallel to y = 3x through (2, 1) → y = 3x − 5 ✔
- Checkpoint 2: slope 3 through (2, 4) → b = −2 ✔
- Through (1, 3) and (3, 7) → y = 2x + 1 ✔
- Through (−1, 4) and (1, 0) → y = −2x + 2 ✔
- x-intercept 2, y-intercept 4 → y = −2x + 4 ✔
- Checkpoint 3: through (−1, 1) and (2, 7) → y = 2x + 3 ✔ (each of the 3 wrong choices misses at least one of the points)
- Every point on a graph lies on a drawn line, and every run/rise label matches the actual coordinate difference ✔
Open items