Ứ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.2.0_aarch64.dmg |
⬇ Download |
| 🪟 Windows | 64-bit | Scribble_1.2.0_x64-setup.exe |
⬇ Download |
| 🐧 Linux | 64-bit (AppImage) | Scribble_1.2.0_amd64.AppImage |
⬇ Download |
| 🐧 Linux | 64-bit (deb) | scribble_1.2.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 + biên bản tự động. 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ữ) hoặc Soniox (chất lượng cao, ~$0.12/giờ) |
| 👥 Nhận diện người nói | Speaker diarization realtime (ONNX Runtime + CAM++) — tự phân biệt giọng nói |
| 🌐 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. Hỗ trợ template 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ờ |
🔒 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)
- Diarize → CAM++ ONNX + clustering toàn cuộc họp
- Summarize → LLM tự sinh biên bản
- 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 + embedding 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.2.0_aarch64.dmg |
⬇ Download |
| 🪟 Windows | 64-bit | Scribble_1.2.0_x64-setup.exe |
⬇ Download |
| 🐧 Linux | 64-bit (AppImage) | Scribble_1.2.0_amd64.AppImage |
⬇ Download |
| 🐧 Linux | 64-bit (deb) | scribble_1.2.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 → automatic transcription + minutes. Resumable pipeline (survives app restart), per-chunk timestamps (every ~22s) |
| 📝 Auto Transcription | Nvidia Riva STT (streaming gRPC, 13+ languages) or Soniox (premium quality, ~$0.12/hr) |
| 👥 Speaker Diarization | Real-time speaker identification (ONNX Runtime + CAM++) — auto-detects voice changes |
| 🌐 Cabin Translation | Nvidia NMT — 10+ languages, real-time streaming |
| 📋 AI Minutes | Auto-summarize: title, key points, action items, decisions, risks, next steps. Templates: 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 |
🔒 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)
- Diarize → CAM++ ONNX + global clustering
- Summarize → LLM auto-generates minutes
- Progress streams via SSE — closing the app is fine, reopen the meeting and Resume picks up where it left off
Highlights:
- Per-chunk save (transcript + embedding) → 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.
MIT
