跳到正文
GitHub·· 8 天前AI 评分48

Brevia:本地优先的 AI 会议助手,录音不出设备

zerolovesea/Brevia

AI 导读

Brevia 是一款本地优先的桌面 AI 会议助手,同时录制麦克风和系统音频并实时生成字幕,语音识别全部在设备端完成,录音、转录和声纹默认不出本机。它支持 30+ 种语言的转录与会议摘要,会后通过 Pyannote 分割与说话人嵌入模型匹配声纹,为转录标注发言人姓名。摘要可接入 Claude、OpenAI、OpenRouter 或本地内置模型,仅发送文本、不发送音频。

正文

Brevia

A minimal, local-first AI meeting assistant.
AI Notes · live transcription · multilingual · speaker identification · reviewable summaries — no audio leaves your device.

Release License Downloads Platform Electron Python

English · 简体中文 · Español · 日本語 · 한국어 · Français · Deutsch · Русский


About

Brevia is a desktop AI meeting assistant that hands the most time-consuming part of any meeting — capturing, organizing, and revisiting — off to on-device AI. It records microphone and system audio at the same time, streams live captions, and turns the finished conversation into structured notes. AI Notes can surface useful moments while the meeting is still happening. All speech recognition runs locally; recordings, transcripts, and speaker profiles stay on your machine by default.

The design is deliberately quiet: an interface that doesn't get in the way of the meeting, a feature set that follows a single arc — capture → understand → retrieve — and a firm rule that anything that can happen locally should.

Brevia AI Notes demo

Features

AI Notes that stay reviewable

AI Notes watches the live transcript and can surface decisions, action items, key numbers, risks, questions, and topic changes. Choose request-only, gentle prompts, or automatic organization. Suggestions remain reviewable: add only the useful ones to your notes, and write alongside them in rich text or Markdown.

Configure AI Notes and AI Meeting Summary independently: each can use its own provider, model, and API key. With a remote provider, only transcript text and current note context are sent; audio never leaves your device. Local models are loaded on demand, so separate preferences do not keep two models resident at once.

AI Notes

Choosing the recognition model

The first-run setup lists the download-able speech models and pre-checks the one Brevia suggests for your interface language (Silero VAD, speaker diarization, and voiceprint models are bundled and always installed); you can uncheck the rest before downloading.

For each meeting Brevia then picks a default recognition model from the meeting language, declared per model in backend/models.json:

Meeting language Default recognition model Why
Chinese, Cantonese FunASR Nano Highest accuracy on Chinese and its dialects
Japanese, Korean Qwen3-ASR 0.6B The only selectable model covering both
English, Spanish, French, German, Russian, mixed languages Parakeet TDT 0.6B v3 25 European languages in one model, adds punctuation and timestamps
Anything else Qwen3-ASR 0.6B Widest language coverage among the remaining models

On Apple Silicon Macs, speech recognition and Silero VAD use mlx-audio/MLX; Windows keeps Sherpa ONNX. Speaker diarization and voiceprints use Sherpa on both platforms. Upgrading a Mac requires downloading the corresponding MLX recognition model; existing recordings remain available. The segment cap is the smallest of the live setting, the language-specific VAD limit and the model capacity (20 seconds for the macOS MLX models). Automatic language detection waits for at least 2 seconds of silence.

If the declared default is not downloaded yet, Brevia uses an installed model that supports that language instead of asking you to download another one. The meeting setup screen shows a recognition model selector (including models you have not downloaded, listed with their size), and the same selector appears on the live screen and switches the model mid-meeting through meeting.reconfigure. Settings → Advanced → Live recognition (live_asr.max_speech_seconds) can cap how long a single live sentence segment may grow; the effective cap is always the smallest of that value, the per-language VAD setting, and the model's own capacity.

On lower-performance machines, prefer a 2B local AI-notes model or an online provider.

A quiet meeting screen with live transcription and translation

Open it, press record, see complete captions after each speech pause. Brevia captures your microphone and system audio at once, so both sides of a remote call land in the same transcript. Optional live translation renders next to the caption stream for cross-language conversations.

Live meeting and translation

30+ transcription languages and meeting summaries

Brevia transcribes speech in 30+ languages — including English, Chinese, Japanese, Korean, French, German, Spanish, Russian, Arabic, Thai, Vietnamese, and Indonesian. Once a meeting ends, plug in any LLM provider and Brevia will draft a summary, key decisions, and action items from your reviewed transcript.

Built-in AI runs a bundled model on your own machine, or plug in Claude, OpenAI, OpenRouter, or any service that speaks the OpenAI or Anthropic chat format. Only text is sent, never audio.

Meeting notes

Post-meeting speaker identification

Enroll a short voice sample per teammate. After a meeting ends, Brevia separates speakers during post-meeting refinement and matches them to saved voiceprints to label the transcript with their names. Live captions do not distinguish speakers. Voiceprint profiles can be reused across meetings.

Powered by Pyannote segmentation plus speaker-embedding models, all running on-device.

Post-meeting speaker identification

A curated local model library

Downloadable models cover sentence transcription, offline refinement, voice activity detection, speaker diarization, speaker embedding, AI notes and meeting summaries, and caption translation. Mix and match by language and precision — everything runs on your device.

Model library

And more

  • Audio import — bring in existing recordings for offline transcription through the same speech pipeline.
  • Rich exports — transcript and notes as Markdown, TXT, JSON, SRT, DOCX, or PDF; audio as WAV.
  • Reviewable notes — write in rich text or Markdown, then accept only the AI suggestions that help.
  • Meeting library and workspaces — search titles, transcripts, speakers, and tags; organize work into workspaces and restore recently deleted meetings for 30 days.
  • Focused viewing — light and dark themes, inline transcript/summary editing, and an optional floating-caption window keep the meeting view uncluttered.
  • Multilingual UI — English, Simplified Chinese, Spanish, Japanese, Korean, French, German, and Russian.

Install

Download the latest release from GitHub Releases:

Platform Installer
macOS (Apple Silicon) Brevia-<version>-arm64.dmg
Windows (x64) Brevia-<version>-x64-setup.exe

Windows may show a Microsoft Defender SmartScreen prompt on first run. Click "More info" → "Run anyway" after verifying the download came from the official Releases page.

On first launch, grant microphone and screen-recording permissions, then open Settings → Model Library to download the models you need.

Architecture

flowchart LR
  A[Electron renderer<br/>HTML · Tailwind · JS] <-->|IPC + Zod validation| B[Electron main process]
  B <-->|JSONL stdin/stdout| C[Python worker<br/>bundled runtime]
  C --> D[mlx-audio / sherpa-onnx<br/>VAD → sentence ASR · speakers]
  C --> E[Local storage<br/>SQLite · audio · exports]
  C -. explicit consent .-> F[Optional cloud API<br/>AI Assist · summaries · translation]

Loading

Brevia follows a strict local-first design:

  • The renderer opens no network ports, and every IPC message is validated by the Electron main process against a Zod schema.
  • The main process is a thin shell. It launches a single Python worker over JSONL stdin/stdout; the worker owns model management, audio processing, speaker profiles, local storage, and exports.
  • Data lives in ~/brevia by default — SQLite, raw audio, exports, cached models, and voice profiles.
  • Cloud calls are opt-in. AI Assist, LLM summaries, and translation require the user to configure a provider explicitly, and only text is sent upstream.

Tech stack

Layer Technology
Desktop shell Electron 43 — preload bridge, context isolation, sandboxed renderer
Frontend Vanilla HTML/CSS/JS, Tailwind CSS 4, built-in i18n (8 locales)
Backend Python 3.10+, JSONL worker protocol, SQLite storage
Speech engine mlx-audio / MLX (macOS); sherpa-onnx 1.13.8 (Windows), ONNX Runtime
Speaker processing Pyannote segmentation + 3D-Speaker ERes2Net Base embeddings
LLM client Built-in llama.cpp (GGUF) plus OpenAI- / Anthropic-compatible chat APIs
Audio I/O ffmpeg (bundled in releases)
Build & packaging electron-builder, PyInstaller (bundled Python runtime)

Supported models

Sentence transcription, post-meeting refinement, AI notes, and caption translation models are downloaded on demand from Settings → Model Library; voice activity detection, speaker diarization, and speaker-embedding models ship with the app. The manifest lives in backend/models.json.

Category Representative models Languages
Sentence transcription / post-meeting refinement FunASR Nano, Qwen3-ASR 0.6B, Parakeet TDT 0.6B v3 Chinese / multilingual / 25 European languages
Voice activity detection Silero VAD Universal
Speaker diarization Pyannote Segmentation 3.0 Universal
Speaker embeddings 3D-Speaker ERes2Net Base Chinese
AI notes & meeting summary Qwen 3.5 2B, Qwen 3.5 4B Chinese / English
Caption translation Tencent Hy-MT2 1.8B 33 languages

For LLM summaries, pick Built-in AI to run a bundled GGUF model locally (Qwen 3.5 2B / 4B), or point Brevia at Claude, OpenAI, OpenRouter, or any custom service that speaks OpenAI Chat Completions or Anthropic Messages — Gemini (OpenAI-compatible endpoint), DeepSeek, Kimi, Qwen, and more.

Local development

Prerequisites: Node.js 22+, Python 3.10+, Git, and ffmpeg (for audio import).

git clone https://github.com/zerolovesea/Brevia.git
cd Brevia
npm install
python3 -m pip install -r backend/requirements.txt
npm start

On first launch, grant microphone and screen-recording permissions, then choose speech models and the model and meeting folders on the same page. You can change either path later in Settings. Brevia moves existing files to the empty folder you choose and updates the running app without restarting. Keep external drives connected when launching Brevia.

Common scripts

npm test                    # Dead-code gate + Electron behavior + UI + E2E smoke + backend tests
npm run test:e2e            # Launch the real app and assert through CDP
npm run build               # Build Tailwind CSS
npm run test:model          # ASR model diagnostics
npm run test:diarization    # Speaker diarization diagnostics
npm run start:fresh         # Reset the onboarding flow and start

Environment variables

BREVIA_DATA_DIR=/path/to/data       # Custom data dir (recordings, exports, SQLite)
BREVIA_MODELS_DIR=/path/to/models   # Custom model dir
BREVIA_MEETINGS_DIR=/path/to/recordings # Custom recordings and meetings dir
BREVIA_FFMPEG=/path/to/ffmpeg       # ffmpeg binary (if not on PATH)
BREVIA_ASR_BACKEND=cpu              # cpu, cuda, or coreml; mps safely maps to cpu
BREVIA_LLAMA_THREADS=2              # Cap llama.cpp CPU threads (default: min(4, cores/2))
BREVIA_GPU_LAYERS=0                 # Force all llama.cpp layers to CPU

BREVIA_DATA_DIR=~/brevia-dev BREVIA_MODELS_DIR=~/brevia-models npm start

Sentence transcription

Recording uses Silero VAD → one offline ASR decode → one final caption. FunASR Nano is the default for Chinese and Cantonese, Qwen3-ASR 0.6B for Japanese and Korean, and Parakeet TDT 0.6B v3 for English, Spanish, French, German, Russian, and automatic language selection. Punctuation and casing come from the recognizer. MLX FunASR and Qwen also display draft text while decoding a completed segment. There is no separate punctuation model or second live refinement pass.

VAD waits for a speech pause (Chinese: 0.7 seconds; other languages: 0.8 seconds). Continuous speech is capped by the live setting, the language-specific VAD limit and the model capacity. A VAD segment may contain more than one grammatical sentence, and neighbouring sentences are coalesced into one caption: roughly 110 Chinese characters (150 max) or 280 Latin characters (380 max) per caption, so a single short sentence never stands alone. A VAD endpoint is not a paragraph boundary — in real meetings the silence after one has a median of 30–50 ms, which would cut 24-character fragments; only a genuine long pause (≥1.2 s) starts a new paragraph, and a paragraph below the target is submitted after at most 8 seconds. When continuous speech is cut, the next decode reaches ~400 ms back before the cut so a word split across it is recognised again with context; the repeated part is aligned away at the seam. These limits are adjustable under vad in advanced settings. Recognition runs on a separate serial executor; queued speech stays on disk. Pause flushes the current segment, and stop drains all recognition work before marking the meeting ready. Original audio is kept if recognition fails, and a warning identifies the affected interval.

Imported recordings skip speaker diarization automatically when the estimated preparation time — audio length scaled by CPU cores — exceeds the budget, so a long import produces a transcript in seconds instead of making you wait minutes. A smaller built-in AI-notes model can reduce competition for CPU.

See benchmark methodology and results.

Build installers

npm ci
npm run build
python3 -m pip install -r backend/requirements-build.txt
npm run dist:mac   # macOS ARM64 DMG
npm run dist:win   # Windows x64 EXE

Artifacts land in dist/. Each platform build bundles a native Python worker; voice detection, diarization, and voiceprint models ship inside it, while the recognition, refinement, AI-note, and translation models remain on-demand downloads.

FAQ

Windows shows a Microsoft Defender SmartScreen warning

Release builds are not signed with a paid code-signing certificate, and SmartScreen defaults to blocking newly-seen executables. Click "More info" → "Run anyway" after confirming the download came from the official Releases page.

Do I need to install Python separately?

No. Release builds bundle the Python runtime and all required dependencies. A separate Python installation is only needed for running from source.

Where is my data stored?

~/brevia by default. On first launch, you can choose separate folders for models and recordings/meeting files; the SQLite database and voice profiles remain in ~/brevia. Set BREVIA_DATA_DIR to move the data root.

Which transcription languages are supported?

30+ languages including Chinese, English, Japanese, Korean, French, German, Spanish, Russian, Arabic, Thai, Vietnamese, and Indonesian. Pick the matching model from the in-app Model Library.

Does Brevia send audio to the cloud?

No. Speech recognition and diarization run locally. Only LLM summaries and translation contact the network, and only after you configure a provider — text only, never audio.

How much disk space do models need?

Depends on which you install. A sentence recognizer is the main download; voice detection, speaker diarization, and voiceprint models are bundled, and optional AI-note models add to disk usage. Use the model library’s size estimates for your selection.

Can I import existing recordings?

Yes. Import audio files from the meeting library and Brevia will transcribe them offline through the same speech pipeline. Requires ffmpeg on PATH (or set BREVIA_FFMPEG).

How do I switch the UI language?

Settings → General → Interface language. English, Simplified Chinese, Spanish, Japanese, Korean, French, German, and Russian are available.

How are voiceprint samples stored?

Voice embeddings (a small float vector) and reference audio live in the local SQLite database and filesystem. Nothing leaves the device, and deleting a profile removes the associated data.

The recording has sound, but live captions are empty in an in-person meeting

Live captions consume a separately processed audio path: the microphone signal is gain-compensated for the recognizer while the recording keeps the raw audio. Very faint or distant speech can therefore be too quiet for the live recognizer even though the recording is audible. This is more likely in a live room with echo/ambience.

Adjust the microphone compensation under Settings → Advanced (live_asr.microphone_target_rms, microphone_minimum_rms, microphone_max_gain), or move the microphone closer.

The recording and post-meeting refinement are unaffected, so you won't lose the transcript.

Feedback and contributing

Report an issue

Found a bug or have a feature request? Please file it in GitHub Issues. Reports triage faster when they include:

  • OS and version (e.g. macOS 14.5 / Windows 11 23H2)
  • Brevia version (Settings → About)
  • Models and language in use
  • Steps to reproduce / expected result / actual result
  • Relevant logs (Settings → Advanced → Open log folder) — please review them for sensitive content before attaching

Security issues: please do not open a public issue. Reach out to the maintainer by email.

Contributing

Read the repository-wide coding and formatting conventions before making changes.

For mobile changes, follow the mobile development and submission guide, including PR checks, automatic TestFlight distribution, Android artifacts, and release troubleshooting.

Pull requests are welcome. To keep the tree tidy:

  1. Branch from main with a narrow focus — one concern per PR.
  2. Run npm test before submitting; run npm run test:model and npm run test:diarization when touching ASR or diarization.
  3. Do not commit downloaded models, recordings, exports, API keys, or anything from ~/brevia.
  4. When you change user-facing copy, update all eight locales in frontend/i18n-data.js — add the English source string and its translations together.
  5. Note any model, platform, or permission impact in the PR description.

License

Brevia is released under the ISC License. Model files and third-party packages retain their own licenses and terms.

Acknowledgments

  • sherpa-onnx — the local runtime powering ASR, VAD, and speaker processing. Licensed under Apache-2.0.
  • Thanks to the model authors and maintainers whose downloadable artifacts are declared in backend/models.json, including Qwen3-ASR, FunASR, Parakeet (NeMo), Pyannote, 3D-Speaker, Silero, Qwen, and Tencent Hy-MT2.
  • Electron, ONNX Runtime, Python, and the open-source speech community make this local-first workflow possible.

来源:GitHub · github.com