Work · Speech

meeting-notes.

A recording goes in. A transcript, a summary and a list of action items come out — each item with an owner and a due date when one was said.

12 November 2026 v1 · 0.1.0 Python 3.11+ MIT CI

Web demo on a mixed Chinese and English meeting: a transcript appears with two speaker labels and a timeline, then a summary and three action items, each with an owner and a due date.
Web demo on a mixed-language meeting. The recording replays results computed by faster-whisper large-v3-turbo and Qwen2.5-7B-Instruct (Q4_K_M). 3/3 action items on this sample.

The problem

Who said they would do what, and by when.

Imagine a weekly standup recorded in a mix of English and Chinese. Afterwards someone listens again to write down who said they would do what, and by when. A missed “Friday” or a task given to the wrong person is easy to let through.

The useful result is not a transcript alone. It is a list of action items — each with an owner and a due date when one was said — that a person can check against the words.

What we built

A transcript, then a list of action items you can check.

The pipeline is five steps. A recording is transcribed in English, Chinese, or both in the same sentence. Speaker labels are assigned locally. A model writes a short summary and a list of action items; each item has an owner and a due date when one was mentioned, and must quote a transcript line. You get Markdown, JSON and subtitles (SRT). The backend can be a hosted API or open models on your own machine; speaker labels always run locally.

Pipeline: a recording is transcribed (English, Chinese, or mixed); speaker labels are assigned locally; a model writes a summary and action items, each with an owner and a due date when one was said; the result is Markdown, JSON and SRT.
The same five steps, whether the backend is your API or open models on your own machine. Speaker labels always run locally.
Left: the transcript of sprint-planning-mixed.wav, a mixed Chinese and English meeting, with two speaker labels and a timeline. Right: the notes — three action items found, all three with the right owner and due date.
sprint-planning-mixed.wav. 3/3 action items, owners and dues right. scripts/evaluate.py.
Web demo transcript of a mixed-language meeting, with two speaker labels (S1, S2) and a timeline.
Transcript of sprint-planning-mixed.wav, two speakers. Mixed error rate 1.1%; 97% of speech time given the right speaker. Faster-whisper large-v3-turbo.
Web demo notes: three action items, each with an owner and a due date, all three correct on this sample.
Three action items on sprint-planning-mixed.wav, all three with the right owner and due date. Qwen2.5-7B-Instruct (Q4_K_M).

A transcript you still have to read is only half the job. A list of action items, each tied to a speaker and a spoken due date, is something a person can check and then use — and because every item has to quote a transcript line, the notes do not invent tasks. They can still leave things out, and a due date can be missed, as the table below shows.

Results

10 of 10 action items found, 9 of 10 due dates right.

On three meetings — one English, one Chinese, and one that mixes both in the same sentences — the API backend with faster-whisper large-v3-turbo and Qwen2.5-7B-Instruct (Q4_K_M) found 10 of 10 action items, with 10/10 owners right and 9/10 due dates right. Precision was 10/10 (no extra items). Transcript error was CER 2.0% (Chinese), MER 1.1% (mixed) and WER 0.6% (English). Speakers were 2/2 on every sample, with 99%, 97% and 96% of speech time given the right label.

The one due-date miss is on weekly-sync-en.wav: the item “Ask the design team for the new pictures for the app store” came back with no due date, against the scripted “today.” On the Chinese meeting, one of two scripted decisions was listed (1/2); the other two meetings listed every scripted decision (1/1, 1/1).

Action-item results on three meetings, 12 November 2026.
SampleLangTranscriptSpeakersItemsOwnerDuePrecisionTime (s)Notes
design-review-zh.wav zhCER 2.0%2/2 (99%)3/33/33/33/393decisions 1/2
sprint-planning-mixed.wav mixedMER 1.1%2/2 (97%)3/33/33/33/3101—
weekly-sync-en.wav enWER 0.6%2/2 (96%)4/44/43/44/4191due None vs “today”
All10/1010/109/1010/1093–191

Methodology. Three meetings, ten action items in total. An item counts as found when the notes list a matching task whose quote aligns to a transcript line; owner and due are scored only on items that were found. Precision is found items over items listed. API backend, faster-whisper large-v3-turbo, Qwen2.5-7B-Instruct (Q4_K_M) behind a local llama.cpp server, sherpa-onnx speaker labels, 12 November 2026. Per-meeting times were 93, 101 and 191 seconds. The raw table is in docs/eval.md. The script is scripts/evaluate.py; the samples are in samples/.

The Hugging Face backend with Whisper small and Qwen2.5-1.5B-Instruct found 9 of 10 action items (6/9 owners, 6/9 dues, 9/14 precision). Transcript error was higher on the Chinese and mixed meetings (CER 6.3%, MER 6.3%; English WER stayed 0.6%). Times were 31–36 seconds.

Run it yourself

Three commands, then the demo.

Quickstart
git clone https://github.com/ModelShifts/meeting-notes
cd meeting-notes && python -m venv .venv && source .venv/bin/activate
pip install -e ".[hf,demo]" && meeting-notes serve

On a CPU-only machine, install the CPU build of PyTorch first. For a smaller footprint, set MS_WHISPER_MODEL=small and MS_HF_MODEL=Qwen/Qwen2.5-1.5B-Instruct. Python 3.11 or newer, and ffmpeg on the PATH.