Talk companion

From Voice to Action, Beyond English:Building a Custom Meeting Agent for Code-Switched Arabic and English

How a pocket recorder, an open-source Whisper fine-tune on serverless GPUs, and a set of agent skills turn a mixed Arabic and English meeting into briefs, emails and tasks.

01THE PROBLEM

Meeting AI is tuned for English. Our meetings aren't.

خلينا نعمل الـ follow-up بكرة, and send the deck to the client قبل الاجتماع

"Let's do the follow-up tomorrow, and send the deck to the client before the meeting." One sentence, three switches.

Off-the-shelf meeting assistants are built English-first. Mix Gulf Arabic and English mid-sentence (code-switching) and the Arabic gets dropped or guessed phonetically, and speakers get merged. If the transcript is wrong, no summary prompt can fix what comes after.

Illustrative example · not a benchmark
English-only meeting AIauto: en
Speaker 1 [foreign] follow-up [foreign], and send the deck to the client [inaudible].
Speaker 1 Tamam, I'll update the pricing slide. Awal she as-sobh.
"The team discussed a deck." No owners, no deadline, one speaker.
Custom pipelinear + en · speakers
Chris خلينا نعمل الـ follow-up بكرة, and send the deck to the client قبل الاجتماع.
Guest A تمام, I'll update the pricing slide أول شي الصبح.
→ Send the deck before the meeting · Chris  ·  Update the pricing slide · Guest A
02THE IDEA

Keep the hardware. Replace the brain.

The PLAUD recorder is great hardware: small, always with me, good capture. Its bundled AI just wasn't built for how we talk. So I kept the device and its sync, pulled only the raw audio, and ran my own transcription and agent on top.

Default PLAUD→ bundled AI (English-first)→ generic summary
Mine PLAUD→ own STT→ agent skills→ real actions
03ARCHITECTURE

Four stages, from a pocket recorder to your inbox.

01 · Record

Record

PLAUD / any audio

Only the raw audio is pulled. Any folder of audio files works too.

02 · Transcribe

Transcribe

Modal GPU: code-switching Whisper + speaker diarization

Who said what, in both languages. Scales to zero when idle.

03 · Agent

Agent

Claude Code + skill files

Runs headless with a tight tool allowlist. The skill file is the product logic.

04 · Actions

Actions

brief, tasks, email, Slack, wiki

Re-runs update instead of duplicate. A human checks anything outbound.

Above it all, my personal agent orchestrates the pipeline as one of its skills.

04IN ACTION

One recording in. Six things out.

Drop a recording and the agent runs the /meeting skill end to end. Here is what a single 50-second, code-switched meeting turns into.

🎙️ PLAUD→⚡ Modal · Whisper fine-tune + pyannote→📚 wiki + past meetings→🧠 Claude Code · /meeting
📝 Transcript
[00:12] Chris: OK، خلينا نقرر: we launch Arabic and English together.
2 speakers · 0:52 · ar + en
🌐 GitShare brief
Who spoke · TL;DR · decisions · timeline · action items · quotes · full transcript
launch-sync-2026-10-19.gshr.page
✅ Tasks
taskFinal Arabic copy · Khalid · Wed
taskEmail client, demo Sun 10:00 · Chris
openCharge for the pilot? Ask Sara Thu
💬 Slack
🎙️ Launch sync · internal · 1 min
Launch AR + EN together; pilot pricing still open.
Brief · Task Manager · @team
📧 Email
Meeting brief: Launch sync
3-line summary, brief link, top action items.
🗃 Wiki + Drive
sources/launch-sync-meeting-…
projects/<project> → dated sync
drive: meetings/…/brief.html

Illustrative  Fictional sample meeting. Writes are additive and re-runs update in place.

05KEY NUMBERS

Fast and cheap enough to forget about.

22min → ~3.4min
meeting length → time to transcribe
~6.5×
faster than realtime
~$1–3/month
Modal GPU spend, personal usage

Observed in production  Single runs and my own usage, not guarantees.

06LESSONS

What I'd tell myself before starting.

  1. 01Own the STT. For non-English meetings, the transcriber matters more than the LLM.
  2. 02Skills over giant prompts. Versionable, testable, swappable across agents.
  3. 03Spawn + poll on serverless. Return a job id instantly, then poll; no request nears the 150 s web limit.
  4. 04Deploy, never demo on a dev URL. modal serve URLs vanish; modal deploy is stable.
07TRY IT

Install it with your agent

Paste this into Claude Code, Codex, OpenCode or Hermes. It clones, installs, runs an offline demo, installs the skill, and asks you before any login, token or GPU spend.

prompt
Read AGENT_SETUP.md in github.com/Chris-C3A/multilingual-meeting-agent and follow it step by step. Stop and ask me before any login, terms acceptance, token, or anything that costs money.

Or by hand. The offline demo uses a synthetic Arabic + English meeting, so it needs no GPU:

bash
# 1 · clone + install + check
git clone https://github.com/Chris-C3A/multilingual-meeting-agent.git
cd multilingual-meeting-agent && uv sync && uv run mma doctor
# 2 · offline demo: transcript → skill → brief
uv run mma transcript examples/sample-meeting/demo.json --names "SPEAKER_00=Layla,SPEAKER_01=Omar"
uv run mma skill install --target claude
claude "/process-meeting demo"
# 3 · real audio: deploy the Modal STT app (see AGENT_SETUP.md)
modal run modal_app/app.py::convert_model && modal deploy modal_app/app.py
uv run mma run meeting.m4a --language ar

Full guide, CLI and skills: AGENT_SETUP.md.

Made with GitShare