diff --git a/.gitignore b/.gitignore index 61f8300..47ef5b6 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,8 @@ demo/*.mp4 demo/*.wav demo/*.srt demo/narration.txt + +# 다만 제출용 최종본 한 벌은 커밋한다 — 툴체인 없이도 바로 볼 수 있도록. +# 다시 렌더할 때마다 커밋하지 말 것 (1MB 바이너리가 이력에 계속 쌓인다). +!demo/xazz_demo.mp4 +!demo/xazz_demo.srt diff --git a/demo/README.md b/demo/README.md index e11eabe..8a47b31 100644 --- a/demo/README.md +++ b/demo/README.md @@ -10,16 +10,20 @@ ## 결과물 -| 파일 | 내용 | -|---|---| -| `xazz_demo.mp4` | 시연 영상 · 1920×1080 · 2분 45초 · 한국어 자막 새겨짐 | -| `xazz_demo.srt` | 자막 파일 (영상과 동일 타임코드, 30컷) | -| `narration.wav` | 나레이션 음성 (`make_voice.py` 가 생성) | -| `xazz_demo_voiced.mp4` | 음성까지 입힌 최종본 | -| `narration.txt` | 나레이션 평문 — 다른 TTS 에 붙여 넣는 용도 | -| `narration.json` | 대본 + 컷별 노출 시간 (타임라인의 원본) | - -생성물은 `.gitignore` 로 제외돼 있다 — 아래 명령이면 언제든 다시 만들어진다. +| 파일 | 내용 | 커밋 | +|---|---|---| +| `xazz_demo.mp4` | 시연 영상 · 1920×1080 · 2분 45초 · 한국어 자막 새겨짐 | ✅ | +| `xazz_demo.srt` | 자막 파일 (영상과 동일 타임코드, 30컷) | ✅ | +| `narration.json` | 대본 + 컷별 노출 시간 (타임라인의 원본) | ✅ | +| `narration.wav` | 나레이션 음성 (`make_voice.py` 가 생성) | — | +| `xazz_demo_voiced.mp4` | **음성까지 입힌 제출용 최종본** | — | +| `narration.txt` | 나레이션 평문 — 다른 TTS 에 붙여 넣는 용도 | — | + +영상과 자막은 툴체인(Rust·Playwright·ffmpeg) 없이도 바로 볼 수 있도록 한 벌 커밋해 뒀다. +나머지는 `.gitignore` 로 제외돼 있고, 아래 명령이면 언제든 다시 만들어진다. + +> 다시 렌더했다고 해서 `xazz_demo.mp4` 를 매번 커밋하지는 말 것 — +> 1MB 바이너리가 이력에 계속 쌓인다. 대본이나 화면이 실제로 바뀌었을 때만 갱신한다. --- diff --git a/demo/xazz_demo.mp4 b/demo/xazz_demo.mp4 new file mode 100644 index 0000000..21956b6 Binary files /dev/null and b/demo/xazz_demo.mp4 differ diff --git a/demo/xazz_demo.srt b/demo/xazz_demo.srt new file mode 100644 index 0000000..a794193 --- /dev/null +++ b/demo/xazz_demo.srt @@ -0,0 +1,119 @@ +1 +00:00:00,000 --> 00:00:04,300 +Xazz는 파이썬의 생산성은 그대로 두고, + +2 +00:00:04,300 --> 00:00:10,300 +대규모 데이터 처리의 세 가지 문제를 컴파일러가 해결합니다. + +3 +00:00:10,300 --> 00:00:16,000 +런타임 타입 에러, GPU 자원 낭비, 보안 검증 부재. + +4 +00:00:16,000 --> 00:00:21,500 +Rust 기반 AI 파이프라인 DSL, Xazz입니다. + +5 +00:00:21,500 --> 00:00:28,200 +겉모습은 스크립트지만, 실행 전에 컴파일러가 먼저 코드를 읽습니다. + +6 +00:00:28,200 --> 00:00:34,700 +선언되지 않은 컬럼, 타입 불일치, 널 안전성을 전부 잡아냅니다. + +7 +00:00:34,700 --> 00:00:41,500 +학습을 30분 돌린 뒤에 터지는 오류를, 0.1초 만에 잡는 겁니다. + +8 +00:00:41,500 --> 00:00:45,700 +핵심은 이게 진짜 컴파일러라는 점입니다. + +9 +00:00:45,700 --> 00:00:53,900 +이 스크립트가 Polars와 Burn 연산을 담은 실제 Rust 소스로 변환됩니다. + +10 +00:00:53,900 --> 00:00:58,900 +렉서부터 코드 생성기까지 전부 직접 구현했습니다. + +11 +00:00:58,900 --> 00:01:02,400 +실제 파이프라인을 돌려보겠습니다. + +12 +00:01:02,400 --> 00:01:09,100 +서울 공기질 데이터를 Polars LazyFrame으로 전처리하고, + +13 +00:01:09,100 --> 00:01:14,600 +결측치를 채운 뒤 자치구별 평균 미세먼지를 집계합니다. + +14 +00:01:14,600 --> 00:01:18,400 +선언한 그대로, 한 번에 실행됩니다. + +15 +00:01:18,400 --> 00:01:21,600 +여기서 한 걸음 더 나갑니다. + +16 +00:01:21,600 --> 00:01:30,600 +model 블록으로 신경망을 선언하고, train 한 줄로 Burn 엔진이 학습을 돌립니다. + +17 +00:01:30,600 --> 00:01:34,800 +에포크마다 손실이 줄어드는 게 보이시죠. + +18 +00:01:34,800 --> 00:01:41,100 +전처리 결과가 텐서로 그대로 넘어갑니다. 중간 파일이 없습니다. + +19 +00:01:41,100 --> 00:01:45,100 +그리고 이번에 새로 들어간 부분입니다. + +20 +00:01:45,100 --> 00:01:51,300 +환자 데이터에서 이름과 환자번호를 그대로 조회하는 코드입니다. + +21 +00:01:51,300 --> 00:01:57,800 +실행하면, 차단됩니다. Polars 엔진에 닿기도 전에 멈춥니다. + +22 +00:01:57,800 --> 00:02:04,500 +무엇이 왜 막혔는지, 어떤 법 조항에 근거했는지까지 함께 나옵니다. + +23 +00:02:04,500 --> 00:02:07,300 +차단으로 끝나지 않습니다. + +24 +00:02:07,300 --> 00:02:10,800 +안전한 대체 코드를 만들어 주고, + +25 +00:02:10,800 --> 00:02:17,800 +그 코드를 같은 정책 엔진으로 다시 검사해서 통과한 것만 보여 줍니다. + +26 +00:02:17,800 --> 00:02:22,800 +통계를 낼 때는 차등 프라이버시 노이즈를 주입해, + +27 +00:02:22,800 --> 00:02:28,100 +집계값만으로 특정 개인을 역추적할 수 없게 만듭니다. + +28 +00:02:28,100 --> 00:02:35,400 +사용한 프라이버시 예산과 실행 이력은 SHA-256 감사 로그로 남습니다. + +29 +00:02:35,400 --> 00:02:39,200 +전처리부터 딥러닝, 그리고 보안까지. + +30 +00:02:39,200 --> 00:02:44,700 +스크립트 한 장으로 끝나는 파이프라인, Xazz입니다.