Notesoop-STT-Ko-v2
Notesoop-STT-Ko-v2๋ ๋ ธํธ์ฒ(Notesoop)์ด ๊ฐ๋ฐํ ์ฐจ์ธ๋ ํ๊ตญ์ด ์จ๋๋ฐ์ด์ค ์์ฑ์ธ์(ASR) ๋ชจ๋ธ์ ๋๋ค. ๊ธฐ์กด Notesoop-STT-Ko-v1์ ๋ํญ ๋ฐ์ ยทํ์ฅํ ๋ชจ๋ธ์ด๋ฉฐ, Apple Silicon(PyTorch MPS), NVIDIA CUDA GPU, ๋ฉํฐ์ฝ์ด CPU์์ ๋ชจ๋ ๊ณ ์ ์ถ๋ก ์ด ๊ฐ๋ฅํฉ๋๋ค.
Google EmbeddingGemma-2์ ์ค๋์ค ์ธ์ฝ๋ ํํ(MRL 256์ฐจ์) ์์ ๊ฒฝ๋ Conformer ์ํฅ ๋ฆฌ๋, 2,048 BPE ์ด๊ตฌ๋ฉด ์ฝ์ฌ์ธ CTC ํค๋, ์๋ธ๋ฐ๋ฆฌ์ด(< 1ms) ๋ค์ดํฐ๋ธ C++17 ๋น ์์น์ 5-Gram KenLM ์ธ์ด ๋์ฝ๋๋ฅผ ๊ฒฐํฉํ ๋น์๊ธฐํ๊ท(Non-Autoregressive) ๋จ์ผ ํจ์ค ์ํคํ
์ฒ์
๋๋ค.
V1์ด ๋ํ ์ ๊ณต ๊ฐ์์ ํนํ๋์ด ์์๋ค๋ฉด, V2๋ 300GB ๊ฐ์ ์์ฑ์ 230GB ์์ ๋ํ ์์ฑ์ ๋ํ ์ด 530GB ์ฝํผ์ค๋ก ํ์ตํ์ฌ ๊ฐ์๋ฟ ์๋๋ผ ์ผ์ ๋ํ, ์ธํฐ๋ทฐ, ํ์ ๋ฑ ์ผ๋ฐ ํ๊ตญ์ด ์์ฑ ์ ๋ฐ์์ ์ ํ๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ํฌ๊ฒ ๋์์ต๋๋ค.
ํต์ฌ ์ฑ๊ณผ
Apple M1 Pro 16GB, PyTorch MPS ์ค์ธก ๊ธฐ์ค
์ค์ ๊ฐ์ (41๋ถ 43์ด, Field Test)
| ์งํ | ๊ฒฐ๊ณผ | Whisper-large-v3 ๋๋น |
|---|---|---|
| ์ฒ๋ฆฌ ์๊ฐ | 59.3์ด (42.2๋ฐฐ์, RTF 0.0237) | 11.9๋ฐฐ ๋น ๋ฆ |
| CER | 21.19% | 4.36%p ๋ฎ์ |
| VRAM | 1.4GB | 4.5๋ฐฐ ์ ์ |
ํ์ค ๋ฒค์น๋งํฌ (Zeroth-Korean, V1 โ V2)
| ์งํ | V1 | V2 | ๊ฐ์ |
|---|---|---|---|
| CER | 15.88% | 10.47% | -5.41%p |
| WER | 45.28% | 35.07% | -10.21%p |
| ์ถ๋ก ์๋ | 20.3x | 28.5x | +40.4% |
| Host RAM | 2,639MB | 1,405MB | -46.7% |
๐ ์ปค์คํ Apple Metal Compute Shader ํ์ต ์์ง, Zero-Disk 530GB ์คํธ๋ฆฌ๋ฐ ํ์ดํ๋ผ์ธ, ์์ ๋ถ์์ TECHNICAL_REPORT_v2.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ชฉ์ฐจ
- Background & Design Goals
- Model Specifications
- What's New in V2
- Benchmark
- Quickstart
- Repository Structure
- License & Citation
Background & Design Goals
๋ ธํธ์ฒ์ "ํ์ต์ ๋นํจ์จ์ ์ค์ฌ, ์ฌ์ฉ์๊ฐ ๋๊ตฌ๊ฐ ์๋ ๋ฐฐ์์ ์ง์คํ ์ ์๋ ๊ฒฝํ์ ๋ง๋ ๋ค" ๋ ๋ฏธ์ ์๋ ์จ๋๋ฐ์ด์ค AI ์์ฑ ๊ธฐ์ ์ ์ฐ๊ตฌํ๊ณ ์์ต๋๋ค. V1์ด ๊ธด ๊ฐ์์์์ ์จ๋๋ฐ์ด์ค ๊ณ ์ ์ ์ฌ ๊ฐ๋ฅ์ฑ์ ์ ์ฆํ๋ค๋ฉด, V2๋ ๋ค์ํ ๋ฐํ ํ๊ฒฝ๊ณผ ํ๋์จ์ด์์ ์์ ์ ์ผ๋ก ๋์ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ๋ฒ์ฉ ํ๊ตญ์ด ์ธ์๋ ฅ (General Domain ASR): ์ ์ ๋ ๊ฐ์ยท๋ฐํ๋ฟ ์๋๋ผ ์ผ์ ๋ํ, ๋น ๋ฅธ ๋ฐํ, ์ถ์์, ์ธํฐ๋ทฐ ๋ฑ ๋น์ ํ ๊ตฌ์ด์ฒด์์๋ ๋์ ์ ํ๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ค์ง์ ์ธ ์จ๋๋ฐ์ด์ค ์๋ (Non-Autoregressive Efficiency): ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ตฌ์กฐ์ GPU-CPU ๋น๋๊ธฐ ํ์ดํ๋ผ์ธ์ผ๋ก ๊ธด ์ค๋์ค๋ ์ค์๊ฐ ๋๋น ์์ญ ๋ฐฐ ๋น ๋ฅด๊ฒ ์ ์ฌํฉ๋๋ค.
- ์ด๊ฒฝ๋ ๋ฆฌ์์ค (Low Memory Footprint): ์ฝ
1.3~1.4GB์ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฌ์ฉํ๋ฏ๋ก ๊ธฐ๋ณธํ ๋งฅ๋ถ(8GB/16GB)๊ณผ ๋ชจ๋ฐ์ผยท์ฃ์ง ํ๊ฒฝ์์๋ PDF ์ด๋ยทํ๊ธฐ ์ฑ๊ณผ ํจ๊ป ์พ์ ํ๊ฒ ๋์ํฉ๋๋ค. - ํฌ๋ก์คํ๋ซํผ & ์คํ ์ํ๊ณ: Apple MPS, NVIDIA CUDA(
bfloat16), CPU ๋ฐฑ์๋์ macOS/Linux/Windows์ฉ C++ ๋น ์์น ๋น๋๋ฅผ ์ง์ํ๋ฉฐ, ๋ชจ๋ธ ๊ฐ์ค์น์ ์ถ๋ก ์์ง ์ ์ฒด๋ฅผ Apache-2.0 ๋ผ์ด์ ์ค๋ก ๊ณต๊ฐํฉ๋๋ค.
Model Specifications
16kHz Mono Audio
โโโถ 128-Bin Log-Mel (20ms Win / 10ms Hop)
โโโถ Frozen EmbeddingGemma-2 Backbone (MRL 256-dim, L2-Norm)
โโโถ 10-Layer Conformer Reader (d=384, h=6, k=15)
โโโถ Spherical Cosine CTC Head (2,048 BPE)
โโโถ C++17 Rolling-Hash Beam Search (< 1ms) + 5-Gram KenLM (80.2MB)
โโโถ Overlap Deduplication & Clean Transcript
| ํญ๋ชฉ | ์์ธ ์ฌ์ |
|---|---|
| Model Name | Notesoop-STT-Ko-v2 (์ ๊ท ๋ชจ๋ธ) |
| Audio Backbone | google/embeddinggemma-2 (Frozen, 16kHz Mono, 128-Mel, MRL 256-dim) |
| Acoustic Reader | ๊ฒฝ๋ ํ๊ตญ์ด Conformer Reader (10-Layer, 34.3M params, d=384, h=6, k=15) |
| Vocabulary / Tokenizer | 2,048 BPE SentencePiece (ko_bpe_2048.model) |
| Language Rescoring | KenLM 5-Gram ํ๊ตญ์ด ์ธ์ด ๋ชจ๋ธ (320๋ง ๋ฌธ์ฅ, 80.2MB) |
| Beam Search Engine | Native C++17 Rolling-Hash CTC Beam Search (< 1ms / chunk, Python Fallback ์ง์) |
| Supported Backends | PyTorch MPS (bfloat16), NVIDIA CUDA (bfloat16), Multi-core CPU |
| Training Data | ์ด 530GB (AI Hub ๊ฐ์ ์์ฑ 300GB + ์์ ๋ํ ์์ฑ 230GB) |
| Domain Coverage | ์ ๊ณต ๊ฐ์, ํ์ ๋ฐํ, ์ผ์ ๋ํ, ์ธํฐ๋ทฐ, ํ์ ๋ฑ |
| License | Apache-2.0 |
ํ๋ผ๋ฏธํฐ ๊ตฌ์ฑ
๋ฐฐํฌ ์ฒดํฌํฌ์ธํธ (checkpoints/NoteSoop_stt_v2_best.pt, 133MB)
| ๋ชจ๋ | ํ๋ผ๋ฏธํฐ |
|---|---|
AudioToVectorReader |
34.3M (34,281,601) |
CosineCTCHead |
0.53M (526,594) |
| ํฉ๊ณ (ํ์ต ํ๋ผ๋ฏธํฐ) | 34.8M (34,808,195) |
- BatchNorm ํต๊ณ ๋ฒํผ๋ฅผ ํฌํจํ
state_dict๋34,815,875์์์ ๋๋ค.
๋๊ฒฐ ๋ฐฑ๋ณธ (google/embeddinggemma-2, ํน์ง ์ถ์ถ ๋จ๊ณ์์ MRL 256์ฐจ์ ํํ ์ถ์ถ)
| ๋ชจ๋ | ํ๋ผ๋ฏธํฐ |
|---|---|
audio_tower |
304.8M |
embed_audio |
0.8M |
language_model |
271.0M |
| ํฉ๊ณ | 576.6M (576,613,664) |
- ๋ฏธ์ฌ์ฉ
embed_vision(0.39M) ํฌํจ ์ 577.0M์ ๋๋ค.
What's New in V2
| ๊ตฌ๋ถ | Notesoop-STT-Ko-v1 | Notesoop-STT-Ko-v2 (New) | ํต์ฌ ๊ฐ์ ํจ๊ณผ |
|---|---|---|---|
| ํ์ต ์ฝํผ์ค | ์ฝ 300GB (๊ฐ์ ์์ฑ) | ์ด 530GB (๊ฐ์ 300GB + ์์ ๋ํ 230GB) | ๊ตฌ์ด์ฒดยท์ผ์ ๋ํ ๋ฐ ์ฆํฅ ๋ฐํ ๋์ ๊ฐํ |
| ํ ํฌ๋์ด์ | 25,000 ํํ์ยท์์ ์ฌ์ | 2,048 SentencePiece BPE | ์ถ๋ ฅ ์ฐจ์ 12.2๋ฐฐ ์ถ์, OOV ๋์๋ ฅ ํฅ์, RAM 47% ์ ๊ฐ |
| ์ธ์ด ๋ชจ๋ธ | KenLM 3-Gram (82.7MB) | KenLM 5-Gram (320๋ง ๋ฌธ์ฅ, 80.2MB) | ์ฅ๊ฑฐ๋ฆฌ ์กฐ์ฌยท์ด๋ฏธ ํธ์ ๋ฐ ๋์ด์ฐ๊ธฐ ์ ํ๋ ํฅ์ |
| ๋น ์์น / ๋ณํฉ | ๊ธฐ๋ณธ C++ / Python ๋น ์์น | C++17 Rolling-Hash (< 1ms) + Fuzzy LCS ๋ณํฉ |
๋์ฝ๋ฉ ๋ณ๋ชฉ ์ ๊ฑฐ, ์ฒญํฌ ๊ฒฝ๊ณ ์ค๋ณต ์ต์ |
| ์ง์ ํ๋ซํผ | Apple Silicon MPS ์ค์ฌ | Apple MPS ยท NVIDIA CUDA ยท Multi-core CPU | ์ฅ์น ์๋ ๊ฐ์ง, Linux/macOS/Windows ์๋ ๋น๋ |
1. 230GB ์์ ๋ํ ์์ฑ ์ถ๊ฐ ํ์ต (์ด 530GB)
์ ๊ณต ์ฉ์ด์ ๊ฒฉ์์ฒด ์ค์ฌ์ 300GB ๊ฐ์ ์์ฑ์, ๋ค์ํ ์ฑ๋ณยท์ฐ๋ น๋์ ์์ฐ์ค๋ฌ์ด ๊ตฌ์ด์ฒด๊ฐ ๋ด๊ธด 230GB ์์ ๋ํ ์์ฑ์ ๊ฒฐํฉํ์ต๋๋ค. ๋ถ๊ท์นํ ๋ฐํ ์๋, ์ถ์์, ๊ตฌ์ด์ฒด ์ถ์ฝ, ๊ฐ์ ์ค ์ฆํฅ ์ค๋ช ๊ตฌ๊ฐ์ ๋ํ ์ํฅ ๊ฐ๊ฑด์ฑ์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค.
2. 2,048 BPE ํ ํฌ๋์ด์ & 5-Gram KenLM ์ธ์ด ๋ชจ๋ธ
ํํ์์ ์์ ์ ๊ท ํ ์๊ฒ ์์ถํ๋ 2,048 ํฌ๊ธฐ SentencePiece BPE ์ฌ์ ์ผ๋ก ํฌ์ ํ ํฐ ๋ฌธ์ ๋ฅผ ํด์ํ๊ณ ๋ฏธ๋ฑ๋ก ์ดํ(OOV)ยท์ธ๋์ด ๋ณต์๋ ฅ์ ๋์์ต๋๋ค. ์ฌ๊ธฐ์ 320๋ง ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ถํ 5-Gram KenLM(80.2MB) ์ ๊ฒฐํฉํด ๋ฌธ๋งฅ ์์ฐ์ค๋ฌ์๊ณผ ๋์ด์ฐ๊ธฐ ์์ฑ๋๋ฅผ ๋์ด์ฌ๋ ธ์ต๋๋ค.
3. ํฌ๋ก์คํ๋ซํผ ๊ณ ์ฑ๋ฅ ์ถ๋ก & ์ง๋ฅํ ์ฒญํฌ ๋ณํฉ
device="auto"๋ก CUDA / MPS / CPU ์ค ์ต์ ์ ๋ฐฑ์๋๋ฅผ ์๋ ์ ํํ๊ณbfloat16Fastpath๋ฅผ ์ ์ฉํฉ๋๋ค.- GPU ๋ฐฐ์น ํฌ์๋์ ๋ฉํฐ์ค๋ ๋ C++ ๋น ์์น๋ฅผ ๋น๋๊ธฐ๋ก ์ค์ฒฉ ์คํํฉ๋๋ค.
- ์ฒญํฌ ์ค๋ฒ๋ฉ ๊ตฌ๊ฐ์๋ ์ต๋ 8-์ด์ ์ ํ ๋งค์นญ, ๋ฌธ์ ๋จ์ Fuzzy LCS ์ ๋ ฌ, ๋ฐ๋ณต ๋ฐํ ํํฐ๋ฅผ ์์ฐจ ์ ์ฉํ์ฌ ๋งค๋๋ฌ์ด ์ฅ๋ฌธ ์ ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ญ๋๋ค.
Benchmark
Notesoop-STT-Ko-v2๋ฅผ (1) ๊ณต์ธ ํ์ค ๋ฒค์น๋งํฌ(Zeroth-Korean) ์ (2) ์ค์ ๋ํ ์ ๊ณต ๊ฐ์ ๋กฑํผ ๋
น์(41๋ถ 43์ด Field Test) ์ผ๋ก ํ๊ฐํ์ต๋๋ค. ๋ชจ๋ ์จ๋๋ฐ์ด์ค ์ธก์ ์ Apple M1 Pro (16GB ํตํฉ ๋ฉ๋ชจ๋ฆฌ, PyTorch MPS bfloat16, KenLM 5-Gram Beam Search ์ต์ ํ ํ์ดํ๋ผ์ธ) ๊ธฐ์ค์
๋๋ค.
1. ํ์ค ํ๊ตญ์ด ๋ฒค์น๋งํฌ (Zeroth-Korean Test Set, 457๋ฌธ์ฅ)
Bingsu/zeroth-korean ํ
์คํธ ์ธํธ(457๊ฐ ๋ฐํ, 1์๊ฐ 11๋ถ 27์ด / 4,287์ด) ์ ์ ํ๊ฐ ๊ฒฐ๊ณผ์
๋๋ค.
| ๋ชจ๋ธ๋ช | ์์ ์๊ฐ โฑ๏ธ | RTF | ์ค์๊ฐ ๋ฐฐ์ โก | Host RAM | MPS VRAM ๐ฅ๏ธ | CER ๐ฏ | WER |
|---|---|---|---|---|---|---|---|
| Notesoop-STT-Ko-v2 (2K BPE + 5-Gram KenLM) ๐ | 150.21์ด (2๋ถ 30์ด) | 0.0350 | 28.5x | 1,405.5 MB | 1,376.1 MB | 10.47% | 35.07% |
| Notesoop-STT-Ko-v1 (Notesoop MPS) | 211.12์ด (3๋ถ 31์ด) | 0.0492 | 20.3x | 2,639.2 MB | 1,469.4 MB | 15.88% | 45.28% |
| ๊ฐ์ ํญ (V1 โ V2) | -60.91์ด (-28.8%) | -0.0142 | +40.4% ๊ฐ์ | -46.7% | -6.3% | -5.41%p | -10.21%p |
- CER 5.41%p ๊ฐ์ (15.88% โ 10.47%): ์์ ๋ํ ์์ฑ ์ถ๊ฐ ํ์ต๊ณผ 2K BPE ๋์ ์ผ๋ก ์ค์ฐจ์จ์ ์๋ ๊ธฐ์ค ์ฝ 34.1% ์ค์์ต๋๋ค.
- WER 10.21%p ๊ฐ์ (45.28% โ 35.07%): 5-Gram KenLM ๊ฒฐํฉ์ผ๋ก ์ด์ ๊ฒฝ๊ณ์ ๋์ด์ฐ๊ธฐ ์ ํ๋๊ฐ ํฌ๊ฒ ํฅ์๋์์ต๋๋ค.
- ์ถ๋ก ์๋ 40.4% ํฅ์ (20.3x โ 28.5x): 1์๊ฐ 11๋ถ ๋ถ๋์ ๋จ 2๋ถ 30์ด์ ์ ์ฌํฉ๋๋ค.
- Host RAM 46.7% ์ ๊ฐ (2,639.2MB โ 1,405.5MB): ์์คํ ๋ฉ๋ชจ๋ฆฌ ์ ์ ์จ์ด ์ ๋ฐ ๊ฐ๊น์ด ์ค์ด 8GB/16GB ๊ธฐ๊ธฐ์์๋ ์ฌ์ ๋กญ๊ฒ ์คํ๋ฉ๋๋ค.
2. ์ค์ ์ ๊ณต ๊ฐ์ ๋กฑํผ ๋ น์ (41๋ถ 43์ด, Field Test)
๋ฐฐ๊ฒฝ ์์, ๋ง๋๋ฌ, ์ํฅ์ด ํฌํจ๋ ์ค์ ๋ํ ์ ๊ณต ๊ฐ์ ๋ น์(2,503.34์ด)์ ๋ํ ์ค์ธก ๋น๊ต์ ๋๋ค.
| ๋ชจ๋ธ๋ช | ๋๋ฐ์ด์ค / ๋ฐฑ์๋ | ์ ์ฌ ์์ ์๊ฐ โฑ๏ธ | ์ฒด๊ฐ ์๋ โก | RTF | CER ๐ฏ | WER | MPS VRAM ๐ฅ๏ธ |
|---|---|---|---|---|---|---|---|
| Notesoop-STT-Ko-v2 (์ต์ ํ ํ์ดํ๋ผ์ธ) ๐ | Apple MPS (bf16) |
59.3์ด (59.32s) | 42.2x | 0.0237 | 21.19% | 37.77% | 1,394 MB |
| Notesoop-STT-Ko-v1 (๊ณต์ README ๊ธฐ์ค) | Apple MPS (bf16) |
1๋ถ 2์ด (62.70s) | 39.9x | 0.0251 | 22.46% | 39.25% | 1,537 MB |
| Whisper-medium (OpenAI) | Apple MPS | 4๋ถ 11์ด (251.5s) | 10.0x | 0.1005 | 26.68% | 45.82% | 3,467 MB |
| Whisper-large-v3 (OpenAI) | Apple MPS | 11๋ถ 45์ด (704.9s) | 3.6x | 0.2816 | 25.55% | 42.10% | 6,325 MB |
- 1๋ถ ๋ฒฝ ๋ํ (42.2x): 41๋ถ 43์ด ๋ถ๋์ ๊ฐ์๋ฅผ 59.32์ด์ ์ ์ฌํ์ฌ
Whisper-large-v3(704.9์ด) ๋๋น ์ฝ 11.9๋ฐฐ ๋น ๋ฆ ๋๋ค. - ๋ํ ๋ชจ๋ธ ๋๋น ๋์ ์ ํ๋: CER 21.19% ๋ก V1(22.46%) ๋๋น 1.27%p ํฅ์๋์๊ณ ,
Whisper-large-v3(25.55%) ๋๋น 4.36%p ๋ฎ์ต๋๋ค. - ์ด๊ฒฝ๋ ๋ฉ๋ชจ๋ฆฌ (VRAM 1,394MB):
Whisper-large-v3(6,325MB) ๋๋น ์ฝ 4.5๋ฐฐ ์ ์ VRAM์ ์ฌ์ฉํ๋ฏ๋ก, ๋ค๋ฅธ ์์ ๊ณผ ๋์์ ์คํํด๋ ์ค์ํ์ด๋ ๋ณ๋ชฉ์ด ๊ฑฐ์ ์์ต๋๋ค.
Quickstart
1. Installation
์๊ตฌ ์ฌํญ
- OS: macOS (Apple Silicon M1 ์ด์ ๊ถ์ฅ), Linux/Windows (NVIDIA CUDA GPU ์ง์)
- Python: 3.10 ์ด์
git-lfs: ๋์ฉ๋ ๋ชจ๋ธ ํ์ผ(.pt,.bin,.model) ๋ค์ด๋ก๋ffmpeg: ๋ค์ํ ์ค๋์ค ํฌ๋งท(.m4a,.mp3,.flac๋ฑ) ๋์ฝ๋ฉ
# 1) Git LFS ํ์ฑํ ํ ๋ ํฌ์งํ ๋ฆฌ ๋ณต์
git lfs install
git clone https://huggingface.co/Phsoft-ai/Notesoop-STT-Ko-v2
cd Notesoop-STT-Ko-v2
# 2) ์์กด์ฑ ์ค์น
pip install -r requirements.txt
์ฐธ๊ณ
- ffmpeg: macOS๋
brew install ffmpeg, Ubuntu/Debian์sudo apt install ffmpeg- KenLM ์ค์น ์คํจ ์:
pip install https://github.com/kpu/kenlm/archive/master.zip- ์ค๋์ค ์ธ์ฝ๋: ์ฒซ ์คํ ์
google/embeddinggemma-2๊ฐ์ค์น๋ฅผ Hugging Face์์ ์๋์ผ๋ก ๋ด๋ ค๋ฐ์ต๋๋ค. ์ ๊ทผ ๊ถํ์ด ํ์ํ ํ๊ฒฝ์ด๋ผ๋ฉด ๋จผ์ huggingface-cli login์ ์คํํ์ธ์.
2. CLI Usage
transcribe.py๋ก ์์ฑ ํ์ผ์ ๋ฐ๋ก ์ ์ฌํ ์ ์์ต๋๋ค. (.wav, .m4a, .mp3, .flac ๋ฑ ์ง์)
# ๊ธฐ๋ณธ ์คํ (์ฅ์น ์๋ ๊ฐ์ง, KenLM 5-Gram ํ์ฑํ)
python transcribe.py --audio sample_audio.wav
# NVIDIA CUDA GPU์์ ๋์ฉ๋ ๋ฐฐ์น ์ ์ฌ (RTX 3090/4090, A100 ๋ฑ)
python transcribe.py --audio my_audio.wav --device cuda --batch_size 16
# Apple Silicon MPS์์ ์คํ
python transcribe.py --audio my_audio.m4a --device mps --batch_size 4
# ์ฅ์๊ฐ ์ค๋์ค ์ ์ฌ ํ ํ
์คํธ ํ์ผ๋ก ์ ์ฅ
python transcribe.py --audio lecture.m4a --output result.txt
# Greedy ๋์ฝ๋ฉ ๋ชจ๋ (KenLM ๋นํ์ฑํ, ๊ฐ์ฅ ๋น ๋ฆ)
python transcribe.py --audio sample_audio.wav --no_kenlm
์ฃผ์ CLI ์ต์
| ์ต์ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
--audio |
sample_audio.wav |
์ ๋ ฅ ์ค๋์ค ํ์ผ ๊ฒฝ๋ก |
--device |
auto |
์ฐ์ฐ ๋๋ฐ์ด์ค (auto, cuda, mps, cpu) |
--batch_size |
4 |
์ฒญํฌ ๋ฐฐ์น ํฌ๊ธฐ (CUDA์์๋ 8~16 ๊ถ์ฅ) |
--chunk_sec |
15.0 |
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ฒญํฌ ๊ธธ์ด(์ด) |
--overlap_sec |
1.0 |
์ฒญํฌ ๊ฐ ์ค์ฒฉ ๊ธธ์ด(์ด) |
--beam_size |
16 |
CTC ๋น ์์น ํฌ๊ธฐ |
--alpha / --beta |
0.18 / 0.35 |
KenLM ์ธ์ด ๋ชจ๋ธ ๊ฐ์ค์น(alpha) / ์ด์ ์ฝ์
๋ณด๋์ค(beta) |
--no_kenlm |
False |
KenLM ๋ฆฌ์ค์ฝ์ด๋ง ๋นํ์ฑํ (Greedy ๋์ฝ๋ฉ) |
--output |
None |
์ ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ .txt ํ์ผ ๊ฒฝ๋ก |
3. C++ Fast Beam Search ๋น๋ (์ ํ ์ฌํญ)
< 1ms ์์ค์ C++17 CTC Beam Search ์์ง์ ์ง์ ๋น๋ํ๋ ค๋ฉด ๋ค์์ ์คํํฉ๋๋ค.
# macOS (.dylib), Linux (.so), Windows (.dll) ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋ ์ปดํ์ผ
python build_fast_beam.py
macOS์ฉ ๋ฐ์ด๋๋ฆฌ๋ src/libfast_beam_search_v3.dylib๋ก ๊ธฐ๋ณธ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฐ์ด๋๋ฆฌ๊ฐ ์์ด๋ transcribe.py ์คํ ์ ์์คํ
์ปดํ์ผ๋ฌ(g++/clang++)๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก ์ปดํ์ผ๋๋ฉฐ, ์ปดํ์ผ๋ฌ๊ฐ ์์ผ๋ฉด Python Fallback์ผ๋ก ์์ ํ๊ฒ ๋์ํฉ๋๋ค.
4. Benchmark Suite
RTF, ์ค์๊ฐ ๋ฐฐ์, Host RAM / GPU VRAM ์ ์ ์จ, CER/WER์ ์ง์ ์ธก์ ํ ์ ์๋ ๋ ๋ฆฝ ๋ฒค์น๋งํฌ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
# ๊ธฐ๋ณธ ๋ฒค์น๋งํฌ (์ฅ์น ์๋ ๊ฐ์ง)
python benchmark.py --audio sample_audio.wav
# ์ ๋ต ํ
์คํธ ๋๋น CER/WER ์ธก์ ๋ฐ JSON ์ ์ฅ (CUDA ์์)
python benchmark.py --audio sample_audio.wav --ground_truth reference.txt --device cuda --batch_size 16 --output_json result.json
5. Python API
from transcribe import EmbeddingGemmaSTTV2
# ์ถ๋ก ์์ง ์ด๊ธฐํ (CUDA / MPS / CPU ์๋ ๊ฐ์ง)
stt = EmbeddingGemmaSTTV2(
device="auto", # "auto", "cuda", "mps", "cpu"
use_kenlm=True,
beam_size=16
)
# ์์ฑ ์ ์ฌ
transcript, rtf = stt.transcribe(
audio_path="sample_audio.wav",
chunk_sec=15.0,
overlap_sec=1.0,
batch_size=4
)
print(f"์ ์ฌ ๊ฒฐ๊ณผ: {transcript}")
print(f"์ฒ๋ฆฌ ๋ฐฐ์: {1.0 / rtf:.1f}x Real-time (RTF: {rtf:.4f})")
Repository Structure
Notesoop-STT-Ko-v2/
โโโ README.md # Model Card ๋ฐ ์ฌ์ฉ ์ค๋ช
์
โโโ TECHNICAL_REPORT_v2.md # ์ํคํ
์ฒยทMetal ํ์ตยท๋ฒค์น๋งํฌ ํ
ํฌ๋์ปฌ ๋ฆฌํฌํธ
โโโ LICENSE # Apache-2.0 ๋ผ์ด์ ์ค
โโโ requirements.txt # ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชฉ๋ก
โโโ transcribe.py # ํตํฉ ์ ์ฌ CLI ๋ฐ Python API (Batched + Async)
โโโ benchmark.py # CUDA / MPS / CPU ์ฑ๋ฅ(VRAM, RTF, CER/WER) ๋ฒค์น๋งํฌ
โโโ build_fast_beam.py # C++ Fast Beam Search ๋ค์ค OS ๋น๋ ์คํฌ๋ฆฝํธ
โโโ sample_audio.wav # ํ
์คํธ์ฉ ์ํ ์ค๋์ค
โโโ checkpoints/
โ โโโ NoteSoop_stt_v2_best.pt # Conformer Reader ๋ชจ๋ธ ๊ฐ์ค์น (133MB)
โโโ lm/
โ โโโ ko_bpe_2048_lm.bin # 5-Gram KenLM ์ธ์ด ๋ชจ๋ธ (80.2MB)
โโโ tokenizer/
โ โโโ ko_bpe_2048.model # 2,048 BPE SentencePiece ํ ํฌ๋์ด์
โโโ src/
โโโ model.py # Conformer Reader ์ ๊ฒฝ๋ง (CUDA bf16 / MPS ๋ค์ดํฐ๋ธ)
โโโ dataset.py # ํ๊ตญ์ด 2K BPE ํ ํฌ๋์ด์ ๋ฐ ํ
์คํธ ์ ๊ทํ
โโโ decoder.py # KenLM 5-Gram ๋น ์์น ๋์ฝ๋ (๋ค์ค OS C++ ์์ง ๋ก๋)
โโโ fast_beam_search_v3.cpp # C++17 Rolling-Hash CTC Beam Search ์์ค
โโโ libfast_beam_search_v3.dylib # macOS ์ฌ์ ๋น๋ ๋ฐ์ด๋๋ฆฌ
โโโ mps_kernels.py # Apple Silicon Metal Compute Shader ํ์ต ์ปค๋
โโโ step2_extract_features.py # EmbeddingGemma-2 ์ค๋์ค ํน์ง ์ถ์ถ๊ธฐ
License & Citation
๋ณธ ๋ชจ๋ธ๊ณผ ์ฝ๋๋ Apache License 2.0 ํ์ ๊ณต๊ฐ๋๋ฉฐ, ์ฐ๊ตฌ ๋ฐ ์์ ์ ๋ชฉ์ ์ผ๋ก ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@misc{notesoop2026sttkov2,
author = {Notesoop AI Team},
title = {Notesoop-STT-Ko-v2: Advanced Korean On-Device Speech Recognition},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/Phsoft-ai/Notesoop-STT-Ko-v2}},
note = {Cross-Platform On-Device Korean STT (Apple Silicon MPS / NVIDIA CUDA / CPU)}
}
Notesoop (๋
ธํธ์ฒ) โ ํ์ต์ ๋นํจ์จ์ ์ค์ฌ, ๋๊ตฌ๊ฐ ์๋ ๋ฐฐ์์ ์ง์คํ ์ ์๋ ๊ฒฝํ์ ๋ง๋ญ๋๋ค.
๊ฐ์ ๋
น์, ํ๊ธฐ ์ฐ๋, ํต์ฌ ์์ฝ๋ถํฐ ๋ณต์ต ํด์ฆ๊น์ง ํ๋๋ก ์ด์ด์ง๋ ํ์ต ํ๊ฒฝ์ ๋
ธํธ์ฒ ์ฑ์์ ๊ฒฝํํด๋ณด์ธ์.