Metadata-Version: 2.4
Name: whospeaks
Version: 0.0.1
Summary: Local speaker diarization and realtime voice-labeling tools.
License-Expression: MIT
Project-URL: Homepage, https://github.com/KoljaB/WhoSpeaksLive
Project-URL: Repository, https://github.com/KoljaB/WhoSpeaksLive
Project-URL: Documentation, https://github.com/KoljaB/WhoSpeaksLive/tree/master/docs
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: controller
Requires-Dist: av>=11.0.0; extra == "controller"
Requires-Dist: emoji>=2.15.0; extra == "controller"
Requires-Dist: librosa>=0.10.1; extra == "controller"
Requires-Dist: nltk>=3.9.4; extra == "controller"
Requires-Dist: numpy<3,>=2; extra == "controller"
Requires-Dist: onnxruntime>=1.17; extra == "controller"
Requires-Dist: soundfile>=0.12.1; extra == "controller"
Requires-Dist: yt-dlp>=2024.3.10; extra == "controller"
Provides-Extra: local
Requires-Dist: av>=11.0.0; extra == "local"
Requires-Dist: emoji>=2.15.0; extra == "local"
Requires-Dist: espnet==202511; extra == "local"
Requires-Dist: espnet-model-zoo==0.1.7; extra == "local"
Requires-Dist: faster-whisper>=1.2.1; extra == "local"
Requires-Dist: huggingface-hub<1,>=0.34; extra == "local"
Requires-Dist: librosa>=0.10.1; extra == "local"
Requires-Dist: matplotlib>=3.8; extra == "local"
Requires-Dist: modelscope>=1.14; extra == "local"
Requires-Dist: nltk>=3.9.4; extra == "local"
Requires-Dist: numpy<3,>=2; extra == "local"
Requires-Dist: onnxruntime>=1.17; extra == "local"
Requires-Dist: pyannote.audio<4,>=3.1; extra == "local"
Requires-Dist: resemblyzer>=0.1.4; extra == "local"
Requires-Dist: soundfile>=0.12.1; extra == "local"
Requires-Dist: speechbrain>=1.0.0; extra == "local"
Requires-Dist: stanza>=1.13.0; extra == "local"
Requires-Dist: torch>=2.2; extra == "local"
Requires-Dist: torchaudio>=2.2; extra == "local"
Requires-Dist: transformers<5,>=4.39; extra == "local"
Requires-Dist: yt-dlp>=2024.3.10; extra == "local"
Provides-Extra: preview
Requires-Dist: webrtcvad==2.0.10; extra == "preview"
Provides-Extra: server
Requires-Dist: av>=11.0.0; extra == "server"
Requires-Dist: espnet==202511; extra == "server"
Requires-Dist: espnet-model-zoo==0.1.7; extra == "server"
Requires-Dist: fastapi>=0.110; extra == "server"
Requires-Dist: faster-whisper>=1.2.1; extra == "server"
Requires-Dist: huggingface-hub<1,>=0.34; extra == "server"
Requires-Dist: librosa>=0.10.1; extra == "server"
Requires-Dist: matplotlib>=3.8; extra == "server"
Requires-Dist: modelscope>=1.14; extra == "server"
Requires-Dist: numpy<3,>=2; extra == "server"
Requires-Dist: onnxruntime>=1.17; extra == "server"
Requires-Dist: pyannote.audio<4,>=3.1; extra == "server"
Requires-Dist: python-multipart>=0.0.9; extra == "server"
Requires-Dist: resemblyzer>=0.1.4; extra == "server"
Requires-Dist: soundfile>=0.12.1; extra == "server"
Requires-Dist: speechbrain>=1.0.0; extra == "server"
Requires-Dist: torch>=2.2; extra == "server"
Requires-Dist: torchaudio>=2.2; extra == "server"
Requires-Dist: transformers<5,>=4.39; extra == "server"
Requires-Dist: uvicorn[standard]>=0.29; extra == "server"
Provides-Extra: complete
Requires-Dist: av>=11.0.0; extra == "complete"
Requires-Dist: emoji>=2.15.0; extra == "complete"
Requires-Dist: espnet==202511; extra == "complete"
Requires-Dist: espnet-model-zoo==0.1.7; extra == "complete"
Requires-Dist: faster-whisper>=1.2.1; extra == "complete"
Requires-Dist: huggingface-hub<1,>=0.34; extra == "complete"
Requires-Dist: librosa>=0.10.1; extra == "complete"
Requires-Dist: matplotlib>=3.8; extra == "complete"
Requires-Dist: modelscope>=1.14; extra == "complete"
Requires-Dist: nltk>=3.9.4; extra == "complete"
Requires-Dist: numpy<3,>=2; extra == "complete"
Requires-Dist: onnxruntime>=1.17; extra == "complete"
Requires-Dist: pyannote.audio<4,>=3.1; extra == "complete"
Requires-Dist: resemblyzer>=0.1.4; extra == "complete"
Requires-Dist: soundfile>=0.12.1; extra == "complete"
Requires-Dist: speechbrain>=1.0.0; extra == "complete"
Requires-Dist: stanza>=1.13.0; extra == "complete"
Requires-Dist: torch>=2.2; extra == "complete"
Requires-Dist: torchaudio>=2.2; extra == "complete"
Requires-Dist: transformers<5,>=4.39; extra == "complete"
Requires-Dist: yt-dlp>=2024.3.10; extra == "complete"
Provides-Extra: all
Requires-Dist: av>=11.0.0; extra == "all"
Requires-Dist: emoji>=2.15.0; extra == "all"
Requires-Dist: espnet==202511; extra == "all"
Requires-Dist: espnet-model-zoo==0.1.7; extra == "all"
Requires-Dist: faster-whisper>=1.2.1; extra == "all"
Requires-Dist: huggingface-hub<1,>=0.34; extra == "all"
Requires-Dist: librosa>=0.10.1; extra == "all"
Requires-Dist: matplotlib>=3.8; extra == "all"
Requires-Dist: modelscope>=1.14; extra == "all"
Requires-Dist: nltk>=3.9.4; extra == "all"
Requires-Dist: numpy<3,>=2; extra == "all"
Requires-Dist: onnxruntime>=1.17; extra == "all"
Requires-Dist: pyannote.audio<4,>=3.1; extra == "all"
Requires-Dist: resemblyzer>=0.1.4; extra == "all"
Requires-Dist: soundfile>=0.12.1; extra == "all"
Requires-Dist: speechbrain>=1.0.0; extra == "all"
Requires-Dist: stanza>=1.13.0; extra == "all"
Requires-Dist: torch>=2.2; extra == "all"
Requires-Dist: torchaudio>=2.2; extra == "all"
Requires-Dist: transformers<5,>=4.39; extra == "all"
Requires-Dist: fastapi>=0.110; extra == "all"
Requires-Dist: python-multipart>=0.0.9; extra == "all"
Requires-Dist: uvicorn[standard]>=0.29; extra == "all"
Requires-Dist: yt-dlp>=2024.3.10; extra == "all"
Requires-Dist: webrtcvad==2.0.10; extra == "all"
Dynamic: license-file

# WhoSpeaksLive

WhoSpeaksLive is a local-first speaker diarization app for turning live or replayed media into speaker-labeled transcripts, with a browser UI for fast live speaker feedback, final sentence assignment, speaker library management, and validation.

## Demo

https://github.com/user-attachments/assets/2de749e0-6c02-47de-b949-bd90b4f4efbb

For faster realtime ASR preview text like shown in the demo, use [Kroko Pro/commercial streaming models](https://docs.kroko.ai/on-premise/#2-commercial-oem-models); the public Community models work, but Pro/private models must be installed and licensed separately.

## Current Scope

WhoSpeaksLive performs best on clean recordings where one person speaks at a time into good microphones. Diarization accuracy can degrade with background noise, background music, echo, crosstalk, overlapping speech, or low-quality microphones, and it may become less reliable as the active speaker count grows. The system assumes complete utterances can be assigned to a single speaker, so cases where one speaker starts a sentence and another finishes it are not expected to score well.

All Kroko languages supported by this integration work with realtime preview text: German, English, Spanish, French, Italian, Hebrew, Dutch, Portuguese, Swedish, and Turkish. Set `--language` or `WHOSPEAKS_LANGUAGE` to keep final ASR, Kroko/Banafo preview model selection, and stream2sentence sentence splitting on the same language. See the [configuration guide](docs/configuration.md#language) for language codes and model details.

Without realtime preview text, WhoSpeaksLive can also work with additional languages. The key requirement is that the language is supported by Whisper and by at least one configured sentence segmenter, meaning NLTK or Stanza.

That currently makes these additional languages principally supported without realtime preview text: Afrikaans, Arabic, Belarusian, Bulgarian, Catalan, Czech, Welsh, Danish, Greek, Estonian, Basque, Persian, Finnish, Faroese, Galician, Hindi, Croatian, Hungarian, Armenian, Indonesian, Icelandic, Japanese, Georgian, Kazakh, Korean, Latin, Lithuanian, Latvian, Malayalam, Marathi, Maltese, Myanmar/Burmese, Norwegian, Norwegian Nynorsk, Polish, Romanian, Russian, Sanskrit, Sindhi, Slovak, Slovenian, Albanian, Serbian, Tamil, Telugu, Thai, Ukrainian, Urdu, Vietnamese, and Chinese.

CPU-only operation is not the recommended path for the current stack. The system is GPU-heavy today; a CPU-only setup may be possible, but should be treated as a separate optimization target and will likely require engineering work, slower processing, and some accuracy or throughput tradeoffs.

## License

WhoSpeaksLive's own code is licensed under the [MIT License](LICENSE).

Optional Kroko/Banafo preview support uses separately licensed upstream components and model files. Missing public Community preview models are downloaded automatically from Hugging Face when realtime preview starts. This repository's MIT license does not relicense Kroko/Banafo assets; before downloading, bundling, or deploying them, review and respect the current terms from [Kroko by Banafo](https://kroko.ai/), the [Banafo/Kroko-ASR model card](https://huggingface.co/Banafo/Kroko-ASR), and the [kroko-ai/kroko-onnx repository](https://github.com/kroko-ai/kroko-onnx).

## Start Here

For a guided setup, install the lightweight CLI and let it inspect the machine:

```powershell
pip install whospeaks
whospeaks
```

The `whospeaks` starter shows the current component state and gives direct controls for language, realtime text, provider quality, backend URLs, ASR runtime, browser port, diagnostics, installation, exact launch-command printing, and launching the browser UI.

The short `whospeaks` command is a setup and launcher wrapper. It saves a small profile, runs doctor checks, and expands that profile into the longer `whospeaks-window ...` browser-server command when you launch.

For a Linux container server:

```bash
docker build -t whospeaks:local .
docker run --rm --name whospeaks -p 8796:8796 -v whospeaks-data:/data -v whospeaks-models:/models whospeaks:local
```

See [Docker](docs/docker.md) for the full build/run path and volume notes.

For a manual full working setup, follow these in order:

1. [Installation](docs/installation.md): install the Windows controller.
2. [External ASR and embeddings servers](docs/external-servers.md): set up the Linux GPU services.
3. [Quickstart](docs/quickstart.md): verify a local or remote smoke run, then run the tuned provider stack.

## Documentation

| Topic | Document |
| --- | --- |
| Documentation map | [docs/index.md](docs/index.md) |
| Product overview and use cases | [docs/overview.md](docs/overview.md) |
| Installation | [docs/installation.md](docs/installation.md) |
| macOS setup | [docs/macos-setup.md](docs/macos-setup.md) |
| Quickstart | [docs/quickstart.md](docs/quickstart.md) |
| Live window workflow | [docs/live-window-workflow.md](docs/live-window-workflow.md) |
| Meeting intelligence server | [docs/meeting-intelligence-server.md](docs/meeting-intelligence-server.md) |
| Speaker libraries | [docs/speaker-libraries.md](docs/speaker-libraries.md) |
| External ASR and embeddings servers | [docs/external-servers.md](docs/external-servers.md) |
| Docker server image | [docs/docker.md](docs/docker.md) |
| Configuration guide | [docs/configuration.md](docs/configuration.md) |
| Technical description | [docs/technical-description.md](docs/technical-description.md) |
| Technical architecture | [docs/architecture.md](docs/architecture.md) |
| Validation and scoring | [docs/validation-and-scoring.md](docs/validation-and-scoring.md) |
| Modal deployment | [docs/modal-deployment.md](docs/modal-deployment.md) |
| Troubleshooting | [docs/troubleshooting.md](docs/troubleshooting.md) |
| Development workflow | [docs/development.md](docs/development.md) |
