python-voiceio 1.9.0__tar.gz → 1.9.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_voiceio-1.9.0/python_voiceio.egg-info → python_voiceio-1.9.1}/PKG-INFO +1 -1
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/pyproject.toml +1 -1
- {python_voiceio-1.9.0 → python_voiceio-1.9.1/python_voiceio.egg-info}/PKG-INFO +1 -1
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_context_terms.py +38 -0
- python_voiceio-1.9.1/voiceio/__init__.py +1 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/app.py +1 -1
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/context_terms.py +45 -7
- python_voiceio-1.9.0/voiceio/__init__.py +0 -1
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/LICENSE +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/README.md +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/python_voiceio.egg-info/SOURCES.txt +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/python_voiceio.egg-info/dependency_links.txt +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/python_voiceio.egg-info/entry_points.txt +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/python_voiceio.egg-info/requires.txt +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/python_voiceio.egg-info/top_level.txt +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/setup.cfg +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_app_wiring.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_audio_quality.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_audio_source.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_backend_probes.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_cancel.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_cli.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_clipboard_read.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_clipboard_typer.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_commands.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_concurrency_lockdown.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_config.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_corrections.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_decoders.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_engine.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_evdev_uaccess.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_fallback.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_fcitx_bridge.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_feedback_stream.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_focus.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_health.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_hints.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_history.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_hotkey_modes.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_engine_limits.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_engine_listener.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_pending.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_pids.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_ping.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_session.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_textlimit.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_ibus_typer.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_idle_audio.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_clean.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_import.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_language.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_metrics.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_pipeline.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_quiet.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_review.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_learn_targets.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_llm.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_llm_api.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_modifier_guard.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_numbers.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_paste_last.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_pipeline.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_platform.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_postcorrect.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_postprocess.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_prebuffer.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_prompt.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_quiet_audio.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_recorder_integration.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_retention.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_robustness.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_security_hardening.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_server.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_service.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_setup.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_streaming.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_suggest.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_tokens.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_transcriber.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_tts.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_typer_manager.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_vad.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_vocabulary.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_wordfreq.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/tests/test_worker_decode.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/__main__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/audio_source.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/backends.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/configcmd.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/corrections.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/doctor.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/history.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/learn.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/models.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/servicecmd.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/uninstall.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/cli/vocab.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/clipboard_read.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/commands.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/config.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/consent.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/bias.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/base.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/catalog.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/faster_whisper/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/faster_whisper/worker.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/lanes.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/sherpa.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/whispercpp.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/engine.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/pipeline.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/corrections.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/data/60-voiceio-uaccess.rules +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/data/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/demo.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/display.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/feedback.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/focus.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/health.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/hints.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/history.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/hotkeys/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/hotkeys/base.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/hotkeys/chain.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/hotkeys/evdev.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/hotkeys/pynput_backend.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/hotkeys/socket_backend.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/ibus/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/ibus/engine.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/ibus/install.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/ibus/pending.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/ibus/session.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/ibus/textlimit.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/idle_audio.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/augment.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/clean.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/evaluate.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/importer.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/metrics.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/quiet.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/review.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/store.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/teacher.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/learn/train.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/llm.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/llm_api.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/models/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/models/silero_vad.onnx +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/numbers.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/pidlock.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/platform.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/postcorrect.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/postprocess.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/power.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/privacy.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/prompt.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/quiet_audio.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/recorder.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/retention.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/server/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/server/__main__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/server/app.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/server/config.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/server/runtime.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/service.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/configfile.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/extras.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/hotkey.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/noninteractive.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/speech.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/steps.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/system.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/setup/ui.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/sounds/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/sounds/commit.wav +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/sounds/start.wav +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/sounds/stop.wav +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/streaming.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/suggest.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tokens.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tray/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tray/_icons.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tray/_indicator.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tray/_pystray.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tts/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tts/base.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tts/chain.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tts/edge_engine.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tts/espeak.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tts/piper_engine.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/tts/player.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/__init__.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/base.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/chain.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/clipboard.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/collecting.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/fcitx_bridge.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/ibus.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/manager.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/modifier_guard.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/paste.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/pynput_type.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/wtype.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/xdotool.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/typers/ydotool.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/ui.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/vad.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/vocab_stats.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/vocabulary.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/watchdog.py +0 -0
- {python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/wordfreq.py +0 -0
|
@@ -251,3 +251,41 @@ class TestDaemon:
|
|
|
251
251
|
v.on_hotkey()
|
|
252
252
|
time.sleep(0.1)
|
|
253
253
|
cap.assert_not_called()
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def _fake_tmux(outputs):
|
|
257
|
+
calls = []
|
|
258
|
+
|
|
259
|
+
def run(args, timeout):
|
|
260
|
+
calls.append(args)
|
|
261
|
+
return outputs.get(args[0], "")
|
|
262
|
+
return run, calls
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def test_tmux_session_names_become_words(monkeypatch):
|
|
266
|
+
"""Session names are the terminal's tabs: their slug parts are terms."""
|
|
267
|
+
from voiceio import context_terms as c
|
|
268
|
+
run, calls = _fake_tmux({"list-sessions": "s claude-swarmmemo-live\ns claude-wordle-native\nc %1\nc %2\n"})
|
|
269
|
+
monkeypatch.setattr(c, "_tmux", run)
|
|
270
|
+
monkeypatch.setattr(c.shutil, "which", lambda name: "/usr/bin/tmux")
|
|
271
|
+
text = c._read_tmux(0.2)
|
|
272
|
+
assert "swarmmemo" in text.split() and "claude-swarmmemo-live" not in text
|
|
273
|
+
# Two clients: tmux can't say which one has focus, so no pane is read.
|
|
274
|
+
assert not any(a[0] == "capture-pane" for a in calls)
|
|
275
|
+
assert "swarmmemo" in c.extract_terms([text])
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def test_tmux_pane_read_only_with_a_single_client(monkeypatch):
|
|
279
|
+
from voiceio import context_terms as c
|
|
280
|
+
run, calls = _fake_tmux({"list-sessions": "s work\nc %3\n", "capture-pane": "run xdotool now\n"})
|
|
281
|
+
monkeypatch.setattr(c, "_tmux", run)
|
|
282
|
+
monkeypatch.setattr(c.shutil, "which", lambda name: "/usr/bin/tmux")
|
|
283
|
+
text = c._read_tmux(0.2)
|
|
284
|
+
assert ["capture-pane", "-p", "-J", "-t", "%3"] in calls
|
|
285
|
+
assert "xdotool" in text
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def test_no_tmux_no_terminal_text(monkeypatch):
|
|
289
|
+
from voiceio import context_terms as c
|
|
290
|
+
monkeypatch.setattr(c.shutil, "which", lambda name: None)
|
|
291
|
+
assert c._read_tmux(0.2) == ""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.9.1"
|
|
@@ -643,7 +643,7 @@ class VoiceIO:
|
|
|
643
643
|
screen = context_terms.capture()
|
|
644
644
|
if self.cfg.data.capture_context:
|
|
645
645
|
self._context_title = screen.title or None
|
|
646
|
-
terms = self.engine.screen_terms(
|
|
646
|
+
terms = self.engine.screen_terms(screen.texts())
|
|
647
647
|
if not terms:
|
|
648
648
|
return
|
|
649
649
|
bias = self.engine.bias(screen_terms=terms)
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"""On-screen vocabulary: bias one dictation toward the names you can see.
|
|
2
2
|
|
|
3
3
|
Most misrecognitions are proper nouns and jargon, and the word you are about
|
|
4
|
-
to say is often already on screen: in the focused window's title
|
|
5
|
-
text you just selected
|
|
4
|
+
to say is often already on screen: in the focused window's title, in the
|
|
5
|
+
text you just selected, or in the terminal you are working in (tmux: the
|
|
6
|
+
visible pane and the session names, which are often the window's tabs). This
|
|
7
|
+
reads those sources when a recording starts,
|
|
6
8
|
picks out the terms Whisper is likely to miss (rare words, CamelCase,
|
|
7
9
|
acronyms, multiword names) and hands them to `core.bias` for this one
|
|
8
10
|
recording, inside a small share of the hotword budget.
|
|
@@ -30,9 +32,9 @@ from dataclasses import dataclass
|
|
|
30
32
|
|
|
31
33
|
log = logging.getLogger(__name__)
|
|
32
34
|
|
|
33
|
-
# Capture deadline. Long enough for
|
|
35
|
+
# Capture deadline. Long enough for a few ~20 ms subprocess reads under load,
|
|
34
36
|
# short enough that the terms are in place before the first interim pass.
|
|
35
|
-
CAPTURE_TIMEOUT_SECS = 0.
|
|
37
|
+
CAPTURE_TIMEOUT_SECS = 0.25
|
|
36
38
|
# Only the head of a large selection is scanned: extraction stays ~10 ms.
|
|
37
39
|
MAX_SCAN_CHARS = 8000
|
|
38
40
|
MAX_TERMS = 8
|
|
@@ -54,10 +56,16 @@ _MIXED = re.compile(r"[a-zà-ÿ][A-ZÀ-Þ]|[A-ZÀ-Þ]{2}[a-zà-ÿ]")
|
|
|
54
56
|
class ScreenContext:
|
|
55
57
|
title: str = ""
|
|
56
58
|
selection: str = ""
|
|
59
|
+
terminal: str = ""
|
|
57
60
|
secs: float = 0.0
|
|
58
61
|
|
|
62
|
+
def texts(self) -> list[str]:
|
|
63
|
+
"""In priority order: what was selected on purpose first."""
|
|
64
|
+
return [self.selection, self.title, self.terminal]
|
|
65
|
+
|
|
59
66
|
def sources(self) -> list[str]:
|
|
60
|
-
return [n for n, v in (("title", self.title), ("selection", self.selection)
|
|
67
|
+
return [n for n, v in (("title", self.title), ("selection", self.selection),
|
|
68
|
+
("terminal", self.terminal)) if v]
|
|
61
69
|
|
|
62
70
|
|
|
63
71
|
def _kind(word: str, zipf: Callable[[str], float]) -> int:
|
|
@@ -205,6 +213,33 @@ def _read_primary(timeout: float) -> str:
|
|
|
205
213
|
return out.stdout[:MAX_SCAN_CHARS * 4].decode("utf-8", "replace")
|
|
206
214
|
|
|
207
215
|
|
|
216
|
+
def _tmux(args: list[str], timeout: float) -> str:
|
|
217
|
+
try:
|
|
218
|
+
out = subprocess.run(["tmux", *args], capture_output=True, timeout=timeout)
|
|
219
|
+
except (subprocess.TimeoutExpired, OSError):
|
|
220
|
+
return ""
|
|
221
|
+
return out.stdout.decode("utf-8", "replace") if out.returncode == 0 else ""
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def _read_tmux(timeout: float) -> str:
|
|
225
|
+
"""tmux session names (often the terminal's tabs, so on screen) and, when
|
|
226
|
+
exactly one client is attached, its visible pane (the newest end). With
|
|
227
|
+
several clients tmux can't say which one has focus — activity times move
|
|
228
|
+
with output too — so their panes would be a guess."""
|
|
229
|
+
if not shutil.which("tmux"):
|
|
230
|
+
return ""
|
|
231
|
+
# One tmux call for both lists: each call is a process start (~20 ms).
|
|
232
|
+
out = _tmux(["list-sessions", "-F", "s #{session_name}", ";",
|
|
233
|
+
"list-clients", "-F", "c #{pane_id}"], timeout).splitlines()
|
|
234
|
+
# "claude-wordle-native" → words; slugs are names joined for the shell.
|
|
235
|
+
sessions = "\n".join(re.sub(r"[-_.]+", " ", line[2:]) for line in out if line.startswith("s "))
|
|
236
|
+
panes = [line[2:] for line in out if line.startswith("c ")]
|
|
237
|
+
if len(panes) != 1:
|
|
238
|
+
return sessions
|
|
239
|
+
text = _tmux(["capture-pane", "-p", "-J", "-t", panes[0]], timeout).rstrip()
|
|
240
|
+
return sessions + "\n" + text[-MAX_SCAN_CHARS // 2:]
|
|
241
|
+
|
|
242
|
+
|
|
208
243
|
def _read_title(_timeout: float) -> str:
|
|
209
244
|
from voiceio import retention
|
|
210
245
|
return retention.active_window_title() or ""
|
|
@@ -214,7 +249,8 @@ def capture(timeout: float = CAPTURE_TIMEOUT_SECS, *,
|
|
|
214
249
|
readers: dict[str, Callable[[float], str]] | None = None) -> ScreenContext:
|
|
215
250
|
"""Read the window title and selection in parallel; whatever isn't back
|
|
216
251
|
by `timeout` is dropped (its thread finishes on its own). Never raises."""
|
|
217
|
-
readers = readers or {"title": _read_title, "selection": _read_primary
|
|
252
|
+
readers = readers or {"title": _read_title, "selection": _read_primary,
|
|
253
|
+
"terminal": _read_tmux}
|
|
218
254
|
t0 = time.monotonic()
|
|
219
255
|
results: dict[str, str] = {}
|
|
220
256
|
|
|
@@ -233,7 +269,7 @@ def capture(timeout: float = CAPTURE_TIMEOUT_SECS, *,
|
|
|
233
269
|
t.join(max(0.0, deadline - time.monotonic()))
|
|
234
270
|
got = dict(results) # snapshot: a late reader must not change it
|
|
235
271
|
return ScreenContext(title=got.get("title", ""), selection=got.get("selection", ""),
|
|
236
|
-
secs=time.monotonic() - t0)
|
|
272
|
+
terminal=got.get("terminal", ""), secs=time.monotonic() - t0)
|
|
237
273
|
|
|
238
274
|
|
|
239
275
|
def describe() -> str:
|
|
@@ -250,4 +286,6 @@ def describe() -> str:
|
|
|
250
286
|
sources.append("window title")
|
|
251
287
|
elif p.is_wayland and p.desktop in ("gnome", "kde"):
|
|
252
288
|
sources.append("window title of X11 apps only")
|
|
289
|
+
if shutil.which("tmux"):
|
|
290
|
+
sources.append("tmux sessions")
|
|
253
291
|
return ", ".join(sources) or "no source available"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.9.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/faster_whisper/__init__.py
RENAMED
|
File without changes
|
{python_voiceio-1.9.0 → python_voiceio-1.9.1}/voiceio/core/decoders/faster_whisper/worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|