🎧 Audio player with waveform, speed & loop 🎧 파형·속도·반복이 있는 오디오 플레이어

Listen with
the waveform in view
파형으로 듣는
오디오 플레이어

A capable audio player with a live scrolling waveform, fine 0.1–2.0× speed, drag-to-seek, and one-tap loop. Great for music — and even better when you want to study lectures, shadow a language, or revisit podcast moments. 실시간 파형, 0.1–2.0× 세밀한 속도, 드래그 구간 이동, 한 번 탭으로 반복 재생.
음악 감상은 물론, 강의 복습·어학 쉐도잉·팟캐스트 되듣기에도 자연스럽게 쓰입니다.

100 Korean sentences · 2.7 MB · Free 한국어 100문장 샘플 · 2.7 MB · 무료

What is NotchPlay? NotchPlay 란?

An audio player with the controls you actually need to listen carefully. 깊이 듣기 위한 오디오 플레이어.

NotchPlay is first and foremost an audio player for any mp3, m4a, wav, flac or similar file — music, recordings, or anything else on your device. What sets it apart is a live scrolling waveform, 0.1–2.0× fine speed control, drag-to-seek with second-level precision, and single-track loop.

These are small, well-executed building blocks that add up to use cases general-purpose music players can't handle gracefully: shadowing a foreign-language line twenty times, jumping back to the exact second of a lecture you missed, re-listening to a podcast moment at 0.8× while taking notes, or following a sermon page-by-page with the audio.

All content is yours. The app is a playback tool — keep files on your device, or wrap recordings, transcripts, and images into a contents.json + zip and fetch the whole set from a URL. Your own packs, a colleague's packs, open-data packs — they all run through the same mechanism.

NotchPlay(한결플레이)는 먼저 오디오 플레이어입니다. mp3·m4a·wav·flac 같은 어떤 오디오 파일이든 — 음악, 녹음, 설교, 강의, 팟캐스트 — 재생합니다. 다른 점은 실시간 파형, 0.1–2.0× 세밀한 속도 조절, 파형 드래그로 초 단위 구간 이동, 한 트랙 무한 반복 같은 컨트롤입니다.

이 기능들을 조합하면 일반 음악 플레이어로는 어색했던 용도가 자연스러워집니다. 외국어 한 문장을 20번 쉐도잉하기, 놓친 강의의 정확한 그 5초로 되돌아가기, 팟캐스트 인상 깊은 구간을 0.8× 속도로 다시 들으며 메모하기, 설교를 페이지 이미지와 함께 따라가기 — 이런 활용이 모두 같은 도구로 가능합니다.

모든 콘텐츠는 사용자가 가져옵니다. 앱은 재생 도구일 뿐, 기기에 있는 파일을 그대로 재생하거나, 녹음·스크립트·이미지를 contents.json + zip 파일로 묶어 URL로 받아옵니다. 내가 만든 팩, 동료가 만든 팩, 오픈 데이터 팩 모두 같은 방식으로 돌아갑니다.

Music & audio listeners 음악·오디오 청취자
Play any file on your device. Drag the waveform to the chorus, loop a favourite passage, slow a tricky run down to 0.75×. 기기의 어떤 파일이든 재생. 파형을 드래그해 후렴으로 이동하고, 좋아하는 구간을 반복하고, 까다로운 부분을 0.75×로 느리게.
Language learners 어학 학습자
Shadow and dictate the same sentence in 2-second loops at a pace you can actually follow. 따라갈 수 있는 속도로, 같은 문장을 2초 단위로 끊어 쉐도잉·받아쓰기.
Students & lecture-listeners 강의 수강생
Re-listen at 0.8× while taking notes; jump back to the critical span with one waveform drag. 0.8× 속도로 들으며 필기, 파형 드래그 한 번으로 핵심 구간 재청취.
Podcast & sermon listeners 팟캐스트·설교 청취자
Find the memorable moment in a long episode by eye, loop it, re-listen with the script overlaid. 긴 에피소드에서 인상 깊은 구간을 파형으로 찾고, 반복 재생하거나 스크립트 오버레이로 따라가기.

What it does 핵심 기능

A compact but powerful audio toolkit — equally at home with a song, a sermon, or a language drill. 한 곡이든, 강의든, 언어 드릴이든 — 어느 오디오에나 자연스럽게 어울리는 컴팩트한 도구.

Live waveform 실시간 파형 시각화

A 10-second window scrolls with playback. Drag the waveform to jump to the exact second you want. 10초 윈도우가 재생 위치에 맞춰 스크롤됩니다. 파형을 드래그해 원하는 구간으로 정확히 이동하세요.

0.1× – 2.0× speed 0.1× ~ 2.0× 속도

20-step fine speed control with one-tap reset. Slow down to dissect detail, speed up to skim — works equally well for music, speech and lectures. 20단계 세밀한 속도 조절, 탭 한 번으로 1.0× 리셋. 세밀하게 들을 땐 느리게, 훑을 땐 빠르게 — 음악·음성·강의 어디에나 자연스럽게.

Image + text overlay 이미지 + 텍스트 오버레이

Script, lyrics or grammar notes laid over the page like subtitles. Rotate and pinch-zoom to inspect detail. 대본·가사·문법 설명을 이미지 위에 자막처럼 표시. 회전·핀치줌으로 교재를 자유롭게 확대.

Content-pack downloads 컨텐츠 팩 다운로드

One URL pulls audio, images and scripts in one go. Re-running the download updates only the changed files. URL 하나로 오디오·이미지·스크립트를 한번에 가져옵니다. 매일 업데이트되는 팩도 자동 반영.

Loop & precise seek 반복 재생 · 구간 이동

Repeat a track on a loop or jump back with the slider. Second-level precision from the waveform drag. 한 트랙을 무한 반복하거나 슬라이더로 특정 지점을 다시 듣기. 파형 드래그로 초 단위 정확도.

Local zip import 로컬 zip 불러오기

Pick a zip directly from Files, SD card or iCloud Drive — no network needed. Perfect for offline packs or AirDrop-shared content. Files 앱·SD 카드·iCloud Drive 에서 zip을 바로 선택해 설치. 오프라인 환경이나 AirDrop으로 받은 팩에 최적.

Multiple packs, one tap switch 여러 팩, 한 탭 전환

Keep several named packs side by side (Korean sample, your own, a colleague's). Settings → Change content pack lets you flip between them instantly. 여러 팩을 이름별로 보관(한국어 샘플 · 내 팩 · 동료 팩). 설정 → 컨텐츠 팩 변경으로 즉시 전환.

Plain player mode 일반 플레이어 모드

Toggle off the content-pack mode and NotchPlay scans your device for mp3/m4a/wav/flac/ogg. Any audio file becomes a page — all the waveform / speed / loop controls still apply. 컨텐츠 팩 모드를 끄면 기기의 mp3·m4a·wav·flac·ogg를 스캔해 어떤 오디오 파일이든 재생. 파형·속도·반복은 그대로.

Zero data collection 개인정보 수집 0건

No account, no ads, no tracking. Everything stays on your device; network access is limited to the URL you type yourself. 계정도, 광고도, 추적도 없습니다. 모든 데이터는 기기에만 저장되며, 네트워크는 사용자가 지정한 URL만 접속합니다.

Download the sample pack 샘플 팩 다운로드

100 Korean sentences with English meanings — audio, images and transcripts included. 한국어 100문장 · 오디오 + 이미지 + 영어 번역 포함

Korean 100 — Sample Pack 한국어 100 — Korean Sample Pack

3.17 MB · 203 files · macOS Yuna TTS 2.71 MB · 202 파일 · CC-licensed TTS (macOS Yuna)

Download sample_ko.zip sample_ko.zip 다운로드
Option A — Download by URL:
1. Install and open NotchPlay
2. Settings → Content download
3. Pick Custom and paste the URL:
https://smallisbest.github.io/NotchPlay/sample_ko.zip
4. Tap Download — the 100 sentences appear in the list automatically.

Option B — Import from a local zip:
Download sample_ko.zip to your device first, then Settings → Import zip from device → pick the file. Useful offline, or when sharing a pack via AirDrop / USB transfer.
방법 A — URL로 다운로드:
1. NotchPlay 앱 설치 후 실행
2. 설정 → 컨텐츠 다운로드 섹션
3. 직접 입력 선택 후 URL 붙여넣기:
https://smallisbest.github.io/NotchPlay/sample_ko.zip
4. 다운로드 버튼 탭 → 자동으로 목록에 100문장이 반영됩니다

방법 B — 로컬 zip 파일 불러오기:
기기에 sample_ko.zip을 먼저 저장한 뒤, 설정 → 로컬 zip 파일에서 불러오기 → 파일 선택. 오프라인 환경이나 AirDrop·USB로 팩을 전달받았을 때 유용합니다.

Getting started 시작하기

Three steps to your own re-listening environment. 세 단계로 나만의 학습 환경을 만드세요.

Install the app 앱 설치

Get NotchPlay from the App Store or Google Play (launching soon). App Store / Google Play 에서 NotchPlay를 설치합니다. (출시 준비 중)

Load content 콘텐츠 불러오기

Grab the sample zip from this page, or point the app at your own zip URL. 이 페이지의 샘플 zip을 다운로드하거나, 직접 제작한 zip을 URL로 지정해 받아옵니다.

Listen in depth 반복해서 듣기

Use speed, loops and waveform seek to make a phrase truly yours. 속도 조절·파형 구간 이동·반복 재생으로 같은 구절을 완전히 내 것으로 만듭니다.

Author your own content pack 나만의 컨텐츠 팩 만들기

A content pack is just a zip file containing one JSON manifest and some media files. This section walks through the structure using the Korean sample pack as reference. 컨텐츠 팩은 .json 매니페스트 하나와 미디어 파일 몇 개가 들어간 zip 파일입니다. 이 섹션은 한국어 샘플 팩(sample_ko.zip)을 기준으로 구조를 설명합니다.

1 · Zip layout 1 · zip 파일 구조

A pack zip has the JSON manifest at the root plus a media folder of your choosing. sample_ko.zip uses: zip 루트에 매니페스트 JSON을, 그 옆에 미디어 폴더를 둡니다. sample_ko.zip의 구조:

sample_ko.zip
├── contents.json        ← active manifest (앱이 항상 이 경로를 읽음)
├── korean_lang.json     ← 동일 내용의 named backup (팩 전환용)
└── ko/                  ← 미디어 폴더 (이름 자유)
    ├── k001.m4a
    ├── k001.jpg
    ├── k002.m4a
    ├── k002.jpg
    ├── ...
    ├── k100.m4a
    ├── k100.jpg
    └── ko.jpg           ← defaultimage — 이미지 없는 페이지 폴백

Two JSON copies? contents.json is the app's active manifest; korean_lang.json is a named snapshot so you can switch back to this pack later via Settings → Change content pack even after installing other packs. JSON이 왜 두 개? contents.json은 앱이 실제로 읽는 활성 매니페스트이고, korean_lang.json은 이름이 있는 스냅샷입니다. 다른 팩을 설치한 뒤에도 설정 → 컨텐츠 팩 변경에서 다시 이 팩으로 돌아올 수 있게 해줍니다.

2 · Manifest JSON 2 · 매니페스트 JSON

You can name the JSON anything — my_contents.json, korean_lang.json, sermon_week1.json. When the app activates a pack it copies that file over contents.json internally. JSON 파일명은 자유입니다 — my_contents.json, korean_lang.json, sermon_week1.json 등 무엇이든 가능. 앱이 팩을 활성화하면 해당 파일을 내부적으로 contents.json에 복사합니다.

{
  "title": "한국어 100문장 샘플",
  "defaultimage": "ko/ko.jpg",
  "pages": [
    {
      "audiofile": "ko/k001.m4a",
      "imagefile": "ko/k001.jpg",
      "pagename": "001 · 안녕하세요",
      "texts": [
        "안녕하세요.",
        "Hello."
      ]
    },
    {
      "audiofile": "ko/k002.m4a",
      "imagefile": "ko/k002.jpg",
      "pagename": "002 · 감사합니다",
      "texts": [
        "감사합니다.",
        "Thank you."
      ]
    }
    /* … 98 more pages … */
  ]
}

3 · Field reference 3 · 필드 설명

Field필드 Required필수 Description설명
titlePack title shown in the list header.목록 상단에 표시되는 팩 제목.
defaultimageZip-root-relative path used as the fallback image for pages that omit imagefile or whose image is missing. Example: ko/ko.jpg.페이지의 imagefile이 비어있거나 파일이 없을 때 사용되는 폴백 이미지 경로 (zip 루트 기준). 예: ko/ko.jpg.
pagesArray of page entries; order = listen order.페이지 배열. 순서 = 재생 순서.
pages[].audiofileRelative path to the audio (zip root). mp3/m4a/wav/flac/ogg/aac/opus.오디오 경로 (zip 루트 기준). mp3/m4a/wav/flac/ogg/aac/opus 지원.
pages[].imagefileRelative path to a page image. jpg/png/webp. Omit for text-only pages.페이지 이미지 경로. jpg/png/webp. 생략하면 텍스트만 표시.
pages[].pagenameShort title for the list row and player header.목록과 플레이어 상단에 표시되는 짧은 제목.
pages[].textsString array overlaid on the image (subtitle-style) or shown alone. Empty string "" = blank line.이미지 위 자막처럼 또는 단독으로 표시되는 문자열 배열. 빈 문자열 "" 은 줄바꿈.

4 · Media file tips 4 · 미디어 파일 팁

Audio. sample_ko uses 96 kbps AAC in .m4a — tiny files, universal support on iOS and Android. For speech, 64–96 kbps is plenty. Keep the filename ASCII (no spaces) to avoid cross-platform headaches.

Image. jpg with the long side around 1024–1600 px is the sweet spot. Keep the bottom third relatively empty — that's where the subtitle overlay lands. EXIF rotation is honoured on both platforms.

Naming. Zero-pad numbers (k001, not k1) so a 100-page pack sorts cleanly.

오디오. sample_ko 는 96 kbps AAC (.m4a) — 용량은 작고 iOS·Android 모두 잘 재생합니다. 음성 콘텐츠는 64–96 kbps 면 충분. 파일명은 ASCII, 공백 없이.

이미지. jpg, 긴 변 1024–1600 px 가 적정선. 자막 오버레이가 하단에 들어가므로 그림의 하단 1/3은 비워두는 게 좋습니다. EXIF 회전은 양 플랫폼 모두 자동 반영.

이름 규칙. 번호는 zero-padding (k1 이 아니라 k001) — 100페이지 팩도 정렬이 깔끔해집니다.

5 · Build the zip 5 · zip 빌드

Any zip tool that produces a flat archive (no parent folder) works. On macOS: 상위 디렉토리를 만들지 않는 zip 도구라면 무엇이든 OK. macOS 기준:

# Assemble the pack (from inside the project root)
cd my_pack/
zip -r ../my_pack.zip contents.json my_pack_lang.json ko/

The sample_ko/ directory in the repo ships with build_sample.py and build_sample_zip.py — two small scripts you can read as templates for generating the JSON and rolling the zip. 저장소의 sample_ko/ 디렉토리에 build_sample.pybuild_sample_zip.py 두 스크립트가 있습니다. JSON 생성·zip 빌드 템플릿으로 바로 참고 가능.

6 · Install your pack 6 · 내 팩 설치

Two paths, pick whichever is easier: 둘 중 편한 방식으로:

A · Host and download A · 호스팅 후 다운로드
Upload my_pack.zip somewhere public (GitHub Pages, S3, a local Python server). In the app: Settings → Content download → Custom → paste URL → Download. 공개 URL (GitHub Pages · S3 · 로컬 Python 서버) 에 my_pack.zip 업로드 후, 앱에서 설정 → 컨텐츠 다운로드 → 직접 입력 → URL 붙여넣기 → 다운로드.
B · Transfer & local import B · 전송 후 로컬 불러오기
Move my_pack.zip to the phone via AirDrop / USB / cloud drive. In the app: Settings → Import zip from device → pick the file. AirDrop · USB · 클라우드로 my_pack.zip을 폰으로 옮긴 뒤, 앱에서 설정 → 로컬 zip 파일에서 불러오기 → 파일 선택.

7 · Common pitfalls 7 · 자주 실수하는 포인트

  • Paths in the manifest must match filenames exactly, case included.
  • Don't wrap the files in a parent directory inside the zip (unzip -l should show contents.json at the root).
  • Keep each page's texts lines under ~40 characters if you want them to stay on one line on a phone.
  • Save the JSON in UTF-8 — not UTF-8-BOM, not cp949.
  • 매니페스트의 경로는 실제 파일명과 대소문자까지 완전히 일치해야 합니다.
  • zip 내부에 상위 디렉토리가 생기지 않게 압축 (unzip -l 했을 때 contents.json이 루트에 보여야 함).
  • 한 줄을 그대로 두고 싶다면 texts 각 줄을 40자 이하로 — 넘으면 폰에서 자동 줄바꿈.
  • JSON은 UTF-8 (BOM 없이, cp949 아님) 으로 저장.

💡 Want the exact files behind sample_ko.zip? Download it from the button above and unzip — the JSON + ko/ folder is a complete working reference. 💡 sample_ko.zip 실물을 보고 싶다면 위의 다운로드 버튼으로 받은 zip을 풀어보세요. JSON + ko/ 폴더가 그대로 동작하는 참조 샘플입니다.