YzW040879 downloadsEmbed a live meeting workspace in your notes: local recording, real-time Volcengine speech recognition, AI stage summaries, and meeting notes from recordings.
English | 简体中文
A live meeting workspace that lives inside your Markdown notes. Record locally, transcribe in real time, get AI summaries every few minutes, and turn a meeting or an existing recording into structured notes. You bring your own speech recognition and language model accounts, added by picking a service and pasting its key; the plugin itself is free.
Desktop only. Developed and tested on macOS; Windows and Linux are supported in code but have not been tested, so reports from those systems are welcome. Requires Obsidian 1.11.4 or later. The interface is in English or Simplified Chinese and follows Obsidian's language.
meeting-live code block renders as an interactive card in Live Preview and Reading view, showing the live transcript. Keep writing above and below it. A folded-away ### Recording heading sits right above the block, so the outline and other heading navigation lead back to the card. A new card starts folded into a one-line capsule with the status, clock and controls, and a two-line caption of the latest speech while recording; click it to expand.Everything starts in Settings → Meeting Live → Accounts.
The key is kept in Obsidian's secret storage, never in the plugin's settings file. A key check may contact the selected service when you add an account; audio and transcript data are sent only when you start a feature that uses them and agree to the destination.
One key covers all the jobs listed for it (taken from each service's documentation).
| Service | Live | Files | Model | Get a key |
|---|---|---|---|---|
| Alibaba Cloud Bailian (China or International) | ✓ | ✓ | ✓ Qwen | China, International |
| Volcengine speech | ✓ | ✓ | console | |
| Deepgram | ✓ | ✓ | console | |
| AssemblyAI | ✓ | ✓ | dashboard | |
| OpenAI | ✓ | ✓ | API keys | |
| Groq | ✓ | ✓ | console | |
| DeepSeek, Anthropic, Gemini, OpenRouter, xAI Grok, Mistral | ✓ | DeepSeek, Anthropic, Gemini, OpenRouter, xAI, Mistral | ||
| Kimi, Zhipu GLM, SiliconFlow, MiniMax (China or International) | ✓ | Kimi, GLM, SiliconFlow, MiniMax (the International pages are linked from the add form) | ||
| Volcengine Ark (Doubao) | ✓ | Ark console; a separate service from Volcengine speech, with its own key | ||
| Azure OpenAI | ✓ | Azure portal → your resource → Keys and Endpoint; fill in the resource address and, as the model, the deployment name | ||
| Custom (OpenAI-compatible) | ✓ | ✓ | Any server with /audio/transcriptions or /chat/completions: its address and key |
|
| Local (sherpa-onnx) | ✓ | No key; address prefilled. Set-up steps | ||
| Local Whisper (whisper.cpp) | ✓ | No key; address prefilled | ||
| Local speech (OpenAI-compatible) | ✓ | ✓ | Needs a key. Address prefilled, and editable. Check is GET /v1/models: the key is wrong, or the service is not running. Text after a pause, timed, no speaker labels |
|
| Ollama, LM Studio | ✓ | No key; address prefilled. Set the input limit to your model's real context length |
Volcengine speech and the Ark language model are different services with different keys; so are the two regions of Alibaba Cloud, Kimi, GLM, SiliconFlow and MiniMax, which is why those ask where the key was made.
| Service | Check on paste | Free? |
|---|---|---|
| DeepSeek, OpenAI, Anthropic, Gemini, OpenRouter, Kimi, SiliconFlow, MiniMax (International), xAI, Mistral, Groq, Azure, Ollama, LM Studio, Custom | GET /models with the key (OpenRouter: /key), which also fills the model picker |
No charge is documented for it; it runs no model |
| Alibaba Cloud Bailian | GET /api/v1/models, the model list of its own API |
Same |
| Deepgram | GET /v1/auth/token, documented as "a quick test to see if your key is validating correctly" |
Same |
| AssemblyAI | GET /v2/transcript?limit=1, a read |
Same |
| Volcengine speech | A WebSocket handshake with no audio, trying the 2.0 streaming resource volc.seedasr.sauc.duration and then the 1.0 one volc.bigasr.sauc.duration, and keeping the one that is accepted (an account that already has a resource keeps it if it works) |
Billing is by audio duration and nothing is sent, but the documentation does not say a bare connection is free |
| Zhipu GLM, Volcengine Ark, MiniMax (China) | None documented. Test sends one tiny chat request | May count as usage |
| Local services | Whether the address answers (sherpa-onnx: a connection with no audio). Local speech: GET /v1/models; 401 means the key is wrong, and no connection means the service is not running |
Free |
Recorded-file resources (Volcengine volc.seedasr.auc or volc.bigasr.auc) have no free check; a new account that falls back to the 1.0 streaming resource gets the 1.0 file resource with it, which is an inference from the naming.
The language-model account has a model list fetched from the service when you pick the account or press refresh, and a short list of common models when it cannot be fetched. Other model… takes any name. Speech models use each service's defaults and are under the account's advanced settings.
Collapsed by default, per account (the gear on its row) and for the whole plugin (Advanced at the bottom): server addresses, extra request headers, temperature, reasoning effort, input limit, Volcengine's old-console App ID and Access Token and its end-of-sentence window, speaker labels, model names, the AssemblyAI EU region, upload size limits, and for the whole plugin recording format, voice processing, hotwords, meeting background, corrections and recognition language; Volcengine accounts also take the IDs of a console hotword table and replacement table.
qwen-audio-3.1-asr-flash-streaming (hotwords supported, language from Recognition language), files use fun-asr (separates speakers; the recording is converted to mono Opus first and goes through Alibaba Cloud's temporary storage, kept 48 hours, up to 1 GB; the documentation calls this suitable for development and testing).universal-3-5-pro (Mandarin and Japanese among its languages, hotwords, optional speaker labels); billing follows how long the connection is open. Files up to 2.2 GB, speakers on request.nova-3; the language follows Recognition language, and auto-detect uses the multilingual mode. Files up to 2 GB; processing over 10 minutes times out.whisper-1 (OpenAI) and whisper-large-v3 (Groq) are the defaults. OpenAI lists whisper-1 as deprecated, shutting down 2027-02-26; its replacement gpt-transcribe is not documented to return times, which a timed transcript needs. gpt-4o-transcribe-diarize separates speakers. The upload limit is 25 MB and can be changed in advanced settings.The prompts for summaries and minutes have defaults that are short and language-neutral: the model answers in the language of the transcript. Replace them with your own.
Free, offline and without an account or key: the audio never leaves your computer. Each of the two programs below is started by you; the plugin neither installs nor starts them. In Settings → Meeting Live → Add account…, add Local (sherpa-onnx) for live transcription and Local Whisper (whisper.cpp) for recorded files. The addresses are prefilled.
sherpa-onnx ships ready-made programs for macOS, Windows and Linux, and its streaming model below handles Chinese and English with punctuation in about 134 MB, in real time on an ordinary CPU. (FunASR's runtime server was the other candidate; its documentation only describes running it in Docker, which is harder to set up.) Tested on macOS with Apple silicon only; the Windows and Linux steps follow the same release page and have not been run.
macOS (Apple silicon; for an Intel Mac replace osx-arm64 with osx-x64):
mkdir -p ~/meeting-live-asr && cd ~/meeting-live-asr
curl -LO https://github.com/k2-fsa/sherpa-onnx/releases/download/v2.0.1/sherpa-onnx-v2.0.1-osx-arm64-shared-no-tts.tar.bz2
curl -LO https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-x-asr-480ms-streaming-zipformer-transducer-zh-en-punct-int8-2026-06-05.tar.bz2
tar xjf sherpa-onnx-v2.0.1-osx-arm64-shared-no-tts.tar.bz2
tar xjf sherpa-onnx-x-asr-480ms-streaming-zipformer-transducer-zh-en-punct-int8-2026-06-05.tar.bz2
# start the server (leave this window open while you record)
M=sherpa-onnx-x-asr-480ms-streaming-zipformer-transducer-zh-en-punct-int8-2026-06-05
./sherpa-onnx-v2.0.1-osx-arm64-shared-no-tts/bin/sherpa-onnx-online-websocket-server \
--port=6006 --num-work-threads=2 --num-threads=2 \
--tokens=$M/tokens.txt --encoder=$M/encoder.int8.onnx --decoder=$M/decoder.onnx --joiner=$M/joiner.int8.onnx
If you download the files in a browser instead of curl, macOS quarantines them: run xattr -dr com.apple.quarantine ~/meeting-live-asr once.
Linux (x86-64, untested): the same commands with linux-x64-shared-no-tts in place of osx-arm64-shared-no-tts.
Windows (x86-64, untested), in PowerShell:
mkdir $HOME\meeting-live-asr; cd $HOME\meeting-live-asr
curl.exe -LO https://github.com/k2-fsa/sherpa-onnx/releases/download/v2.0.1/sherpa-onnx-v2.0.1-win-x64-shared-MT-Release-no-tts.tar.bz2
curl.exe -LO https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-x-asr-480ms-streaming-zipformer-transducer-zh-en-punct-int8-2026-06-05.tar.bz2
tar -xf sherpa-onnx-v2.0.1-win-x64-shared-MT-Release-no-tts.tar.bz2
tar -xf sherpa-onnx-x-asr-480ms-streaming-zipformer-transducer-zh-en-punct-int8-2026-06-05.tar.bz2
$M = "sherpa-onnx-x-asr-480ms-streaming-zipformer-transducer-zh-en-punct-int8-2026-06-05"
.\sherpa-onnx-v2.0.1-win-x64-shared-MT-Release-no-tts\bin\sherpa-onnx-online-websocket-server.exe --port=6006 --num-work-threads=2 --num-threads=2 --tokens=$M/tokens.txt --encoder=$M/encoder.int8.onnx --decoder=$M/decoder.onnx --joiner=$M/joiner.int8.onnx
The server is ready when it prints Started!. In the plugin the address is ws://127.0.0.1:6006; Check tests it for free. Things to know:
whisper.cpp's whisper-server speaks the OpenAI transcription format, runs on macOS, Windows and Linux, and needs one model file. Tested on macOS with the base model (148 MB, the one in the commands below). small (488 MB, ggml-small.bin from the same address) should be more accurate but was not tried.
macOS and Linux with Homebrew (the Homebrew steps on Linux are untested):
brew install whisper-cpp ffmpeg
mkdir -p ~/meeting-live-asr && cd ~/meeting-live-asr
curl -L -o ggml-base.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin
whisper-server -m ~/meeting-live-asr/ggml-base.bin --host 127.0.0.1 --port 8080 --inference-path /v1/audio/transcriptions --convert --tmp-dir /tmp
Windows (untested): download whisper-bin-x64.zip from the newest build on the releases page, install ffmpeg with winget install ffmpeg, download the model file above, and run whisper-server.exe with the same options (use a folder you can write to for --tmp-dir).
--convert lets the server read Opus, m4a and the other formats a recording may be in; without it only WAV works. --inference-path makes the server answer where the plugin asks. When the recording is Chinese, set Recognition language to Chinese: the plugin then asks for simplified characters, and a small model can otherwise mistake Chinese for English or write traditional characters. Servers that host several models, such as speaches, work through the OpenAI-compatible option.
wrong→right (or wrong -> right) on a line of its own in the note: later sentences are corrected before they are written, and sentences already written are corrected too, their text only, never their time links or block IDs. Corrections for every meeting go in the Corrections setting; the command Apply the corrections to this meeting's transcript runs them over the whole transcript again. Before each stage summary, the same model goes over that stretch; the Transcript cleanup setting says how far it goes (next item).meeting.json; Restore recognized text in the card menu, or the command Restore this meeting's recognized text, puts it back (with the correction tables applied). meeting.json also adds up the tokens each kind of request used (usage: cleanup, summary, overview, minutes) as the service reported them.Network use. The plugin contacts only the services you configure, and each only for its own role:
| Role | What is sent | Where |
|---|---|---|
| Live transcription | Your audio, streamed while recording | The host of the live service (Volcengine: openspeech.bytedance.com; Alibaba Cloud Bailian: dashscope.aliyuncs.com or dashscope-intl.aliyuncs.com; AssemblyAI: streaming.assemblyai.com or streaming.eu.assemblyai.com; Deepgram: api.deepgram.com), or the address you set. With a recognizer on this computer (127.0.0.1, localhost) it goes nowhere else |
| Recorded files | The audio file you pick, uploaded once | Volcengine openspeech.bytedance.com; Alibaba Cloud Bailian dashscope.aliyuncs.com or dashscope-intl.aliyuncs.com (the file also passes through Alibaba Cloud's temporary storage, and the transcript comes back from a signed address on Alibaba Cloud storage); AssemblyAI api.assemblyai.com or api.eu.assemblyai.com; Deepgram api.deepgram.com; or the host of your OpenAI-compatible API address; with Local Whisper it stays on this computer |
| Recognition hints (Volcengine) | The meeting background from settings and the names in the meeting's note (or the note a recording is transcribed into): title, property values, links, 《》 titles, acronyms; none of the rest of the note | The same host as live or file recognition. Asked about on its own: agreeing to the audio does not cover it. Declined, recording and transcription go ahead with the typed hotwords only |
| Summaries and minutes | Transcript text, stage summaries and, for minutes, the notes you choose; before a stage summary, the known names used to tidy it (hotwords, names from the note, meeting background, correction targets) | The host of your LLM API address (for a preset, the service's own host, such as api.moonshot.cn or api.x.ai) |
Meetings/), one subfolder per meeting, named after the note and renamed with it once the meeting is no longer recording. A new meeting's raw transcript is named in the note language (… Raw transcript.md or … 原始转写.md) and keeps that name; meetings from earlier versions keep theirs. Stage summaries are written into the meeting note. Before a stage summary, the model may tidy that stage's transcript (see Transcript cleanup), and manual correction pairs can also change transcript text; the text as recognized stays in meeting.json. Neither changes the recording. Raw transcripts of recorded files go to a Recording transcripts folder inside it (an existing 录音转写 folder keeps being used). Settings and prompts are saved in the plugin's data.json inside your vault.Make sure everyone in a meeting agrees to being recorded and to cloud processing.
npm ci
npm test # unit tests
npm run build # type check and production build
node --import ./tests/support/register.mjs scripts/mock-server.ts 8790 # local stand-in for the speech and model services
The mock server speaks the wire formats of Volcengine, Alibaba Cloud Bailian, AssemblyAI, Deepgram, OpenAI-style transcription and an OpenAI-compatible model, including the model lists and key checks the settings page calls (the key bad is refused; key-1.0-only is refused Volcengine's 2.0 resource), so nothing needs a paid key. The loader stands in for Obsidian's module, which the shared code imports.
Releasing (maintainers): on a clean main, run npm version patch (or minor, or an explicit x.y.z). The version script in version-bump.mjs moves manifest.json, versions.json and package.json together, and .npmrc makes the tag x.y.z without a v, which Obsidian requires. Push the commit and the tag. The release workflow builds from the tagged commit, runs the tests, refuses to continue unless the tag equals the manifest.json version and versions.json lists it, attests build provenance for main.js, manifest.json and styles.css, and publishes the release with those three files. Change the description or anything else before tagging: the release carries the files as they were at the tag, so an edit made to manifest.json afterwards reaches users only with the next release.
MIT. Third-party code is listed in THIRD_PARTY_NOTICES.md.