Notesoop-STT-Ko-v1 / README.md
yclee12345's picture
Update README.md repository tree
030e472 verified
|
Raw History Blame Contribute Delete
13.8 kB
---
language:
- ko
license: apache-2.0
tags:
- audio
- speech-recognition
- automatic-speech-recognition
- apple-silicon
- on-device
- korean
- embeddinggemma-2
- notesoop
pipeline_tag: automatic-speech-recognition
metrics:
- cer
- wer
library_name: pytorch
---
# Notesoop-STT-Ko-v1
<p align="center">
<img src="https://img.shields.io/badge/Language-Korean%20(ํ•œ๊ตญ์–ด)-blue" alt="Language" />
<img src="https://img.shields.io/badge/Speedup-39.9x%20Real--time-green" alt="Speedup" />
<img src="https://img.shields.io/badge/Audio%20Encoder-EmbeddingGemma--2-orange" alt="Audio Encoder" />
<img src="https://img.shields.io/badge/VRAM-1.2GB%20~%201.5GB-purple" alt="VRAM" />
<img src="https://img.shields.io/badge/Platform-Apple%20Silicon%20(PyTorch%20MPS)-black" alt="Platform" />
<img src="https://img.shields.io/badge/License-Apache%202.0-lightgrey" alt="License" />
</p>
<p align="center">
<a href="https://apps.apple.com/kr/app/notesoop/id6760303593" target="_blank"><img src="https://img.shields.io/badge/App_Store-%EB%85%B8%ED%8A%B8%EC%88%B2_%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-0D96F6?style=for-the-badge&logo=apple&logoColor=white" alt="Download on the App Store" /></a>&nbsp;&nbsp;<a href="https://play.google.com/store/apps/details?id=com.phsoft.notesoop&utm_source=ig&utm_medium=social&utm_content=link_in_bio&fbclid=PAdGRleAS711NwZG9mAmV4dG4DYWVtAjExAHNydGMGYXBwX2lkDzEyNDAyNDU3NDI4NzQxNAABpxFu1PSQrzp-9WgAihbuFrY4gre7MP6MH5Xx4lfKa9FjndnyVoMXb8awipoa_aem_5ccpc4qbd5STxaPUlQif3g" target="_blank"><img src="https://img.shields.io/badge/Google_Play-%EB%85%B8%ED%8A%B8%EC%88%B2_%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-01875F?style=for-the-badge&logo=googleplay&logoColor=white" alt="Get it on Google Play" /></a>
</p>
**Notesoop-STT-Ko-v1**์€ ๋…ธํŠธ์ˆฒ(Notesoop)์—์„œ ๊ฐœ๋ฐœํ•œ Apple Silicon(PyTorch MPS) ๊ฐ€์† ํ•œ๊ตญ์–ด ์˜จ๋””๋ฐ”์ด์Šค ์Œ์„ฑ์ธ์‹(ASR) ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
Google์˜ `EmbeddingGemma-2` ์˜ค๋””์˜ค ์ธ์ฝ”๋”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜จ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ๊ฒฝ๋Ÿ‰ ์Œํ–ฅ ๋ฆฌ๋”์™€ ์–ธ์–ด ๋””์ฝ”๋”๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ 1.2~1.5GB ์ˆ˜์ค€์˜ ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์œจ๋กœ **์‹ค์‹œ๊ฐ„ ๋Œ€๋น„ ์•ฝ 40๋ฐฐ์†(`RTF 0.0251`, 41๋ถ„ ๋ถ„๋Ÿ‰ ์Œ์„ฑ์„ ์•ฝ 63์ดˆ์— ์ฒ˜๋ฆฌ)**์˜ ๋น ๋ฅธ ์˜จ๋””๋ฐ”์ด์Šค ์ถ”๋ก  ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
> ๋ณธ ๋ชจ๋ธ(Notesoop-STT-Ko-v1)์€ ์˜ฌํ•ด ์•ˆ์— ๋…ธํŠธ์ˆฒ(Notesoop) ์•ฑ์—์„œ๋„ ๋งŒ๋‚˜๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
---
## Background & Design Goals
๋…ธํŠธ์ˆฒ์€ **"ํ•™์Šต์˜ ๋น„ํšจ์œจ์„ ์ค„์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ๋ฐฐ์›€์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ๋งŒ๋“ ๋‹ค"**๋Š” ๋ฏธ์…˜ ์•„๋ž˜ ํฉ์–ด์ง„ ํ•™์Šต ๋„๊ตฌ์™€ AI๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ์ˆ ์„ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ ํ•™์Šต ํ™˜๊ฒฝ์—์„œ๋Š” ์ˆ˜์‹ญ ๋ถ„์—์„œ ์ˆ˜ ์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์˜ ๊ฐ•์˜ ๋ฐ ํ•™์Šต ์Œ์„ฑ์„ ๋‹ค๋ฃจ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ๊ธด ๋ณ€ํ™˜ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ณ , ๋ฌด๊ฑฐ์šด ๋ชจ๋ธ ๋•Œ๋ฌธ์— ๊ธฐ๊ธฐ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ž ์‹๋˜์–ด ์ •์ž‘ PDF ์—ด๋žŒ์ด๋‚˜ ํ•„๊ธฐ ๊ฐ™์€ ๋ณธ์—ฐ์˜ ํ•™์Šต ํ™œ๋™์ด ๋ฐฉํ•ด๋ฐ›๋Š” ๊ฒƒ์€ ํฐ ๋น„ํšจ์œจ์ž…๋‹ˆ๋‹ค. **Notesoop-STT-Ko-v1**์€ ๊ธฐ์ˆ ์  ๋ณต์žกํ•จ์€ ๋ชจ๋ธ ๋‚ด๋ถ€๋กœ ์ˆจ๊ธฐ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋Š๊น€ ์—†๋Š” ํ•™์Šต ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๋ชฉํ‘œ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
* **์‹ค์งˆ์ ์ธ ํ•™์Šต ํšจ์œจ (Practicality & Speed):** ๊ธด ๋…น์Œ ํŒŒ์ผ๋„ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์—†์ด ์ฆ‰์‹œ ๋ณต์Šต๊ณผ ์ •๋ฆฌ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, ๋น„์ž๊ธฐํšŒ๊ท€(Non-Autoregressive) ๋‹จ์ผ ํŒจ์Šค ๊ตฌ์กฐ์™€ ๊ณ ์† ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
* **๋ชจ๋ฐ”์ผ ๋ฐ ์˜จ๋””๋ฐ”์ด์Šค ์ตœ์ ํ™” (Simplicity & Accessibility):** ๋ณ„๋„์˜ ์„œ๋ฒ„๋‚˜ ๊ณ ์‚ฌ์–‘ ์žฅ๋น„ ์—†์ด ํƒœ๋ธ”๋ฆฟยท์Šค๋งˆํŠธํฐ ๋“ฑ ์ œํ•œ๋œ ์—ฐ์‚ฐ ์ž์›์„ ๊ฐ€์ง„ ๋ชจ๋ฐ”์ผ ๋””๋ฐ”์ด์Šค์—์„œ๋„ ์ถฉ๋ถ„ํ•œ ์ถ”๋ก  ์†๋„๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก, ์Œํ–ฅ ๋ฆฌ๋” ๋ชจ๋ธ์„ ์˜จ๋””๋ฐ”์ด์Šค์— ๋งž๊ฒŒ ์ดˆ๊ฒฝ๋Ÿ‰ํ™”ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์œจ์„ ์ตœ์†Œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
* **์—ด๋ฆฐ ๊ธฐ์ˆ  ์‹คํ—˜ (Open Ecosystem):** ๋ˆ„๊ตฌ๋‚˜ ์˜จ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์—์„œ ํ•œ๊ตญ์–ด ์Œ์„ฑ์ธ์‹ ๊ธฐ์ˆ ์„ ๋ถ€๋‹ด ์—†์ด ์‹คํ—˜ํ•˜๊ณ  ๋” ๋‚˜์€ ํ•™์Šต ๊ฒฝํ—˜์„ ๋งŒ๋“œ๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก, ๋ชจ๋ธ ๊ฐ€์ค‘์น˜์™€ PyTorch MPS ๊ณ ์† ์ถ”๋ก  ํŒŒ์ดํ”„๋ผ์ธ ์ „์ฒด๋ฅผ Apache-2.0 ๋ผ์ด์„ ์Šค๋กœ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค.
---
## Model Specifications
| ํ•ญ๋ชฉ | ์ƒ์„ธ ์‚ฌ์–‘ |
| :--- | :--- |
| **Audio Encoder** | `google/embeddinggemma-2` (Audio Tower, 16kHz Mono, 128-Mel) |
| **Acoustic Decoder** | Lightweight Korean Acoustic Reader |
| **Vocabulary** | 25,000 ํ•œ๊ตญ์–ด ํ˜•ํƒœ์†Œ ๋ฐ ์Œ์ ˆ ์–ดํœ˜์ง‘ |
| **Language Rescoring** | KenLM 3-Gram ํ•œ๊ตญ์–ด ์–ธ์–ด ๋ชจ๋ธ |
| **Supported Backends** | PyTorch MPS (`bfloat16`), CUDA / CPU |
| **Training Data** | AI Hub ํ•œ๊ตญ์–ด ๊ฐ•์˜ ์Œ์„ฑ ๋ฐ์ดํ„ฐ (์•ฝ 300GB) |
| **License** | Apache-2.0 |
---
## Overview
Notesoop-STT-Ko-v1์€ Google์˜ `embeddinggemma-2` ์˜ค๋””์˜ค ์ธ์ฝ”๋”๊ฐ€ ์ถ”์ถœํ•œ ๊ณ ๋ฐ€๋„ ์Œํ–ฅ ํ‘œํ˜„์„ ๋ฐ”ํƒ•์œผ๋กœ, ์˜จ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์—์„œ ์ง€์—ฐ ์—†์ด ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”๋œ ๊ฒฝ๋Ÿ‰ ์Œํ–ฅ ๋ฆฌ๋”๋ฅผ ํ†ตํ•ด ํ•œ๊ตญ์–ด ์Œ์„ฑ์„ ํ…์ŠคํŠธ๋กœ ๊ณ ์† ๋ณต์›ํ•ฉ๋‹ˆ๋‹ค.
* **Google EmbeddingGemma-2 ์˜ค๋””์˜ค ์ธ์ฝ”๋” ๊ธฐ๋ฐ˜:** ์‚ฌ์ „ ํ•™์Šต๋œ ๋Œ€๊ทœ๋ชจ ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์˜ค๋””์˜ค ์ธ์ฝ”๋”์˜ ํ’๋ถ€ํ•œ ์Œํ–ฅ ํŠน์ง•์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐ๊ฒฝ ์†Œ์Œ๊ณผ ๋‹ค์–‘ํ•œ ์Œ์งˆ ์กฐ๊ฑด์—์„œ๋„ ๊ฒฌ๊ณ ํ•œ ์Œํ–ฅ ํ‘œํ˜„์„ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค.
* **์ดˆ๊ฒฝ๋Ÿ‰ ์˜จ๋””๋ฐ”์ด์Šค ๋ฆฌ๋”:** ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์ด ์ œํ•œ๋œ ๋ชจ๋ฐ”์ผ ๋ฐ ๋žฉํ†ฑ ๋””๋ฐ”์ด์Šค์—์„œ๋„ ๋ถ€๋‹ด ์—†์ด ๊ตฌ๋™๋  ์ˆ˜ ์žˆ๋„๋ก ํŒŒ๋ผ๋ฏธํ„ฐ ํฌ๊ธฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์†Œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
* **Apple Silicon MPS ๊ณ ์† ๊ฐ€์†:** PyTorch MPS ํ™˜๊ฒฝ์—์„œ ๋ถˆํ•„์š”ํ•œ ํ˜•๋ณ€ํ™˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ธ `bfloat16` ํ…์„œ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ๋Œ€๋น„ ์•ฝ 40๋ฐฐ์†์˜ ๋น ๋ฅธ ์ถ”๋ก  ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
* **GPU-CPU ๋น„๋™๊ธฐ ํŒŒ์ดํ”„๋ผ์ด๋‹:** GPU๊ฐ€ ์˜ค๋””์˜ค ์ฒญํฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ CPU ์Šค๋ ˆ๋“œ์—์„œ ์–ธ์–ด ๋ชจ๋ธ ๋น” ์„œ์น˜์™€ ํ…์ŠคํŠธ ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฒด๊ฐ ์ง€์—ฐ ์‹œ๊ฐ„์„ ๊ทน๋Œ€ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
---
## Data
**Notesoop-STT-Ko-v1**์€ ์‹ค์ œ ํ•™์Šต ๋ฐ ๊ต์œก ํ˜„์žฅ์˜ ์Œํ–ฅยท์–ธ์–ด์  ํŠน์„ฑ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด **AI Hub์˜ ์•ฝ 300GB ๋ถ„๋Ÿ‰ ํ•œ๊ตญ์–ด ๊ฐ•์˜ ์Œ์„ฑ ๋ฐ์ดํ„ฐ**๋กœ ํ•™์Šต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
* **์‹ค์ „ ๊ฐ•์˜ ๋„๋ฉ”์ธ ํŠนํ™”:** ์•ฝ 300GB ๊ทœ๋ชจ์˜ ๋ฐฉ๋Œ€ํ•œ ์‹ค์ œ ๊ฐ•์˜ ์Œ์„ฑ์„ ํ•™์Šต์— ํ™œ์šฉํ•˜์—ฌ, ์ •์ œ๋œ ๋‚ญ๋…์ฒด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ•์˜ ํ˜„์žฅ์˜ ๋ฐœํ™” ์†๋„ ๋ณ€ํ™”, ์„ค๋ช…์กฐ ์–ดํˆฌ, ํ•™์ˆ ยท์ „๊ณต ์šฉ์–ด, ์žฅ์‹œ๊ฐ„ ์—ฐ์† ๋ฐœํ™” ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์ธ ์ธ์‹ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
* **ํ˜•ํƒœ์†Œยท์Œ์ ˆ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ† ํฌ๋‚˜์ด์ง•:** ํ•œ๊ตญ์–ด ๊ต์ฐฉ์–ด ํŠน์„ฑ์— ๋งž์ถฐ ์ž์ฃผ ์“ฐ์ด๋Š” ํ‘œ๋ฉด ํ˜•ํƒœ์†Œ(Surface Morpheme)์™€ ์Œ์ ˆ ๋‹จ์œ„ Fallback์„ ๊ฒฐํ•ฉํ•œ 25,000๊ฐœ ์–ดํœ˜ ์‚ฌ์ „์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฏธ๋“ฑ๋ก ์–ดํœ˜(OOV) ์†์‹ค์„ ์ตœ์†Œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
---
## Benchmark
`Notesoop-STT-Ko-v1`์˜ ์„ฑ๋Šฅ์„ **(1) ๊ณต์ธ ํ‘œ์ค€ ํ•œ๊ตญ์–ด ํ•™์ˆ  ๋ฒค์น˜๋งˆํฌ**์™€ **(2) ์‹ค์ œ ๋Œ€ํ•™ ์ „๊ณต ๊ฐ•์˜ ๋กฑํผ ์Œ์„ฑ** ๋‘ ๊ฐ€์ง€ ํ™˜๊ฒฝ์—์„œ ์‹ค์ธกํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. (Apple M1 Pro 16GB ๊ธฐ์ค€)
### 1. ํ‘œ์ค€ ํ•œ๊ตญ์–ด STT ๋ฒค์น˜๋งˆํฌ (Zeroth-Korean Test Set, 457๊ฐœ ๋ฌธ์žฅ)
ํ•œ๊ตญ์–ด ์Œ์„ฑ์ธ์‹ ํ•™์ˆ  ํ‰๊ฐ€์˜ ๊ณต์‹ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ์…‹์ธ `Bingsu/zeroth-korean` ํ…Œ์ŠคํŠธ ๋ถ„ํ• (์ด 457๊ฐœ ๋ฐœํ™” ๋ฌธ์žฅ, 1์‹œ๊ฐ„ 11๋ถ„ 27์ดˆ ๋ถ„๋Ÿ‰)์— ๋Œ€ํ•œ ์ „์ˆ˜ ํ‰๊ฐ€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
| ๋ฐ์ดํ„ฐ์…‹ | ์ด ์˜ค๋””์˜ค ๊ธธ์ด | ์ „์ฒด ์ „์‚ฌ ์‹œ๊ฐ„ โฑ๏ธ | ์ฒด๊ฐ ์†๋„ โšก | RTF | ์ดˆ๋‹น ์ฒ˜๋ฆฌ๋Ÿ‰ (Throughput) | ์Œ์ ˆ ์˜ค์ฐจ์œจ (CER) ๐ŸŽฏ | ๋‹จ์–ด ์˜ค์ฐจ์œจ (WER) |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| **Zeroth-Korean Test (457๋ฌธ์žฅ)** | **1์‹œ๊ฐ„ 11๋ถ„ (4,287์ดˆ)** | **2๋ถ„ 30์ดˆ (150.7์ดˆ)** | **28.45๋ฐฐ์†** | **0.0352** | **3.03 ๋ฌธ์žฅ/์ดˆ** | **16.21%** | 45.40% |
* **์ดˆ๋‹น 3๋ฌธ์žฅ ์ด์ƒ์˜ ์ดˆ๊ณ ์† ์ „์‚ฌ**: 1์‹œ๊ฐ„ 11๋ถ„ ๋ถ„๋Ÿ‰์˜ ๋ฐฉ๋Œ€ํ•œ ์˜ค๋””์˜ค๋ฅผ ๋‹จ 2๋ถ„ 30์ดˆ ๋งŒ์— ์™„์ฃผํ•˜๋ฉฐ, ๋‚ญ๋…์ฒด ์Œ์„ฑ ํ™˜๊ฒฝ์—์„œ **16.21%์˜ ์ค€์ˆ˜ํ•œ ์Œ์ ˆ ์˜ค์ฐจ์œจ(CER)**์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
* **์‹ค์ œ ์ „์‚ฌ ์ƒ˜ํ”Œ ์˜ˆ์‹œ**:
* **์ •๋‹ต (REF)**: *"ํ•œ ์ž”์˜ ์ปคํ”ผ๊ฐ€ ์†Œ๋น„์ž์—๊ฒŒ ์ „ํ•ด์ง€๊ธฐ ์œ„ํ•ด์„  ์—ฌ๋Ÿฌ ์ฐจ๋ก€์˜ ๊ณต์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค"*
* **์˜ˆ์ธก (HYP)**: *"ํ•œ ์ž”์˜ ์ปคํ”ผ๊ฐ€ ์†Œ๋น„์ž์—๊ฒŒ ์ „ํ•ด์ง€๊ธฐ ์œ„ํ•ด์„  ์—ฌ๋Ÿฌ ์ฐจ๋ก€์˜ ๊ณต์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค"* (CER: **0.00%**)
* **์ •๋‹ต (REF)**: *"๋˜ํ•œ ๋ฐ• ์ „ ๋Œ€ํ†ต๋ น ์ธก์€ ์•ž์œผ๋กœ ๊ฒ€์ฐฐ ์ˆ˜์‚ฌ์™€ ๊ด€๋ จํ•ด ์ˆ˜์‚ฌ ๋‚ด์šฉ์— ๋Œ€ํ•œ ์ž…์žฅ๋ฟ ์•„๋‹ˆ๋ผ ๋ณ€ํ˜ธ์ธ๋‹จ์˜ ํ™œ๋™ ์ƒํ™ฉ ๋“ฑ๋„ ์†Œ์ƒํ•˜๊ฒŒ ๊ณต๊ฐœํ•œ๋‹ค๋Š” ๋ฐฉ์นจ์ด๋‹ค"*
* **์˜ˆ์ธก (HYP)**: *"๋˜ํ•œ ๋ฐ• ์ „ ๋Œ€ํ†ต๋ น ์ฃผ๋ณ€์— ์•ž์œผ๋กœ ๊ฒ€์ฐฐ์ˆ˜์‚ฌ์™€ ๊ด€๋ จ๋œ ์ˆ˜์‚ฌ ๋‚ด์šฉ์— ๋Œ€ํ•œ ์ž…์žฅ๋ฟ ์•„๋‹ˆ๋ผ ๋ณ€ํ˜ธ์ธ๋‹จ์˜ ํ™œ๋™ ์ƒํ™ฉ ๋“ฑ๋„ ์†Œ์ƒํ•˜๊ฒŒ ๊ณต๊ฐœํ•œ๋‹ค๋Š” ๋ฐฉ์‹์ด๋‹ค"* (CER: **10.39%**)
---
### 2. ์‹ค์ „ ์ „๊ณต ๊ฐ•์˜ ๋…น์Œ (41๋ถ„ 43์ดˆ, Field Test)
๋Œ€ํ•™ ๊ฐ•์˜ ํ™˜๊ฒฝ(๋ฐฐ๊ฒฝ ์žก์Œ, ๋ฐ˜ํ–ฅ, ๋ง๋”๋“ฌ ๋“ฑ์ด ํฌํ•จ๋œ ์‹ค์ œ 41๋ถ„ 43์ดˆ ๋…น์Œ ์Œ์„ฑ)์„ **Apple M1 Pro (16GB RAM)** ๋ชจ๋ธ์—์„œ ์ง์ ‘ ๊ตฌ๋™ํ•˜๋ฉฐ ๊ธ€๋กœ๋ฒŒ ํ‘œ์ค€ ASR ๋ชจ๋ธ๋“ค๊ณผ ๋น„๊ต ์ธก์ •ํ•œ ์‹ค์ธก ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
| Model | Backend / Device | Processing Time | Speedup | RTF | CER (%) ๐ŸŽฏ | WER (%) | Host RAM | GPU Memory (VRAM) ๐Ÿ–ฅ๏ธ |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| **Notesoop-STT-Ko-v1** | **PyTorch MPS (`bf16`)** | **1๋ถ„ 2์ดˆ (62.7s)** | **39.9x** | **0.0251** | **22.46** | 39.25 | **1,076 MB** | 1,537 MB |
| Whisper-medium | MPS | 4๋ถ„ 11์ดˆ (251.5s) | 10.0x | 0.1005 | 26.68 | 45.82 | 1,050 MB | 3,467 MB |
| Whisper-large-v3 | MPS | 11๋ถ„ 45์ดˆ (704.9s) | 3.6x | 0.2816 | 25.55 | 42.10 | 1,243 MB | 6,325 MB |
* **`Whisper-large-v3` ๋Œ€๋น„ 11.2๋ฐฐ ๊ณ ์† & ๋” ์šฐ์ˆ˜ํ•œ ์ •ํ™•๋„:** Whisper-large-v3(11๋ถ„ 45์ดˆ, CER 25.55%) ๋Œ€๋น„ **์•ฝ 11.2๋ฐฐ ๋น ๋ฅธ ์†๋„(1๋ถ„ 2์ดˆ)**์™€ **๋” ๋‚ฎ์€ ์Œ์ ˆ ์˜ค์ฐจ์œจ(CER 22.46%, 3.09%p ํ–ฅ์ƒ)**์„ ๋™์‹œ์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
* **1/4 ์ˆ˜์ค€์˜ ๊ฒฝ๋Ÿ‰ VRAM (1.2~1.5GB):** Whisper-large-v3(6.3GB)์˜ 1/4๋„ ์•ˆ ๋˜๋Š” ๊ฐ€๋ฒผ์šด ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์œจ ๋•๋ถ„์—, ๊ธฐ๋ณธํ˜• ๋งฅ๋ถ ์—์–ด/ํ”„๋กœ(8GB/16GB)์—์„œ๋„ ๋ฐœ์—ด๊ณผ ํŒฌ ์†Œ์Œ ์—†์ด ๋‹ค๋ฅธ ํ•™์Šต ์•ฑ๊ณผ ๋™์‹œ์— ์พŒ์ ํ•˜๊ฒŒ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.
* **๋น„์ž๊ธฐํšŒ๊ท€(Non-Autoregressive) ๊ตฌ์กฐ์˜ ๊ฐ•์ :** ๋ฌธ์žฅ์„ ํ•œ ํ† ํฐ์”ฉ ์ˆœ์ฐจ ์ƒ์„ฑํ•˜๋Š” Whisper์™€ ๋‹ฌ๋ฆฌ, ๋น„์ž๊ธฐํšŒ๊ท€ ๊ตฌ์กฐ๋กœ ์˜ค๋””์˜ค ์ „์ฒด ์Œํ–ฅ ํŠน์ง•์„ ๋‹จ์ผ ํŒจ์Šค($O(T)$)๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜์—ฌ ์žฅ์‹œ๊ฐ„ ์Œ์„ฑ์—์„œ๋„ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
---
## Quickstart
### 1. Installation
macOS (Apple Silicon M1 ์ด์ƒ ๊ถŒ์žฅ) ๋ฐ Python 3.10+ ํ™˜๊ฒฝ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋””์˜ค ๋””์ฝ”๋”ฉ์„ ์œ„ํ•ด ์‹œ์Šคํ…œ์— `ffmpeg`๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(`brew install ffmpeg`).
```bash
git clone https://huggingface.co/Phsoft-ai/Notesoop-STT-Ko-v1
cd Notesoop-STT-Ko-v1
# ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜
pip install -r requirements.txt
# KenLM 3-Gram ๋””์ฝ”๋” ์„ค์น˜
pip install https://github.com/kpu/kenlm/archive/master.zip
```
### 2. CLI Usage
`transcribe.py`๋ฅผ ํ†ตํ•ด ๋‹จ์ผ ๋ช…๋ น์–ด๋กœ ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์ „์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (`.wav`, `.m4a`, `.mp3`, `.flac` ์ง€์›)
```bash
# ๊ธฐ๋ณธ ์‹คํ–‰ (PyTorch MPS ๋ฐฑ์—”๋“œ, batch_size=4)
python transcribe.py sample_audio.wav
# ์žฅ์‹œ๊ฐ„ ๊ฐ•์˜ ์˜ค๋””์˜ค ์ „์‚ฌ ๋ฐ ๊ฒฐ๊ณผ ํŒŒ์ผ ์ €์žฅ
python transcribe.py my_lecture.m4a --batch-size 4 --chunk-sec 16.0 --output transcript.txt
# KenLM ๋น” ์„œ์น˜ ๋น„ํ™œ์„ฑํ™” (Greedy CTC ๋””์ฝ”๋”ฉ)
python transcribe.py sample_audio.wav --no-kenlm
```
### 3. Python API
```python
from run_inference import EmbeddingGemmaSTT
stt = EmbeddingGemmaSTT(
device="mps",
use_kenlm=True,
lm_alpha=0.12,
lm_beta=0.40,
)
transcript, rtf = stt.transcribe(
"sample_audio.wav",
chunk_sec=16.0,
overlap_sec=1.0,
batch_size=4,
)
print(f"RTF: {rtf:.4f} ({1/rtf:.1f}x real-time)")
print(transcript)
```
---
## Repository Structure
```text
Notesoop-STT-Ko-v1/
โ”œโ”€โ”€ README.md # Model Card ๋ฐ ์‚ฌ์šฉ ์•ˆ๋‚ด
โ”œโ”€โ”€ checkpoints/
โ”‚ โ””โ”€โ”€ best_reader_inference.pt # ์Œํ–ฅ ๋ฆฌ๋” ๋ชจ๋ธ ๊ฐ€์ค‘์น˜ (137MB)
โ”œโ”€โ”€ data/
โ”‚ โ””โ”€โ”€ vocab/
โ”‚ โ”œโ”€โ”€ vocab_25k.json # 25,000 ํ•œ๊ตญ์–ด ํ˜•ํƒœ์†Œ/์Œ์ ˆ ์–ดํœ˜ ์‚ฌ์ „
โ”‚ โ”œโ”€โ”€ vector_bank_25k.pt # ์–ดํœ˜ ๋งค์นญ ๋ฒกํ„ฐ ๋ฑ…ํฌ
โ”‚ โ””โ”€โ”€ korean_lm.bin # KenLM 3-Gram ํ•œ๊ตญ์–ด ์–ธ์–ด ๋ชจ๋ธ (82.7MB)
โ”œโ”€โ”€ src/
โ”‚ โ”œโ”€โ”€ model.py # ์Œํ–ฅ ๋ฆฌ๋” ๋ชจ๋ธ ๊ตฌํ˜„
โ”‚ โ”œโ”€โ”€ dataset.py # ํ•œ๊ตญ์–ด ํ˜•ํƒœ์†Œ ํ† ํฌ๋‚˜์ด์ € ๋ฐ ์ •๊ทœํ™”
โ”‚ โ”œโ”€โ”€ decoder.py # KenLM ๋น” ์„œ์น˜ ๋””์ฝ”๋” ๋ž˜ํผ
โ”‚ โ””โ”€โ”€ step2_extract_features.py # EmbeddingGemma-2 ์˜ค๋””์˜ค ํŠน์ง• ์ถ”์ถœ๊ธฐ
โ”œโ”€โ”€ run_inference.py # ์ถ”๋ก  ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ Python API
โ”œโ”€โ”€ transcribe.py # CLI ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ
โ””โ”€โ”€ sample_audio.wav # ํ…Œ์ŠคํŠธ์šฉ ์ƒ˜ํ”Œ ์˜ค๋””์˜ค
```
---
## License & Citation
๋ณธ ๋ชจ๋ธ๊ณผ ์ฝ”๋“œ๋Š” **[Apache License 2.0](LICENSE)** ํ•˜์— ๊ณต๊ฐœ๋˜์–ด ์—ฐ๊ตฌ ๋ฐ ์ƒ์—…์  ์šฉ๋„๋กœ ์ž์œ ๋กญ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```bibtex
@misc{notesoop2026sttkov1,
author = {Notesoop AI Team},
title = {Notesoop-STT-Ko-v1: Lightweight Korean On-Device Speech Recognition},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/Phsoft-ai/Notesoop-STT-Ko-v1}},
note = {Apple Silicon MPS Accelerated Korean ASR}
}
```
---
<p align="center">
<b>Notesoop (๋…ธํŠธ์ˆฒ)</b> โ€” ํ•™์Šต์˜ ๋น„ํšจ์œจ์„ ์ค„์—ฌ, ๋„๊ตฌ๊ฐ€ ์•„๋‹Œ ๋ฐฐ์›€์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.<br>
์Œ์„ฑ ๊ธฐ๋ก๊ณผ PDF ํ•„๊ธฐ ์—ฐ๋™, ํ•ต์‹ฌ ์ •๋ฆฌ, ๋ณต์Šต ๋ฌธ์ œ ์ƒ์„ฑ๊นŒ์ง€ ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐ๋œ ํ•™์Šต ํ™˜๊ฒฝ์„ ๋…ธํŠธ์ˆฒ ์•ฑ์—์„œ ๋งŒ๋‚˜๋ณด์„ธ์š”.
</p>