Skip to main content

Korean phone call transcription pipeline with Whisper + speaker diarization, auto TODO/schedule/entity extraction

Project description

korean-call-transcriber

Korean phone call transcription pipeline with Whisper + speaker diarization, auto TODO/schedule/entity extraction, and Obsidian sync.

Features

  • ๐ŸŽ™๏ธ WhisperX Transcription โ€” faster-whisper (CTranslate2) for fast GPU-accelerated Korean speech-to-text
  • ๐Ÿ‘ฅ Speaker Diarization โ€” pyannote-based 2-speaker identification with Korean honorific heuristics
  • ๐Ÿ“ Unified LLM Extraction โ€” Single API call extracts: Summary, TODOs, Appointments, Entities, Products, Money, Risks, and Corrections
  • ๐Ÿ”ง STT Correction Layer โ€” Persistent exact replacements and alias normalization with hot-reload
  • ๐Ÿ“Š Gap Analyzer โ€” Deterministic pipeline health check with cause taxonomy
  • ๐Ÿ”„ Retry Queue โ€” JSONL-based atomic retry queue with exponential backoff
  • ๐Ÿ““ Obsidian Sync โ€” Automatic transcript โ†’ markdown conversion with counterparty indexing
  • ๐Ÿ“ง Gmail Classifier โ€” Auto-classify inbox emails (ads โ†’ trash, important โ†’ highlight)
  • ๐Ÿ“‹ Email TODO Extract โ€” Extract action items from incoming emails with LLM
  • ๐Ÿ“… Calendar Integration โ€” Google Calendar event checking via OAuth2
  • ๐Ÿ’ฌ SMS Pipeline โ€” Placeholder module for SMS-to-transcription integration
  • ๐Ÿ“ฎ Naver Mail Archiver โ€” IMAP-based Naver Mail archiver with structured JSON output
  • โœ… Persistent TODO Store โ€” Jaccard fuzzy-dedup, same-source merge, completed tracking
  • ๐Ÿง  Knowledge Graph โ€” Entity relationship extraction and traversal (counterparty โ†” TODO โ†” event)
  • ๐Ÿ“ก Signal Detector โ€” 3-band fast scoring + idea/entity extraction from any text
  • โš™๏ธ Minions Queue โ€” Postgres-backed durable job queue with fan-out, DAG, and crash recovery
  • ๐Ÿ” State Validator โ€” Automated state file existence, staleness, and integrity checks

โš ๏ธ Privacy Notice

This tool processes sensitive communications (calls, emails, SMS). Transcript text is sent to the configured LLM API for extraction โ€” all other processing runs locally. See PRIVACY.md for details and recommendations.

Module Status

Module Status Notes
Transcription Beta WhisperX + diarization; GPU setup required
LLM Extraction Beta 8-category unified extraction; OpenAI-compatible API
STT Correction Stable Hot-reload rules
Obsidian Sync Beta Counterparty indexing; local vault paths required
Gmail Classifier Experimental Keyword-based classification; credentials required
Email TODO Extract Experimental LLM + rule-based; credentials required
Naver Mail Experimental IMAP archiving; Naver IMAP setup required
Calendar Experimental Google Calendar OAuth2 setup required
TODO Store Stable Jaccard fuzzy dedup
Knowledge Graph Beta Entity relationships
Signal Detector Stable 3-band fast scoring
Minions Queue Beta Postgres-backed; optional
State Validator Stable Integrity checks
SMS Handler Placeholder Integration pattern only
Retry Queue Stable JSONL + backoff

Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Audio Files     โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  batch_transcribe โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  Transcript .txt โ”‚
โ”‚  (*.m4a)         โ”‚     โ”‚  (WhisperX)       โ”‚     โ”‚                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚  โ”œโ”€ transcribe     โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                        โ”‚  โ”œโ”€ align          โ”‚              โ”‚
                        โ”‚  โ””โ”€ diarize        โ”‚              โ”‚
                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
                                                          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Correction     โ”‚โ—€โ”€โ”€โ”€โ–ถโ”‚  extract_all      โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  Structured Data โ”‚
โ”‚  Layer          โ”‚     โ”‚  (LLM)            โ”‚     โ”‚  (JSON)          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚  โ”œโ”€ summary       โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                        โ”‚  โ”œโ”€ todos         โ”‚
                        โ”‚  โ”œโ”€ entities      โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                        โ”‚  โ”œโ”€ products      โ”‚โ”€โ”€โ”€โ”€โ–ถโ”‚  Obsidian Vault  โ”‚
                        โ”‚  โ””โ”€ risks         โ”‚     โ”‚  (sync)          โ”‚
                        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Extended Pipeline (v0.5)                                           โ”‚
โ”‚                                                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚
โ”‚  โ”‚ Gmail        โ”‚  โ”‚ Email TODO   โ”‚  โ”‚ Calendar     โ”‚              โ”‚
โ”‚  โ”‚ Classifier   โ”‚  โ”‚ Extract      โ”‚  โ”‚ Integration  โ”‚              โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
โ”‚         โ”‚                 โ”‚                  โ”‚                      โ”‚
โ”‚         โ–ผ                 โ–ผ                  โ–ผ                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”           โ”‚
โ”‚  โ”‚  Persistent TODO Store (Jaccard dedup)              โ”‚           โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜           โ”‚
โ”‚                             โ”‚                                       โ”‚
โ”‚         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚         โ–ผ                   โ–ผ                   โ–ผ                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚
โ”‚  โ”‚ Knowledge    โ”‚  โ”‚ Signal       โ”‚  โ”‚ State        โ”‚              โ”‚
โ”‚  โ”‚ Graph        โ”‚  โ”‚ Detector     โ”‚  โ”‚ Validator    โ”‚              โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
โ”‚                                                                     โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                                โ”‚
โ”‚  โ”‚ Minions      โ”‚  โ”‚ SMS Handler  โ”‚                                โ”‚
โ”‚  โ”‚ Job Queue    โ”‚  โ”‚ (placeholder)โ”‚                                โ”‚
โ”‚  โ”‚ (Postgres)   โ”‚  โ”‚              โ”‚                                โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

See docs/architecture.md for detailed documentation.

Quick Start

Prerequisites

  • Python 3.11+
  • CUDA-capable GPU (tested on RTX 3090)
  • ffmpeg in PATH
  • HuggingFace token with pyannote access (for diarization)
  • PostgreSQL 16+ (for Minions job queue โ€” optional)

Installation

# Clone and install (editable mode)
git clone https://github.com/brood-arch/korean-call-transcriber.git
cd korean-call-transcriber

# Basic development setup (no GPU deps)
pip install -e ".[dev]"

# With GPU transcription support (requires CUDA)
pip install -e ".[gpu,dev]"

# With Minions job queue (requires PostgreSQL + psycopg2)
pip install -e ".[queue,dev]"

# Everything
pip install -e ".[all,dev]"

See pyproject.toml [project.optional-dependencies] for available extras.

Usage

1. Transcribe audio files

# Transcribe all pending files
python -m kct.transcribe.batch_transcribe

# Transcribe a single file
python -m kct.transcribe.batch_transcribe --file path/to/audio.m4a

# Process newest files first
python -m kct.transcribe.batch_transcribe --recent-first --limit 10

# Equivalent installed CLI
kct-transcribe --recent-first --limit 10

2. Extract structured data

# Full extraction run (summary + todos + entities + ...)
python -m kct.extract.extract_all

# Dry run to validate setup
python -m kct.extract.extract_all --dry-run

# Process only today's files
python -m kct.extract.extract_all --today

# Equivalent installed CLI
kct-extract --today

3. Analyze pipeline health

# Check for gaps in the pipeline
python -m kct.queue.gap_analyzer

# Generate detailed report
python -m kct.queue.gap_analyzer --output-json report.json --output-md report.md

# Pipeline health shortcut
kct-health

4. Sync to Obsidian

# Sync new transcripts
python -m kct.sync.sync_obsidian

# Dry run
python -m kct.sync.sync_obsidian --dry-run

# Re-sync all files
python -m kct.sync.sync_obsidian --all

# Equivalent installed CLI
kct-sync-obsidian --all

5. Gmail auto-classification

# Set GMAIL_ADDRESS and GMAIL_APP_PASSWORD in .env first
python -m kct.integrations.gmail_classifier

6. Email TODO extraction

# Manage sender exclusion list
python -m kct.integrations.email_todo_extract exclude "newsletter@example.com"
python -m kct.integrations.email_todo_extract list-exclusions
python -m kct.integrations.email_todo_extract status

7. Calendar integration

# Set GCAL_TOKEN_PATH in .env to your OAuth2 token file
python -m kct.integrations.calendar

7.5. Naver Mail archiving

# Set NAVER_MAIL_ADDRESS and NAVER_MAIL_PASSWORD in .env first
# Enable IMAP in Naver Mail web settings
python -m kct.integrations.naver_mail

# Dry run (don't save state)
python -m kct.integrations.naver_mail --dry-run

# Single folder
python -m kct.integrations.naver_mail --folder INBOX --limit 50

8. Persistent TODO management

# Check status
python -m kct.todo.persistent_store status

# Sync completed TODOs
python -m kct.todo.persistent_store sync

9. Knowledge graph

# Build graph from all state sources
python -m kct.knowledge.graph --build

# Query related nodes
python -m kct.knowledge.graph --query "cp:CompanyName"

# Show statistics
python -m kct.knowledge.graph --stats

10. Signal detection

# Fast-score a text (no LLM needed)
python -m kct.knowledge.signal_detector --score "์ฃผ๋ฌธ 500๊ฐœ ํ™•์ธํ•ด์ฃผ์„ธ์š”"

# Full signal detection
python -m kct.knowledge.signal_detector "Meeting with Acme about 500 units"

11. Minions job queue (requires PostgreSQL)

# Set MINIONS_DB_PASS in .env
python -m kct.pipeline.minions_queue submit sync_transcripts '{"cmd": "python -m kct.extract.extract_all"}'
python -m kct.pipeline.minions_queue list
python -m kct.pipeline.minions_queue stats
python -m kct.pipeline.minions_queue work

12. State validation

# Check all state files
python -m kct.pipeline.validate_state

# JSON output
python -m kct.pipeline.validate_state --json

# Quiet mode (only show issues)
python -m kct.pipeline.validate_state --quiet

Environment Variables

Variable Description Default
LLM_API_KEY LLM API key (ZAI_API_KEY is also supported for backward compatibility) (required)
LLM_BASE_URL OpenAI-compatible API base URL (ZAI_BASE_URL is also supported) https://api.openai.com/v1
LLM_MODEL Model name gpt-4o-mini
LLM_DISABLE_THINKING Disable GLM thinking traces (auto, true, false) auto
KCT_AUDIO_DIR Audio source directory (AUDIO_DIR is also supported for backward compatibility) data/audio
KCT_TRANSCRIPT_DIR Transcript output directory (TRANSCRIPT_DIR is also supported for backward compatibility) output/transcripts
WHISPER_MODEL faster-whisper model mobiuslabsgmbh/faster-whisper-large-v3-turbo
HF_TOKEN_FILE HuggingFace token file path (empty)
MY_NAME Speaker name for caller ID Me
GMAIL_ADDRESS Gmail address for IMAP login (empty)
GMAIL_APP_PASSWORD Gmail app-specific password (empty)
GCAL_TOKEN_PATH Path to Google Calendar OAuth2 token state/gcal_token.json
EMAIL_TODO_STATE Path to email TODO state file state/email_todo_state.json
EMAIL_TODO_EXCLUSIONS Path to sender exclusion list state/email_todo_exclusions.json
KCT_STATE_DIR Base state directory state
KCT_LOG_DIR Log directory logs
KCT_ENABLE_SHELL_JOBS Enable trusted local shell command payloads in Minions queue 0
MINIONS_DB_HOST Minions Postgres host localhost
MINIONS_DB_PORT Minions Postgres port 5432
MINIONS_DB_NAME Minions database name minions
MINIONS_DB_USER Minions database user minions
MINIONS_DB_PASS Minions database password (required for queue)
SMS_GATEWAY_URL SMS gateway API endpoint (empty)
SMS_API_KEY SMS gateway API key (empty)
NAVER_MAIL_ADDRESS Naver email address (empty)
NAVER_MAIL_PASSWORD Naver mail password or app password (empty)
NAVER_MAIL_HOST Naver IMAP host imap.naver.com
NAVER_MAIL_FOLDERS Comma-separated IMAP folders INBOX,"Sent Messages"
NAVER_MAIL_LIMIT Max messages per folder per run 100
NAVER_MAIL_STATE_DIR State directory for processed UIDs state/naver_mail

See .env.example for the full list.

Additional operational notes:

Project Structure

kct/
โ”œโ”€โ”€ transcribe/          # WhisperX transcription engine
โ”‚   โ”œโ”€โ”€ batch_transcribe.py   # Main batch transcription script
โ”‚   โ”œโ”€โ”€ worker.py             # Isolated subprocess worker
โ”‚   โ””โ”€โ”€ align_worker.py       # Alignment + diarization worker
โ”œโ”€โ”€ extract/             # LLM-based extraction
โ”‚   โ”œโ”€โ”€ extract_all.py        # Unified extraction (8 categories)
โ”‚   โ”œโ”€โ”€ extract_entities.py   # Standalone entity extraction
โ”‚   โ””โ”€โ”€ extract_schedules.py  # Schedule/appointment extraction
โ”œโ”€โ”€ correct/             # STT correction layer
โ”‚   โ””โ”€โ”€ corrections.py        # Exact + alias corrections
โ”œโ”€โ”€ sync/                # Output synchronization
โ”‚   โ””โ”€โ”€ sync_obsidian.py      # Transcript โ†’ Obsidian sync
โ”œโ”€โ”€ pipeline/            # Shared utilities
โ”‚   โ”œโ”€โ”€ paths.py              # Central path configuration
โ”‚   โ”œโ”€โ”€ utils.py              # Common utilities
โ”‚   โ”œโ”€โ”€ health_check.py       # Pipeline health checks
โ”‚   โ”œโ”€โ”€ minions_queue.py      # Postgres-backed durable job queue
โ”‚   โ””โ”€โ”€ validate_state.py     # State file validation
โ”œโ”€โ”€ integrations/        # External service integrations
โ”‚   โ”œโ”€โ”€ gmail_classifier.py   # Gmail inbox auto-classifier
โ”‚   โ”œโ”€โ”€ email_todo_extract.py # Email โ†’ TODO extraction
โ”‚   โ”œโ”€โ”€ calendar.py           # Google Calendar integration
โ”‚   โ”œโ”€โ”€ sms_handler.py        # SMS pipeline placeholder
โ”‚   โ””โ”€โ”€ naver_mail.py          # Naver Mail IMAP archiver
โ”œโ”€โ”€ todo/                # TODO management
โ”‚   โ””โ”€โ”€ persistent_store.py   # Persistent store with Jaccard dedup
โ”œโ”€โ”€ knowledge/           # Knowledge graph & signal detection
โ”‚   โ”œโ”€โ”€ graph.py              # Entity relationship graph
โ”‚   โ””โ”€โ”€ signal_detector.py    # 3-band fast scoring + signal detection
โ””โ”€โ”€ queue/               # Pipeline health & retry
    โ”œโ”€โ”€ gap_analyzer.py       # Pipeline gap analysis
    โ””โ”€โ”€ retry_queue.py        # Atomic retry queue

Key Design Decisions

Process Isolation for DLL Safety

faster-whisper (CTranslate2) and whisperx (pyannote) have conflicting DLL requirements on Windows. The pipeline uses subprocess isolation: transcription runs in the main process, alignment and diarization run in a child process.

BatchedInferencePipeline

Uses BatchedInferencePipeline from faster-whisper for ~3x throughput improvement on NVIDIA GPUs, with automatic fallback to sequential mode.

Long Audio Chunking

Audio files longer than 5 minutes are automatically split into chunks to prevent CTranslate2 hard-kills on Windows. Timestamps are preserved across chunks.

Speaker Identification Heuristics

For 2-speaker Korean business calls, the pipeline uses multiple signals:

  • Speech duration ratio
  • Korean honorific detection (์Šต๋‹ˆ๋‹ค, ์ž…๋‹ˆ๋‹ค, ๋“œ๋ฆฌ, etc.)
  • First-speaker greeting analysis

Jaccard Fuzzy Dedup for TODOs

The persistent TODO store uses bigram Jaccard similarity (threshold โ‰ฅ 0.55) to prevent duplicate TODOs from being added across multiple extraction runs. Same-source dedup merges shorter titles into longer, more descriptive ones.

3-Band Signal Scoring

The signal detector uses a weighted multi-signal scoring system to pre-filter text before any LLM API call, saving tokens and latency on trivial messages.

Minions Job Queue

The Postgres-backed job queue provides crash recovery, idempotent submission, fan-out parallel execution with aggregators, and job steering via messages. Shell command payloads are disabled by default; set KCT_ENABLE_SHELL_JOBS=1 only for trusted local automation.

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing)
  5. Open a Pull Request

License

This project is licensed under the MIT License โ€” see the LICENSE file for details.

Changelog

v0.8.2

  • Refactored extract_entities.py and extract_schedules.py to use centralized LLM client (kct.extract.client)
  • Added logging to all silent except blocks across codebase
  • Added ffmpeg-python to core dependencies in pyproject.toml
  • Added chromadb and obsidian optional dependency groups
  • Created docs/ with security model, known limitations, and troubleshooting guides
  • Cleaned up requirements.txt to match pyproject.toml

v0.3.4

  • Centralized LLM configuration and reused the common LLM client across extraction modules
  • Added sensitive-output redaction before retry/minions logs store stdout and stderr tails
  • Disabled Minions shell command payloads by default unless KCT_ENABLE_SHELL_JOBS=1
  • Replaced duplicated signal detector implementation with a compatibility shim
  • Reused centralized WSL detection and atomic write helpers across more runtime modules
  • Preferred KCT_* path environment variables while preserving legacy names

v0.3.3

  • Added console entry points: kct-transcribe, kct-extract, kct-health, kct-sync-obsidian
  • Generalized unified extraction client to prefer LLM_API_KEY, LLM_BASE_URL, and LLM_MODEL
  • Made retry queue command tests robust across native Windows and WSL command shapes
  • Switched CI linting to raw ruff check .
  • Replaced over-broad module status labels with Stable/Beta/Experimental/Placeholder

v0.3.0

  • Added kct/integrations/ โ€” Gmail classifier, email TODO extraction, calendar integration, SMS handler, Naver Mail archiver
  • Added kct/todo/ โ€” Persistent TODO store with Jaccard fuzzy dedup
  • Added kct/knowledge/ โ€” Knowledge graph builder and 3-band signal detector
  • Added kct/pipeline/minions_queue.py โ€” Postgres-backed durable job queue
  • Added kct/pipeline/validate_state.py โ€” State file validation
  • All personal data, passwords, and internal paths removed

v0.2.0

  • STT correction layer with hot-reload
  • Gap analyzer with cause taxonomy
  • Retry queue with exponential backoff

v0.1.0

  • Initial release: WhisperX transcription, LLM extraction, Obsidian sync

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

korean_call_transcriber-1.0.0.tar.gz (141.2 kB view details)

Uploaded Source

Built Distribution

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

korean_call_transcriber-1.0.0-py3-none-any.whl (128.1 kB view details)

Uploaded Python 3

File details

Details for the file korean_call_transcriber-1.0.0.tar.gz.

File metadata

  • Download URL: korean_call_transcriber-1.0.0.tar.gz
  • Upload date:
  • Size: 141.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for korean_call_transcriber-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ef5ddf183c4d04017c502d802b21004302e383cb517ba009a4691c543573e782
MD5 f8ac8c390248cf2aa842417449d04b43
BLAKE2b-256 246e2ac1fd10e7844c23eb9c967866b70e389b87bfbbbb087a19e39c3dcb457f

See more details on using hashes here.

Provenance

The following attestation bundles were made for korean_call_transcriber-1.0.0.tar.gz:

Publisher: publish.yml on brood-arch/korean-call-transcriber

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

File details

Details for the file korean_call_transcriber-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for korean_call_transcriber-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 22f34fe483e4c790df7d3f8686b09071b138cc91c3e82680802446682940c45e
MD5 dff4fcde31d0e89dbec23ea02e362abc
BLAKE2b-256 9812ac63daa96ee356f76fb95e8309526e52f46eef71cc1b70cda48b9807b13c

See more details on using hashes here.

Provenance

The following attestation bundles were made for korean_call_transcriber-1.0.0-py3-none-any.whl:

Publisher: publish.yml on brood-arch/korean-call-transcriber

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