Skip to main content

Record system audio and transcribe to text using AI

Project description

CI PyPI version Python versions

System audio to text

Record system audio and automatically transcribe to text using ✨AI✨.

Overview

sys2txt is a command-line tool that records your system audio (via PulseAudio/PipeWire monitor sources) with ffmpeg and transcribes it locally using Whisper. It supports both:

  • On-demand: Record until you stop, then transcribe once
  • Live-ish: Segment the recording every N seconds and transcribe each segment as it’s created (prints continuously)

You can use either the openai-whisper (Python) reference implementation or the faster-whisper engine if installed. The tool auto-selects faster-whisper when available for better speed on CPU and especially GPU.

Installation

Prerequisites

  • Ubuntu with PulseAudio or PipeWire (default on modern Ubuntu)
  • ffmpeg
  • Python 3.9+ (recommended)

Install

  1. System packages
sudo apt update
sudo apt install -y ffmpeg python3-venv python3-pip
  1. Create a virtual environment and install sys2txt
cd sys2txt
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

This installs both faster-whisper (for speed) and openai-whisper (reference implementation). The tool auto-selects faster-whisper when available or falls back to openai-whisper.

Quick start

Record and transcribe once (press Ctrl-C to stop recording):

sys2txt once --model small.en

Live segmented transcription (prints ongoing transcript every 8s by default; Ctrl-C to stop):

sys2txt live --model small.en --segment-seconds 8

Useful flags

  • --source <pulse_source_name> - Explicit PulseAudio/PipeWire source (e.g., alsa_output.pci-0000_00_1f.3.analog-stereo.monitor)
  • --list-sources - List available Pulse sources and exit
  • --model <size> - tiny|base|small|medium|large-v2 (default: small)
  • --engine <auto|faster|whisper> - Force a specific engine (default: auto)
  • --language <code> - Force language code (e.g., en). Omit to auto-detect
  • --output <path> - Write final transcript to a file (in live mode, appends)
  • --duration <seconds> - (once mode) Record fixed duration instead of waiting for Ctrl-C
  • --segment-seconds <n> - (live mode) Segment length in seconds (default: 8)
  • --timestamps - Print timestamps alongside text

Examples

Record 30s of system audio from the default monitor and transcribe:

sys2txt once --duration 30 --model small --output transcript.txt

Use a specific PulseAudio source:

sys2txt once --source alsa_output.usb-Focusrite_Scarlett.monitor --model base

Live mode with shorter latency and timestamps:

sys2txt live --segment-seconds 5 --timestamps

Force the reference openai-whisper engine:

sys2txt once --engine whisper --model base

Transcribe an existing audio file:

sys2txt once --input recording.wav --model small

Just want one-liners (no sys2txt)?

Find the default sink and its monitor source:

pactl get-default-sink
pactl list short sources | grep monitor

Record 30s of system audio from the default monitor to a WAV at 16 kHz mono (good for Whisper):

ffmpeg -hide_banner -loglevel error -f pulse -i "$(pactl get-default-sink).monitor" -ac 1 -ar 16000 -t 30 out.wav

Transcribe with openai-whisper CLI:

whisper out.wav --model small --task transcribe --language en

Tips and troubleshooting

  • If you get silence, ensure you are using the monitor source for your output device (the name ends with .monitor). Use --list-sources to view options.
  • Make sure the application you want to capture is playing through the same output sink as your default sink. You can manage routes with pavucontrol.
  • PipeWire systems expose PulseAudio-compatible sources, so -f pulse in ffmpeg still works.
  • For better performance on CPU, use faster-whisper with model base or small. For the best accuracy, use medium or large-v2 (these are heavier).
  • GPU acceleration for faster-whisper requires a compatible ctranslate2 CUDA wheel. Set SYS2TXT_DEVICE=cuda to enable it. If not available, it will run on CPU.

Development

Install with development dependencies:

pip install -e ".[dev]"

Run unit tests:

python -m unittest discover -s tests -p "test_*.py"

Format and lint code:

ruff format src/
ruff check src/

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sys2txt-0.1.1.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sys2txt-0.1.1-py3-none-any.whl (11.2 kB view details)

Uploaded Python 3

File details

Details for the file sys2txt-0.1.1.tar.gz.

File metadata

  • Download URL: sys2txt-0.1.1.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sys2txt-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a11a6f77d666d09ed705b20203fe14c56f1c3192d7472f42208267579ab81415
MD5 fc816ac2fa2e316ed6dd27aaa670aec3
BLAKE2b-256 b788ae19272384a9c3227c5c791ec00b61a8374e397a74b0318964f60d7970d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for sys2txt-0.1.1.tar.gz:

Publisher: publish-to-pypi.yml on Joe-Heffer/sys2txt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sys2txt-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: sys2txt-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 11.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sys2txt-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bec7e9381d895cd19a897223fc619907ef1ca72d37dd701362bb7bbde0f6592a
MD5 3dd9c566311e4c8690436d3d63fd469e
BLAKE2b-256 b425c7b47c174b70ca687a5d381e17e7e1c5ea6e7b64a85ae7ea48e29e20fbce

See more details on using hashes here.

Provenance

The following attestation bundles were made for sys2txt-0.1.1-py3-none-any.whl:

Publisher: publish-to-pypi.yml on Joe-Heffer/sys2txt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page