Structure
meetings/
├── bin/
│ ├── meeting-start # starts recording + live transcription
│ ├── meeting-stop # stops recording, asks for meeting name, renames files
│ ├── meeting-follow # follow transcript while it is being written
│ └── summarize-meeting # create post-meeting summaries (planned, not yet realized)
│
├── lib/
│ ├── paths.sh # creates session dirs + defines file paths
│ └── whisper.sh # whisper.cpp binary, model, ASR parameters
│
└── recordings/
└── 2025-03-24_1930/ # session directory (created on meeting-start)
├── audio.wav # raw system audio recording
├── transcript.txt # live transcript (grows during meeting)
├── meta.env # session metadata (PIDs, language, timestamps)
├── 2025-03-24T1930_project-sync_transcript.txt
├── 2025-03-24T1930_project-sync_audio.wav (see data protection discussion)
└── summary.md # created by summarize-meeting (planned, not yet realized)
Description of Paths and Scripts
Paths
Path: meetings/bin/
- Executable scripts.
Path: meetings/lib/
- Scripts to be used by the executable scripts.
Path: meetings/recordings/
- Subdirectories (ISO timestamp format) containing:
- Audio files (to be deleted after the transcript has been written)
transcript.txt(renamed and timestamped after the meeting's end by themeeting-stopscript)meta.env(Meeting information)- PIDs
- language used
- the meeting's timestamps
summary.md(meeting summary in Markdown format)
Scripts (current architecture)
TranscriptOMatic is implemented as a small set of composable shell scripts. Each script has a clearly defined responsibility within the session lifecycle. No script relies on implicit system state or hard-coded audio devices.
Library scripts (meetings/lib/)
meetings/lib/paths.sh
Responsible for session creation and path management.
On invocation, it:
- creates a new session directory
~/meetings/recordings/<ISO_TIMESTAMP>/
-
defines canonical file locations:
-
audio.wav -
transcript.txt -
meta.env
-
-
provides these paths to all other scripts
This script is the only place where session directories are created.
meetings/lib/whisper.sh
Defines the speech recognition backend configuration.
It contains:
-
the path to the local
whisper.cppinstallation -
model selection (language-specific vs. multilingual)
-
streaming parameters
-
threading configuration suitable for a Raspberry Pi–class system
The setup is explicitly optimized for live transcription using whisper-stream, not for batch processing.
No audio devices are referenced here.
Executable scripts (meetings/bin/)
meeting-start
Starts a new live transcription session.
Responsibilities
- Session initialization
- creates a new session directory via
paths.sh - writes the active session path to
~/meetings/recordings/.current
- creates a new session directory via
-
Audio graph setup (PipeWire)
- ensures a persistent null sink (
discord_sink) - routes Discord audio into that sink
- exposes the sink monitor as a virtual microphone (
whisper_mic)
- ensures a persistent null sink (
- Processing
- records audio from
whisper_micviaffmpeg - performs (almost) live transcription using
whisper-stream - appends output to
transcript.txt
- records audio from
- State tracking
- writes all relevant runtime information (PIDs, module IDs, paths) to
meta.env
- writes all relevant runtime information (PIDs, module IDs, paths) to
Usage
meeting-start --en # force English
Planned, not yet realized:
meeting-start --de # force German (planned, not yet realized)
meeting-start --auto # auto-detect language (planned, not yet realized)
meeting-start is self-contained: it does not require any pre-existing audio configuration and can be run after a reboot.
meeting-follow
Passively follows the live transcript of the currently active session.
Behaviour
- waits for the presence of
~/meetings/recordings/.current - reads the active session path from that file
- waits until
transcript.txtexists - follows the transcript in real time
This allows meeting-follow to be started:
- before meeting-start
- over SSH
- in a shared terminal window
It will never attach to archived sessions.
meeting-stop
Stops the transcription, asks for a title, renames the files and does some cleaning up.
Behavior
- checks for the presence of
~/meetings/recordings/.current