Ứng dụng ghi chú cuộc họp thông minh — ghi âm, phiên dịch realtime, dịch cabin đa ngôn ngữ và tạo biên bản tự động bằng AI.
Smart meeting notes app — record, real-time transcription, multi-language cabin translation, and AI-powered meeting minutes generation.
🇻🇳 Tiếng Việt · 🇬🇧 English
| Hệ điều hành | Chip / Kiến trúc | File cài đặt | Link |
|---|---|---|---|
| 🍎 macOS | Apple Silicon (M1/M2/M3/M4) | Scribble_1.3.0_aarch64.dmg |
⬇ Download |
| 🪟 Windows | 64-bit | Scribble_1.3.0_x64-setup.exe |
⬇ Download |
| 🐧 Linux | 64-bit (AppImage) | Scribble_1.3.0_amd64.AppImage |
⬇ Download |
| 🐧 Linux | 64-bit (deb) | scribble_1.3.0_amd64.deb |
⬇ Download |
⚠️ Lưu ý macOS: Lần đầu mở app nếu gặp cảnh báo "Scribble Not Opened", mở Terminal và chạy:xattr -cr /Applications/Scribble.appHoặc vào System Settings → Privacy & Security → scroll xuống → Allow Anyway.
| Tính năng | Mô tả |
|---|---|
| 🎙️ Ghi âm realtime | Voice Activity Detection — tự cắt chunk theo silence |
| 📤 Upload file ghi âm | Tải lên m4a/mp3/wav/mp4 có sẵn → phiên âm; tạo biên bản là tùy chọn (mặc định tắt, không phải chờ). Resume khi pipeline bị gián đoạn, lưu transcript theo từng chunk (timestamps mỗi 22s) |
| 📝 Phiên dịch tự động | Nvidia Riva STT (streaming gRPC, 13+ ngôn ngữ), Soniox (chất lượng cao, ~$0.12/giờ), hoặc Local (offline) — chạy trên máy, không cần API key/mạng |
| 👥 Nhận diện người nói | Speaker diarization (ONNX Runtime + CAM++ zh-cn) cho cả realtime lẫn upload — tối ưu tiếng Việt & ngôn ngữ châu Á |
| Phát lại audio, transcript tự cuộn theo; bấm mốc thời gian để tua đúng đoạn | |
| 🌐 Dịch cabin realtime | Nvidia NMT — dịch 10+ ngôn ngữ, realtime |
| 📋 Biên bản AI | Tóm tắt: tiêu đề, key points, action items, decisions, risks, next steps. Template mặc định "Phân tích chi tiết"; hỗ trợ MoM / Deep / Summary / Bullets / Custom |
| 📎 Tài liệu tham khảo | Attach file .md / .txt vào meeting làm context cho AI — agenda, brief, glossary, prior decisions. Tối đa 1MB/file, 2MB tổng |
| 📦 Export đa định dạng | Markdown (.md) và Word (.docx) |
| 💾 Lưu nháp tự động | Auto-save transcript vào DB, khôi phục khi crash |
| ✏️ Sửa/Xóa transcript | Inline edit từng dòng, auto-sync |
| 🔊 Lưu file ghi âm | Download audio từ meeting history |
| 🛡️ Lọc hallucination | Loại bỏ hallucination tự động |
| ⚡ Zero manual setup | Cài là chạy ngay — chỉ cần nhập API key + tên model trong Settings, không có script SQL/flag ẩn |
- Node.js 20+ & pnpm
- Python 3.10+
- Rust (cài từ rustup.rs)
git clone https://github.com/luongndcoder/Scribble.git
cd Scribble
pnpm install
# Chạy Python sidecar
cd src-python
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python main.py # → http://127.0.0.1:8765
# Chạy Tauri dev (tab khác)
cd ..
pnpm tauri devgit clone https://github.com/luongndcoder/Scribble.git
cd Scribble
docker-compose up --build
# → http://localhost:3000Dữ liệu SQLite lưu trong
./data/. API key nhập từ giao diện Settings.
# 1. Build sidecar
cd src-python
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python -m PyInstaller scribble-sidecar.spec --noconfirm --clean
# 2. Copy sidecar vào Tauri
cp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-aarch64-apple-darwin
# 3. Build DMG
cd ..
pnpm install
npx tauri build -b dmg
# → src-tauri/target/release/bundle/dmg/Scribble_*.dmg# 1. Build sidecar
cd src-python
python -m venv .venv && .venv\Scripts\activate
pip install -r requirements.txt
python -m PyInstaller scribble-sidecar.spec --noconfirm --clean
# 2. Copy sidecar vào Tauri
copy dist\scribble-sidecar.exe ..\src-tauri\binaries\scribble-sidecar-x86_64-pc-windows-msvc.exe
# 3. Build NSIS installer
cd ..
pnpm install
npx tauri build -b nsis --target x86_64-pc-windows-msvc
# → src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe# 1. Build sidecar
cd src-python
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python -m PyInstaller scribble-sidecar.spec --noconfirm --clean
# 2. Copy sidecar vào Tauri
cp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-x86_64-unknown-linux-gnu
# 3. Build AppImage + deb
cd ..
pnpm install
npx tauri build
# → src-tauri/target/release/bundle/appimage/*.AppImage
# → src-tauri/target/release/bundle/deb/*.deb💡 CI/CD: Windows và Linux build tự động qua GitHub Actions, trigger bằng
workflow_dispatch.
| Backend | Đặc điểm | Yêu cầu | Chi phí |
|---|---|---|---|
| ☁️ Nvidia Riva | Streaming gRPC, 13+ ngôn ngữ, speaker diarization, Parakeet CTC 0.6B cho tiếng Việt | API key từ build.nvidia.com | Free tier hào phóng |
| 🎯 Soniox | Chất lượng tốt nhất, đa ngôn ngữ trong cùng 1 audio, diarization tích hợp | API key từ soniox.com | ~$0.12/giờ |
| 💻 Local (offline) | Chạy hoàn toàn trên máy — không cần API key/mạng, riêng tư. nemotron MLX đa ngôn ngữ (macOS Apple Silicon, tải 1 lần ~720MB) hoặc sherpa-onnx tiếng Việt (bundled sẵn) | Không cần key | Miễn phí |
🔒 Bảo mật: API key của bạn được lưu trữ hoàn toàn trên máy tính của bạn. Chúng tôi không thu thập, gửi đi hay sử dụng API key của bạn cho bất kỳ mục đích nào.
Cấu hình qua Settings — UI 2 cột (STT bên trái, AI bên phải) — không phải scroll:
| Field | Ví dụ | Mô tả |
|---|---|---|
| Provider | OpenAI / DeepSeek / Mistral / Groq / Gemini / OpenRouter / Compatible | Chọn nhà cung cấp |
| API Key | sk-xxx |
API key LLM |
| Base URL | https://api.openai.com/v1 |
Chỉ cần cho "Tương thích OpenAI" |
| Model | gpt-4o-mini / deepseek-chat / ... |
Tên model — click dropdown để tải danh sách model khả dụng |
Hỗ trợ mọi provider OpenAI-compatible: OpenAI, DeepSeek, Mistral, Groq, Gemini, OpenRouter, Together, Ollama local, ...
- Tab Recording → bật "Dịch cabin" → chọn ngôn ngữ
- Ghi âm → bản dịch stream realtime dưới mỗi dòng transcript
Ngôn ngữ: 🇬🇧 English · 🇯🇵 Nhật · 🇰🇷 Hàn · 🇨🇳 Trung · 🇫🇷 Pháp · 🇩🇪 Đức · 🇪🇸 TBN · 🇹🇭 Thái · 🇮🇩 Indo · 🇷🇺 Nga · 🇸🇦 Ả Rập · 🇮🇳 Hindi
Có sẵn file audio/video → không cần ghi âm lại. Pipeline tự xử lý:
- Trang Cuộc họp → bấm "Upload file" (góc phải)
- Chọn file (m4a / mp3 / wav / mp4 / mkv / webm — tối đa 2GB), tiêu đề, ngôn ngữ
- Pipeline chạy tự động:
- Normalize → 16kHz mono WAV
- Split → cắt chunk theo silence (ffmpeg silencedetect, target 22s)
- Transcribe → STT song song 3 chunks/lần (Nvidia Riva streaming / Local)
- Diarize → CAM++ ONNX, phân tách theo cửa sổ 2s (fine-grained)
- Summarize → LLM sinh biên bản (tùy chọn — bật khi upload, mặc định tắt)
- Tiến độ stream qua SSE — đóng app vẫn tiếp tục, mở lại meeting để Resume từ chunk dở dang
Đặc điểm:
- Mỗi chunk lưu transcript ngay khi xong → crash recovery hoàn hảo
- Timestamps mỗi 22s trong transcript (vd
1:24 – 1:46) - Idempotent: upload file trùng (cùng SHA-256) → tự redirect về meeting cũ
- Cross-platform: m4a/mp4 đều OK trên Windows / Linux / macOS
Cho AI thêm context khi tạo biên bản — agenda, project brief, glossary, prior decisions:
- Mở meeting → tab Biên bản → mục "Tài liệu tham khảo"
- Bấm "+ Thêm tài liệu" → chọn file
.md/.txt(tối đa 1 MB/file, 2 MB tổng/meeting, 10 file) - Bấm "Tạo biên bản" (regenerate) — AI dùng tài liệu này làm context
AI sẽ:
- Dùng tên/thuật ngữ trong tài liệu làm source of truth (sửa lỗi STT mistranscribe tên riêng)
- Cross-reference cuộc họp với agenda — mục nào đã thảo luận, mục nào skip
- Call out khi decision khác với đề xuất trong brief
- Liệt kê tài liệu đã dùng ở cuối biên bản
⚠️ Cảnh báo token: khi total > 400KB, UI hiện warning vì model 128k context (vd gpt-4o-mini) có thể bị cắt — cân nhắc dùng Claude/Gemini context lớn hơn.
| OS | Architecture | Installer | Link |
|---|---|---|---|
| 🍎 macOS | Apple Silicon (M1/M2/M3/M4) | Scribble_1.3.0_aarch64.dmg |
⬇ Download |
| 🪟 Windows | 64-bit | Scribble_1.3.0_x64-setup.exe |
⬇ Download |
| 🐧 Linux | 64-bit (AppImage) | Scribble_1.3.0_amd64.AppImage |
⬇ Download |
| 🐧 Linux | 64-bit (deb) | scribble_1.3.0_amd64.deb |
⬇ Download |
⚠️ macOS note: If you see "Scribble Not Opened" on first launch, open Terminal and run:xattr -cr /Applications/Scribble.appOr go to System Settings → Privacy & Security → scroll down → Allow Anyway.
| Feature | Description |
|---|---|
| 🎙️ Real-time Recording | Voice Activity Detection — auto-splits chunks on silence |
| 📤 Upload Audio Files | Upload existing m4a/mp3/wav/mp4 → transcription; minutes generation optional (off by default, no waiting). Resumable pipeline (survives app restart), per-chunk timestamps (every ~22s) |
| 📝 Auto Transcription | Nvidia Riva STT (streaming gRPC, 13+ languages), Soniox (premium quality, ~$0.12/hr), or Local (offline) — on-device, no API key/network |
| 👥 Speaker Diarization | Speaker identification (ONNX Runtime + CAM++ zh-cn) for both realtime and upload — tuned for Vietnamese & Asian languages |
| Play back audio with the transcript auto-scrolling to follow; click a timestamp to seek to that part | |
| 🌐 Cabin Translation | Nvidia NMT — 10+ languages, real-time streaming |
| 📋 AI Minutes | Auto-summarize: title, key points, action items, decisions, risks, next steps. Default template "Deep Analysis"; supports MoM / Deep / Summary / Bullets / Custom |
| 📎 Reference Materials | Attach .md / .txt docs to a meeting as AI context — agendas, briefs, glossaries, prior decisions. Max 1MB/file, 2MB/meeting total |
| 📦 Multi-format Export | Markdown (.md) and Word (.docx) |
| 💾 Auto-save Drafts | Transcript saved to DB incrementally, resilient to crashes |
| ✏️ Edit/Delete Transcript | Inline edit per line, auto-sync |
| 🔊 Audio Recording | Download audio from meeting history |
| 🛡️ Hallucination Filter | Auto-removes STT hallucinations |
| ⚡ Zero Manual Setup | Install and go — only API keys + model names in Settings. No SQL scripts, no hidden flags |
- Node.js 20+ & pnpm
- Python 3.10+
- Rust (install from rustup.rs)
git clone https://github.com/luongndcoder/Scribble.git
cd Scribble
pnpm install
# Run Python sidecar
cd src-python
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python main.py # → http://127.0.0.1:8765
# Run Tauri dev (another tab)
cd ..
pnpm tauri devgit clone https://github.com/luongndcoder/Scribble.git
cd Scribble
docker-compose up --build
# → http://localhost:3000SQLite data stored in
./data/. API keys configured via Settings UI.
# 1. Build sidecar
cd src-python
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python -m PyInstaller scribble-sidecar.spec --noconfirm --clean
# 2. Copy sidecar to Tauri
cp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-aarch64-apple-darwin
# 3. Build DMG
cd ..
pnpm install
npx tauri build -b dmg
# → src-tauri/target/release/bundle/dmg/Scribble_*.dmg# 1. Build sidecar
cd src-python
python -m venv .venv && .venv\Scripts\activate
pip install -r requirements.txt
python -m PyInstaller scribble-sidecar.spec --noconfirm --clean
# 2. Copy sidecar to Tauri
copy dist\scribble-sidecar.exe ..\src-tauri\binaries\scribble-sidecar-x86_64-pc-windows-msvc.exe
# 3. Build NSIS installer
cd ..
pnpm install
npx tauri build -b nsis --target x86_64-pc-windows-msvc
# → src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*.exe# 1. Build sidecar
cd src-python
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python -m PyInstaller scribble-sidecar.spec --noconfirm --clean
# 2. Copy sidecar to Tauri
cp dist/scribble-sidecar ../src-tauri/binaries/scribble-sidecar-x86_64-unknown-linux-gnu
# 3. Build AppImage + deb
cd ..
pnpm install
npx tauri build
# → src-tauri/target/release/bundle/appimage/*.AppImage
# → src-tauri/target/release/bundle/deb/*.deb💡 CI/CD: Windows and Linux builds run automatically via GitHub Actions, triggered by
workflow_dispatch.
| Backend | Highlights | Requirements | Cost |
|---|---|---|---|
| ☁️ Nvidia Riva | Streaming gRPC, 13+ languages, speaker diarization, Parakeet CTC 0.6B for Vietnamese | API key from build.nvidia.com | Generous free tier |
| 🎯 Soniox | Best-in-class accuracy, multi-lang mixed audio, built-in diarization | API key from soniox.com | ~$0.12/hr |
| 💻 Local (offline) | Runs fully on-device — no API key/network, private. Multilingual nemotron MLX (macOS Apple Silicon, one-time ~720MB download) or bundled Vietnamese sherpa-onnx | No key needed | Free |
🔒 Privacy: Your API keys are stored entirely on your local machine. We never collect, transmit, or use your API keys for any purpose.
Configure via Settings — 2-column layout (STT left, AI right) — no scrolling:
| Field | Example | Description |
|---|---|---|
| Provider | OpenAI / DeepSeek / Mistral / Groq / Gemini / OpenRouter / Compatible | Pick a provider |
| API Key | sk-xxx |
LLM provider API key |
| Base URL | https://api.openai.com/v1 |
Only for "OpenAI Compatible" |
| Model | gpt-4o-mini / deepseek-chat / ... |
Click the dropdown to fetch available models |
Supports any OpenAI-compatible provider: OpenAI, DeepSeek, Mistral, Groq, Gemini, OpenRouter, Together, local Ollama, etc.
- Go to Recording tab → enable "Cabin Translation" toggle → select target language
- Start recording → translations stream in real-time below each transcript line
Languages: 🇬🇧 English · 🇯🇵 Japanese · 🇰🇷 Korean · 🇨🇳 Chinese · 🇫🇷 French · 🇩🇪 German · 🇪🇸 Spanish · 🇹🇭 Thai · 🇮🇩 Indonesian · 🇷🇺 Russian · 🇸🇦 Arabic · 🇮🇳 Hindi
Have an existing audio/video file? Skip live recording — the pipeline handles it:
- Meetings page → click "Upload file" (top right)
- Pick file (m4a / mp3 / wav / mp4 / mkv / webm — up to 2GB), title, language
- Pipeline runs automatically:
- Normalize → 16kHz mono WAV
- Split → silence-aligned chunks (ffmpeg silencedetect, ~22s target)
- Transcribe → 3 concurrent STT calls (Nvidia Riva streaming / Local)
- Diarize → CAM++ ONNX, fine-grained 2s windows
- Summarize → LLM generates minutes (optional — opt-in at upload, off by default)
- Progress streams via SSE — closing the app is fine, reopen the meeting and Resume picks up where it left off
Highlights:
- Per-chunk transcript save → perfect crash recovery
- Per-chunk timestamps in transcript (e.g.
1:24 – 1:46) - Idempotent: re-uploading the same file (matching SHA-256) redirects to the existing meeting
- Cross-platform: m4a/mp4 work on Windows / Linux / macOS
Give the AI extra context when generating minutes — agendas, project briefs, glossaries, prior decisions:
- Open a meeting → Minutes tab → "Reference materials" section
- Click "+ Add file" → pick a
.md/.txt(max 1 MB/file, 2 MB total/meeting, 10 files) - Click "Create Minutes" (regenerate) — AI now uses these as context
The AI will:
- Treat names/terminology from your docs as source of truth (correcting STT mistranscriptions of proper nouns)
- Cross-reference the meeting against the agenda — note what was covered vs. skipped
- Call out when a decision diverges from what the brief proposed
- List which reference files it used at the bottom of the minutes
⚠️ Token warning: past 400KB total, the UI surfaces a warning — 128k-context models (e.g. gpt-4o-mini) may truncate. Consider larger-context models (Claude, Gemini).
Scribble/
├── src/ # React + TypeScript frontend
│ ├── components/
│ │ ├── MeetingList.tsx # Meeting history + Upload button
│ │ ├── MeetingDetail.tsx # Compact toolbar (back + tabs + actions)
│ │ ├── MeetingAttachments.tsx # Reference materials (collapsible)
│ │ ├── UploadAudioModal.tsx # File picker + pipeline progress SSE
│ │ ├── RecordingBar.tsx # Slim merged rec + translation bar
│ │ ├── StartupStatusBar.tsx # Bottom-dock startup status strip
│ │ ├── SettingsPanel.tsx # 2-column STT | AI settings
│ │ └── TranscriptView.tsx # Per-chunk transcript w/ timestamps
│ ├── stores/appStore.ts # Zustand state (incl. backendOnline)
│ └── lib/
│ ├── attachments.ts # Reference materials client
│ ├── upload-audio.ts # Audio upload + SSE bridge
│ └── sidecar.ts # Sidecar HTTP/WS helpers
├── src-python/ # Python FastAPI sidecar
│ ├── main.py # FastAPI server, lifecycle, WS handlers
│ ├── db.py # SQLite singleton + migrations
│ ├── stt.py # STT (Nvidia Riva streaming, Soniox)
│ ├── diarize.py # Realtime speaker ID (CAM++ ONNX)
│ ├── translate.py # Nvidia NMT
│ ├── summarize.py # LLM minutes (MoM/Deep/Summary, MapReduce)
│ ├── api/
│ │ ├── upload.py # /meetings/upload-audio, SSE job events
│ │ ├── attachments.py # /meetings/{id}/attachments CRUD
│ │ ├── transcription.py # /summarize, /translate
│ │ ├── settings.py # Settings CRUD + provider URLs
│ │ ├── meetings.py # Meetings CRUD + audio download
│ │ └── diagnose.py # /test-stt, /test-llm
│ ├── services/
│ │ ├── upload_pipeline.py # Normalize → split → STT → diarize → summarize
│ │ ├── vad_splitter.py # ffmpeg silencedetect chunker (22s target)
│ │ ├── batch_diarizer.py # scipy clustering on CAM++ embeddings
│ │ ├── job_registry.py # In-memory job state + SSE queue
│ │ ├── upload_storage.py # Streaming write + sha256 + sanitize
│ │ └── audio.py # find_ffmpeg helper (cross-platform)
│ ├── models/ # ONNX model files (voxceleb_CAM++)
│ └── scribble-sidecar.spec # PyInstaller build spec (onedir)
├── src-tauri/ # Tauri Rust shell
│ ├── src/
│ │ ├── lib.rs # App entrypoint, sidecar extraction
│ │ └── upload.rs # Streaming multipart upload to sidecar
│ ├── tauri.conf.json # App config, icons, bundle settings
│ └── binaries/ # Platform sidecar binaries (tar.gz onedir)
├── .github/workflows/ # CI/CD (Windows + Linux builds)
└── package.json
This project was inspired by and incorporates ideas from:
- Meetily by Zackriya Solutions — UI/UX design patterns, summarization prompt engineering techniques, and chunking strategies for long transcripts.
The offline Vietnamese speech recognition (Settings → Local (offline)) uses the sherpa-onnx Zipformer Vietnamese (30M, int8) model by hynt/Zipformer-30M-RNNT-6000h, packaged via sherpa-onnx (Apache-2.0). The model is licensed CC BY-NC-ND 4.0 (non-commercial, attribution required, no derivatives) — bundled and used unmodified for offline transcription.
MIT
