DEV Community

Cover image for I stopped looking for an AI recorder and built a watched-folder pipeline for agent-ready voice notes
Lars Winstand
Lars Winstand

Posted on • Originally published at standardcompute.com

I stopped looking for an AI recorder and built a watched-folder pipeline for agent-ready voice notes

I went looking for a better voice note setup and kept finding the same thing: hardware companies trying very hard to become SaaS companies.

Not really selling recorders.

Selling subscriptions with a microphone attached.

That finally pushed me toward a setup that is much less impressive in screenshots and much better in practice:

  • record on any dumb device
  • drop the file into a watched Linux folder
  • transcribe locally with faster-whisper
  • send the transcript into n8n, OpenClaw, or your own agent pipeline
  • use an OpenAI-compatible API only for the parts that should scale

For developers and automation teams, this architecture is just better.

It’s more reliable.
It’s easier to swap pieces.
It keeps raw audio and transcripts under your control.
And it avoids the worst part of transcript-heavy automations: per-token cost anxiety.

On an RTX 3070 Ti, the published faster-whisper benchmarks show 13 minutes of audio transcribed in 59 seconds with int8 on large-v2. That’s the moment this stopped feeling like a side project and started feeling like a real building block.

The thesis

A recorder should do exactly one job:

capture audio reliably.

If it can save .mp3 or .wav, it has already done enough.

I do not want:

  • AI summaries on the device
  • vendor-managed memory
  • bundled transcription tiers
  • some note ecosystem deciding what happens to my recordings next year

For agent workflows, smarter hardware is usually worse architecture.

The better pattern is:

  • dumb capture
  • local transcription
  • modular automation
  • hosted inference where it actually helps

That split matters.

Because if summarization breaks, your recorder should still record.
If your LLM prompt goes bad, your transcript should still exist.
If you swap models later, your capture layer should not care.

The architecture I’d actually deploy

This is the stack I’d recommend for a self-hosted workflow:

  1. Record on a simple device: Sony clip mic, Zoom recorder, old Android phone, anything that exports audio cleanly.
  2. Sync or copy the audio file into a Linux folder.
  3. Use n8n Local File Trigger to detect the new file.
  4. Pass the file path to a local faster-whisper script.
  5. Save the transcript.
  6. Send transcript text into downstream steps for summarization, extraction, tagging, routing, CRM updates, or memory writes.
  7. Write the result to OpenClaw, Obsidian, Notion, HubSpot, Linear, email, or wherever it belongs.

That’s the whole machine.

And every piece is replaceable.

Why a watched folder is better than an “AI recorder”

A watched folder sounds boring.

That’s why I like it.

A directory like /home/notes/inbox is a much better integration point than a closed recorder app because it separates concerns cleanly:

  • capture lands as a file
  • transcription is a local job
  • automation decides what happens next

If you already self-host n8n, this maps directly to how engineers prefer to build systems anyway.

One caveat: n8n Local File Trigger is self-hosted only, and in newer versions it’s disabled by default for good reasons. Watching the filesystem is powerful and risky if your environment has untrusted users or sloppy permissions.

So yes, this setup assumes:

  • you self-host n8n
  • you control the machine
  • you understand filesystem permissions
  • you’re comfortable owning the automation

That’s not a downside for the audience I care about. That’s the point.

openai/whisper works. faster-whisper is what I’d use.

A lot of people say “Whisper” when they really mean “local speech-to-text.”

But if you’re wiring transcription into actual automations, faster-whisper is the practical choice.

The official openai/whisper package is fine for testing:

pip install -U openai-whisper
sudo apt update && sudo apt install ffmpeg
Enter fullscreen mode Exit fullscreen mode

That gets you running.

But faster-whisper is better suited for production-ish local pipelines:

  • built on CTranslate2
  • supports int8 quantization
  • supports batching
  • lower memory usage
  • avoids the usual system ffmpeg pain by decoding audio with PyAV

That last one matters more than it sounds like it should.

If you’ve ever lost half an hour debugging media dependencies on a headless Ubuntu box, you know exactly what I mean.

The benchmark numbers that changed my mind

These are the published benchmark highlights from the faster-whisper project:

Option Published benchmark highlight
openai/whisper fp16 13 minutes of audio on large-v2 GPU took 2m23s
faster-whisper int8 Same 13 minutes took 59s
faster-whisper batched int8 Same 13 minutes took 16s with batch_size=8
openai/whisper fp32 CPU 13 minutes with small model took 6m58s on Intel Core i7-12700K
faster-whisper int8 CPU Same CPU scenario took 1m42s

That is not a tiny optimization.

That is the difference between:

  • “I’ll transcribe this later”
  • and “the transcript is ready before I sit back down”

Minimal local transcription example

If you want to prove the loop works, this is enough:

pip install faster-whisper
Enter fullscreen mode Exit fullscreen mode
from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cpu", compute_type="int8")
segments, info = model.transcribe("note.mp3", beam_size=5)

print("language:", info.language)
print("duration:", info.duration)

for segment in segments:
    print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")
Enter fullscreen mode Exit fullscreen mode

Once you see transcript text streaming out locally, the whole “AI recorder” category starts to feel pretty theatrical.

A simple watched-folder implementation

You do not need to over-engineer this.

A polling loop is enough to get started:

import time
from pathlib import Path
from faster_whisper import WhisperModel

WATCH_DIR = Path("/home/notes/inbox")
DONE_DIR = Path("/home/notes/done")
TRANSCRIPTS_DIR = Path("/home/notes/transcripts")

WATCH_DIR.mkdir(parents=True, exist_ok=True)
DONE_DIR.mkdir(parents=True, exist_ok=True)
TRANSCRIPTS_DIR.mkdir(parents=True, exist_ok=True)

model = WhisperModel("small", device="cpu", compute_type="int8")
processed = set()

while True:
    for audio_file in WATCH_DIR.glob("*.mp3"):
        if audio_file in processed:
            continue

        print(f"Transcribing {audio_file.name}...")
        segments, info = model.transcribe(str(audio_file), beam_size=5)
        transcript = "\n".join(segment.text.strip() for segment in segments)

        out_file = TRANSCRIPTS_DIR / f"{audio_file.stem}.txt"
        out_file.write_text(transcript, encoding="utf-8")

        audio_file.rename(DONE_DIR / audio_file.name)
        processed.add(DONE_DIR / audio_file.name)

        print(f"Saved transcript to {out_file}")

    time.sleep(2)
Enter fullscreen mode Exit fullscreen mode

Would I keep this exact script forever? No.

Would I use it to validate the pipeline before wiring it into n8n? Absolutely.

n8n is the glue

Once the transcript exists, n8n becomes the obvious orchestration layer.

Typical flow:

  1. Local File Trigger sees a new transcript file.
  2. Read Binary File or Read File loads the text.
  3. A Code node normalizes metadata.
  4. An HTTP node sends the transcript to an OpenAI-compatible API.
  5. Downstream nodes route the result into Notion, HubSpot, Linear, Slack, OpenClaw, or your database.

A practical transcript payload might look like this:

{
  "source": "voice-note",
  "file_name": "2026-08-14-note-17.mp3",
  "captured_at": "2026-08-14T10:32:00Z",
  "transcript": "Need to follow up with Acme about the onboarding issue. Also create a task for retry logic in the webhook worker.",
  "speaker": "me"
}
Enter fullscreen mode Exit fullscreen mode

Then you can branch into multiple automations:

  • summary for daily notes
  • action item extraction
  • CRM entity detection
  • project tagging
  • memory write for an agent
  • draft email generation

This is where voice notes stop being “notes” and become workflow inputs.

Where Standard Compute fits

This is the part most local-first posts skip.

Local transcription solves:

  • capture reliability
  • privacy
  • raw text ownership
  • speed

But the moment you want useful downstream behavior, you’re back in LLM-land.

That’s where Standard Compute fits well.

Instead of shipping raw audio into a recorder vendor’s bundled AI stack forever, you can:

  • keep capture local
  • keep transcription local
  • send only the transcript into Standard Compute using an OpenAI-compatible API

That gives you hosted inference for the parts that actually benefit from it:

  • summarization
  • classification
  • structured extraction
  • routing
  • memory writes
  • follow-up generation

And the pricing model matters here.

Transcript-driven automations chew through calls fast.

A single voice note often turns into:

  • one summary
  • one list of action items
  • one CRM update
  • one memory write
  • one follow-up draft
  • maybe a classification pass for routing

That’s exactly the kind of workload where flat-rate compute is better architecture than staring at token dashboards all day.

Standard Compute is a drop-in OpenAI API replacement, so it works with existing SDKs, n8n, Make, Zapier, OpenClaw, and custom HTTP clients. Under the hood it can dynamically route across GPT-5.4, Claude Opus 4.6, and Grok 4.20, which is useful when different transcript tasks want different model behavior.

Example: OpenAI-compatible request for transcript processing

Here’s a plain Python example:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.standardcompute.com/v1",
    api_key="YOUR_STANDARD_COMPUTE_API_KEY",
)

transcript = open("/home/notes/transcripts/note.txt", "r", encoding="utf-8").read()

response = client.chat.completions.create(
    model="openai/gpt-5.4",
    messages=[
        {
            "role": "system",
            "content": "You extract structured action items, entities, and a concise summary from voice notes. Return JSON."
        },
        {
            "role": "user",
            "content": transcript
        }
    ],
    temperature=0.2
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

And if you want the output shape to be predictable, ask for explicit JSON fields:

{
  "summary": "...",
  "action_items": [
    {
      "task": "...",
      "owner": "...",
      "priority": "low|medium|high"
    }
  ],
  "entities": {
    "people": [],
    "companies": [],
    "projects": []
  },
  "memory_candidate": true
}
Enter fullscreen mode Exit fullscreen mode

That output can be consumed directly by n8n or OpenClaw.

Why I would not let the recorder vendor own the whole stack

The recurring value is not the microphone.

It’s the workflow.

That’s why so many products in this category try to bundle:

  • hardware
  • transcription
  • summaries
  • storage
  • search
  • memory
  • export
  • pricing

I understand the appeal. Press button. Talk. Get summary.

For one-off personal use, that can be fine.

For teams running automations, it’s bad architecture.

You’re taking five separate concerns and shoving them into one vendor-shaped box.

Then later, when you want to change one piece, you discover you actually bought all of them.

The stack, broken down by responsibility

Layer Tool I’d pick
Capture Sony clip mic, Zoom recorder, Android voice memo app
Transcription faster-whisper
Automation n8n with Local File Trigger
Reasoning / extraction Standard Compute via OpenAI-compatible API
Agent actions OpenClaw, Obsidian, Notion, HubSpot, Linear, email

This split gives you failure isolation.

That’s the underrated feature.

If your summarizer breaks, audio capture still works.
If your prompt regresses, your transcript still exists.
If you replace one model with another, your recorder does not care.

That is how systems should age.

Is this better than Rabbit r1 or PLAUD?

For developers and teams running automations: yes.

Very much yes.

If your goal is minimum setup for occasional personal notes, integrated products win on convenience.

If your goal is:

  • portability
  • model choice
  • privacy
  • modularity
  • predictable costs
  • agent integration

then the boring workflow wins.

Not by a little.
By a lot.

The tradeoff is obvious:

  • convenience now from a bundled device
  • control later from a modular pipeline

I know which one I’d rather maintain.

Practical recommendations

If you want to build this without turning it into a month-long side quest, here’s the version I’d start with:

1. Keep hardware dumb

Use whatever records reliably and exports audio cleanly.

2. Start with CPU transcription

Try faster-whisper on CPU first.

If your volume grows, move to GPU later.

3. Treat the transcript as the system of record

Store the raw transcript before doing any summarization or extraction.

4. Use n8n for orchestration, not transcription

Keep the heavy speech-to-text work outside n8n. Let n8n trigger and route.

5. Use hosted inference only where it adds leverage

Summaries, extraction, classification, memory writes, and follow-ups are good hosted tasks.

6. Avoid per-token anxiety for high-frequency automations

If transcripts are feeding agents all day, flat-rate OpenAI-compatible inference is a much saner fit than watching every call like a taxi meter.

The one rule I’d keep

If you take nothing else from this post, keep this rule:

Anything that records your thoughts should still work perfectly even if every AI service downstream is offline.

That one rule eliminates a lot of bad architecture.

A boring recorder plus faster-whisper plus a watched Linux folder plus n8n is not flashy.

It will never market as well as an “AI recorder.”

But it does the right thing in the right order:

  • capture reality first
  • transcribe locally
  • let agents get fancy afterward

And if your team is turning transcripts into tasks, CRM updates, memory entries, summaries, and follow-ups all day, the real unlock is not just owning the audio.

It’s being able to run the downstream automation through Standard Compute without watching token meters every five minutes.

That is how I think voice notes should work.

Top comments (0)