Skip to main content

VoiceRecon

Capture microphone + system audio, transcribe each utterance locally with Whisper, and optionally send each completed segment to an AI with a scenario preset (translate, interview help, lecture notes, and so on).

Sibling of ScreenRecon — same design philosophy (long-running desktop tool, local-first, Telegram delivery), applied to speech instead of screen regions.

Status: alpha. MVP is Windows-first; macOS works if you install BlackHole; Linux works via PulseAudio / PipeWire monitor sources.

What it does

Two modes, picked at launch:

  1. Transcript-only (default — no flag). Writes a plain-text transcript file under your save directory. Nothing goes to the cloud. Useful for recording meetings you want to search later.
  2. AI-per-segment (--listen <preset>). Same transcript, plus each completed utterance is sent to Claude with a preset-specific system prompt; the response goes to Telegram.

Both modes segment audio when either:

  • silence exceeds the configured threshold (speech_silence_seconds, default 1.5 s), or
  • the other speaker starts talking (immediate cut).

Install

pip install voicerecon

Requires Python 3.10+. Depends on PyTorch (pulled in transitively by silero-vad), so expect a substantial install. First run also downloads the Whisper model into your Hugging Face cache; subsequent runs use it directly.

macOS extra step: BlackHole

macOS does not expose system audio to third-party apps. To capture the other party's voice in a meeting:

  1. Install BlackHole 2ch (free, ~30 s install).
  2. Open Audio MIDI Setup, create a Multi-Output Device that includes both your speakers and BlackHole, and set it as your system output. This lets you hear audio while also routing it to BlackHole.
  3. Run voicerecon --show-devices to confirm BlackHole 2ch appears.
  4. Run voicerecon --configure and enter BlackHole 2ch when asked for the loopback device.

Usage

# One-time setup
voicerecon --configure

# Transcript-only listening
voicerecon

# Listen and translate the other party's speech into Chinese
voicerecon --listen translate

# See what presets exist
voicerecon --presets

# See what audio devices are visible
voicerecon --show-devices

# Print current config (credentials masked)
voicerecon --show

Built-in AI presets

Preset Filter Context Purpose
translate them current translate the other party's speech into Chinese
interview_candidate them current analyze the interviewer's question, outline an answer
interview_recruiter them last 5 min evaluate the candidate's answer, suggest a follow-up
lecture them last 5 min extract the key concept from a lecture excerpt
speaking me current give feedback on your own spoken sentence
debate them last 3 min suggest counter-arguments
sales them current identify customer need and suggest a talking point
  • Filterthem (system audio only), me (mic only), or both. Segments from ignored streams are dropped, not sent.
  • Contextcurrent sends only the segment that just finished. window:<seconds> sends every segment within that many seconds behind it.

Config file

~/.config/voicerecon/config.json on Linux/macOS, %APPDATA%\voicerecon\config.json on Windows (technically $XDG_CONFIG_HOME/voicerecon/ if set).

{
  "save_dir": "~/VoiceRecon",
  "speech_silence_seconds": 1.5,
  "whisper_model_size": "small",
  "input_device": "",
  "loopback_device": "",
  "model": "claude-haiku-4-5",
  "anthropic_api_key": "",
  "telegram_bot_token": "",
  "telegram_chat_id": ""
}

The three credential fields are only required when using --listen <preset>. Transcript-only mode works with them all empty.

Transcript file format

One file per session, named transcript-YYYYMMDD-HHMMSS.txt, one line per completed utterance:

[12:03:15] [them]: 我们下周的发布还是按原计划吗?
[12:03:22] [me]: 应该没问题,但要看 CI 是不是绿的。

Development

git clone https://github.com/kaizhengnz/VoiceRecon
cd VoiceRecon
pip install -e ".[dev]"
pytest

License

Apache 2.0.

Download files

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

Source Distribution

voicerecon-0.1.2.tar.gz (37.9 kB view details)

Uploaded Source

Built Distribution

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

voicerecon-0.1.2-py3-none-any.whl (37.6 kB view details)

Uploaded Python 3

File details

Details for the file voicerecon-0.1.2.tar.gz.

File metadata

  • Download URL: voicerecon-0.1.2.tar.gz
  • Upload date:
  • Size: 37.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for voicerecon-0.1.2.tar.gz
Algorithm Hash digest
SHA256 fb7ac8c7d2b150584c40f879080c3cb0a20aac5c4c05ed973f027dd42ed0f9b6
MD5 8972e778f8a5cb00e08cdc48795be73d
BLAKE2b-256 b22d956d789dd159f3915b47b7e6a21f324989d68d70ac6cd27e65c2c7ffb3e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for voicerecon-0.1.2.tar.gz:

Publisher: release_auto.yml on kaizhengnz/VoiceRecon

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

File details

Details for the file voicerecon-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: voicerecon-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 37.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for voicerecon-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c2ce251791fe90fd3f98a776d118695aba60a1904b02f605ac27ae877b055886
MD5 c54f136ed8059a0792d6cb901a6bc4f7
BLAKE2b-256 d6382d1a5bf55bdd300229db2cac4e052c027128ee4bb6329d72f704fdb5765b

See more details on using hashes here.

Provenance

The following attestation bundles were made for voicerecon-0.1.2-py3-none-any.whl:

Publisher: release_auto.yml on kaizhengnz/VoiceRecon

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 Sentry Error logging StatusPage Status page