python-voiceio 1.15.1__tar.gz → 1.15.2__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.15.1/python_voiceio.egg-info → python_voiceio-1.15.2}/PKG-INFO +5 -1
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/README.md +4 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/pyproject.toml +1 -1
- {python_voiceio-1.15.1 → python_voiceio-1.15.2/python_voiceio.egg-info}/PKG-INFO +5 -1
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_feedback_stream.py +4 -4
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_idle_audio.py +8 -8
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_postprocess.py +14 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_robustness.py +17 -0
- python_voiceio-1.15.2/voiceio/__init__.py +1 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/feedback.py +3 -5
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/platform.py +16 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/postprocess.py +3 -2
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/recorder.py +2 -6
- python_voiceio-1.15.1/voiceio/__init__.py +0 -1
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/LICENSE +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/python_voiceio.egg-info/SOURCES.txt +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/python_voiceio.egg-info/dependency_links.txt +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/python_voiceio.egg-info/entry_points.txt +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/python_voiceio.egg-info/requires.txt +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/python_voiceio.egg-info/top_level.txt +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/setup.cfg +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_announce.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_app_wiring.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_audio_quality.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_audio_source.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_backend_probes.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_cancel.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_cli.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_clipboard_read.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_clipboard_typer.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_commands.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_concurrency_lockdown.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_config.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_context_terms.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_corrections.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_dead_mic.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_decoders.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_engine.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_evdev_uaccess.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_fallback.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_fcitx_bridge.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_focus.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_health.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_hints.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_history.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_hotkey_modes.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_engine_limits.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_engine_listener.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_pending.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_pids.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_ping.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_session.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_textlimit.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_ibus_typer.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_clean.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_import.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_language.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_metrics.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_pipeline.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_quiet.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_resume.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_review.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_learn_targets.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_llm.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_llm_api.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_mic_gain.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_modifier_guard.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_numbers.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_paste_last.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_pipeline.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_platform.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_postcorrect.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_prebuffer.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_presence.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_prompt.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_quiet_audio.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_recorder_integration.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_report.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_retention.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_security_hardening.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_server.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_service.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_setup.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_sherpa.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_spool.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_streaming.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_suggest.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_tokens.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_transcriber.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_tray.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_tts.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_typer_manager.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_vad.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_vocabulary.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_wordfreq.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/tests/test_worker_decode.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/__main__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/announce.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/app.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/audio_source.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/backends.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/configcmd.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/corrections.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/doctor.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/history.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/learn.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/models.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/servicecmd.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/uninstall.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/cli/vocab.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/clipboard_read.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/commands.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/config.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/consent.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/context_terms.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/bias.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/base.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/catalog.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/faster_whisper/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/faster_whisper/worker.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/fetch.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/lanes.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/sherpa.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/whispercpp.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/engine.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/pipeline.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/corrections.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/data/60-voiceio-uaccess.rules +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/data/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/demo.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/display.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/focus.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/health.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/hints.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/history.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/hotkeys/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/hotkeys/base.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/hotkeys/chain.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/hotkeys/evdev.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/hotkeys/pynput_backend.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/hotkeys/socket_backend.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/ibus/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/ibus/engine.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/ibus/install.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/ibus/pending.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/ibus/session.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/ibus/textlimit.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/idle_audio.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/augment.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/clean.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/evaluate.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/importer.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/metrics.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/quiet.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/review.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/store.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/teacher.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/learn/train.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/llm.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/llm_api.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/mic_gain.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/models/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/models/silero_vad.onnx +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/numbers.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/pidlock.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/postcorrect.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/power.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/presence.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/privacy.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/prompt.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/quiet_audio.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/report.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/retention.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/server/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/server/__main__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/server/app.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/server/config.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/server/runtime.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/service.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/configfile.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/extras.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/hotkey.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/noninteractive.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/speech.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/steps.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/system.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/setup/ui.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/sounds/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/sounds/alert.wav +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/sounds/commit.wav +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/sounds/start.wav +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/sounds/stop.wav +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/spool.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/streaming.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/suggest.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tokens.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tray/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tray/_icons.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tray/_indicator.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tray/_pystray.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/base.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/chain.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/edge_engine.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/espeak.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/piper_engine.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/player.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/tts/supertonic_engine.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/__init__.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/base.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/chain.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/clipboard.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/collecting.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/fcitx_bridge.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/ibus.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/manager.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/modifier_guard.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/paste.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/pynput_type.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/wtype.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/xdotool.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/typers/ydotool.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/ui.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/vad.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/vocab_stats.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/vocabulary.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/watchdog.py +0 -0
- {python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/wordfreq.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-voiceio
|
|
3
|
-
Version: 1.15.
|
|
3
|
+
Version: 1.15.2
|
|
4
4
|
Summary: Voice dictation for Linux. Speak → text, locally, instantly.
|
|
5
5
|
Author: Hugo Montenegro
|
|
6
6
|
License-Expression: MIT
|
|
@@ -146,6 +146,10 @@ Everything lives in `~/.config/voiceio/config.toml`; [config.example.toml](confi
|
|
|
146
146
|
|
|
147
147
|
Open an issue before a large PR. [CONTRIBUTING.md](CONTRIBUTING.md) covers the architecture, conventions and the reasoning behind the model choice. Install reports and ideas are welcome on the [feedback board](https://voiceio.dev/#feedback).
|
|
148
148
|
|
|
149
|
+
## How it's built
|
|
150
|
+
|
|
151
|
+
I write voiceio with AI coding assistants, mostly Claude Code. I decide what goes in and I use it every day, which is how most of its bugs get found.
|
|
152
|
+
|
|
149
153
|
## Credits
|
|
150
154
|
|
|
151
155
|
- Speech recognition: [faster-whisper](https://github.com/SYSTRAN/faster-whisper) and [CTranslate2](https://github.com/OpenNMT/CTranslate2), with OpenAI's [Whisper](https://github.com/openai/whisper) models; [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) with NVIDIA's [Parakeet-TDT](https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2). The in-browser demo runs [Moonshine](https://github.com/usefulsensors/moonshine) through [transformers.js](https://github.com/huggingface/transformers.js).
|
|
@@ -93,6 +93,10 @@ Everything lives in `~/.config/voiceio/config.toml`; [config.example.toml](confi
|
|
|
93
93
|
|
|
94
94
|
Open an issue before a large PR. [CONTRIBUTING.md](CONTRIBUTING.md) covers the architecture, conventions and the reasoning behind the model choice. Install reports and ideas are welcome on the [feedback board](https://voiceio.dev/#feedback).
|
|
95
95
|
|
|
96
|
+
## How it's built
|
|
97
|
+
|
|
98
|
+
I write voiceio with AI coding assistants, mostly Claude Code. I decide what goes in and I use it every day, which is how most of its bugs get found.
|
|
99
|
+
|
|
96
100
|
## Credits
|
|
97
101
|
|
|
98
102
|
- Speech recognition: [faster-whisper](https://github.com/SYSTRAN/faster-whisper) and [CTranslate2](https://github.com/OpenNMT/CTranslate2), with OpenAI's [Whisper](https://github.com/openai/whisper) models; [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) with NVIDIA's [Parakeet-TDT](https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2). The in-browser demo runs [Moonshine](https://github.com/usefulsensors/moonshine) through [transformers.js](https://github.com/huggingface/transformers.js).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-voiceio
|
|
3
|
-
Version: 1.15.
|
|
3
|
+
Version: 1.15.2
|
|
4
4
|
Summary: Voice dictation for Linux. Speak → text, locally, instantly.
|
|
5
5
|
Author: Hugo Montenegro
|
|
6
6
|
License-Expression: MIT
|
|
@@ -146,6 +146,10 @@ Everything lives in `~/.config/voiceio/config.toml`; [config.example.toml](confi
|
|
|
146
146
|
|
|
147
147
|
Open an issue before a large PR. [CONTRIBUTING.md](CONTRIBUTING.md) covers the architecture, conventions and the reasoning behind the model choice. Install reports and ideas are welcome on the [feedback board](https://voiceio.dev/#feedback).
|
|
148
148
|
|
|
149
|
+
## How it's built
|
|
150
|
+
|
|
151
|
+
I write voiceio with AI coding assistants, mostly Claude Code. I decide what goes in and I use it every day, which is how most of its bugs get found.
|
|
152
|
+
|
|
149
153
|
## Credits
|
|
150
154
|
|
|
151
155
|
- Speech recognition: [faster-whisper](https://github.com/SYSTRAN/faster-whisper) and [CTranslate2](https://github.com/OpenNMT/CTranslate2), with OpenAI's [Whisper](https://github.com/openai/whisper) models; [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) with NVIDIA's [Parakeet-TDT](https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2). The in-browser demo runs [Moonshine](https://github.com/usefulsensors/moonshine) through [transformers.js](https://github.com/huggingface/transformers.js).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"""The persistent cue stream: buffer size and cue timing."""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
from types import SimpleNamespace
|
|
5
5
|
|
|
6
|
-
pytest
|
|
6
|
+
import pytest
|
|
7
7
|
|
|
8
|
-
from voiceio import feedback
|
|
8
|
+
from voiceio import feedback
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class FakeStream:
|
|
@@ -24,7 +24,7 @@ class FakeStream:
|
|
|
24
24
|
@pytest.fixture
|
|
25
25
|
def fake_stream(monkeypatch):
|
|
26
26
|
FakeStream.opened = []
|
|
27
|
-
monkeypatch.setattr(feedback
|
|
27
|
+
monkeypatch.setattr(feedback, "sd", SimpleNamespace(OutputStream=FakeStream))
|
|
28
28
|
monkeypatch.setattr(feedback, "_stream", None)
|
|
29
29
|
monkeypatch.setattr(feedback, "_sounds", {})
|
|
30
30
|
return FakeStream
|
|
@@ -3,17 +3,16 @@ from __future__ import annotations
|
|
|
3
3
|
|
|
4
4
|
import threading
|
|
5
5
|
import time
|
|
6
|
+
from types import SimpleNamespace
|
|
6
7
|
from unittest.mock import MagicMock, patch
|
|
7
8
|
|
|
8
9
|
import numpy as np
|
|
9
10
|
import pytest
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
from voiceio import
|
|
14
|
-
from voiceio.
|
|
15
|
-
from voiceio.idle_audio import IdleAudio # noqa: E402
|
|
16
|
-
from voiceio.recorder import AudioRecorder # noqa: E402
|
|
12
|
+
from voiceio import feedback, idle_audio
|
|
13
|
+
from voiceio.config import AudioConfig, Config
|
|
14
|
+
from voiceio.idle_audio import IdleAudio
|
|
15
|
+
from voiceio.recorder import AudioRecorder
|
|
17
16
|
|
|
18
17
|
|
|
19
18
|
class FakeInput:
|
|
@@ -50,8 +49,9 @@ class FakeOutput(FakeInput):
|
|
|
50
49
|
@pytest.fixture
|
|
51
50
|
def streams(monkeypatch):
|
|
52
51
|
FakeInput.opened = FakeOutput.opened = 0
|
|
53
|
-
|
|
54
|
-
monkeypatch.setattr(
|
|
52
|
+
# Whole fakes: touching the real module would initialize PortAudio.
|
|
53
|
+
monkeypatch.setattr("voiceio.recorder.sd", SimpleNamespace(InputStream=FakeInput))
|
|
54
|
+
monkeypatch.setattr(feedback, "sd", SimpleNamespace(OutputStream=FakeOutput))
|
|
55
55
|
monkeypatch.setattr(feedback, "_stream", None)
|
|
56
56
|
|
|
57
57
|
|
|
@@ -88,6 +88,20 @@ class TestStripDisfluencies:
|
|
|
88
88
|
assert strip_disfluencies("uh-huh right") == "right"
|
|
89
89
|
assert strip_disfluencies("uh huh yes") == "yes"
|
|
90
90
|
|
|
91
|
+
def test_mm_hmm_goes_whole(self):
|
|
92
|
+
# Parakeet ends about 1 clip in 4 with an invented "Mm-hmm."; cutting
|
|
93
|
+
# only its "hmm" typed a stray "Mm-." after real dictation.
|
|
94
|
+
assert strip_disfluencies("I sent it. Mm-hmm.") == "I sent it."
|
|
95
|
+
assert strip_disfluencies("Are you sure? Mm-hmm.") == "Are you sure?"
|
|
96
|
+
assert strip_disfluencies("Mm-hmm.") == ""
|
|
97
|
+
assert strip_disfluencies("Fine. Mm-hmm. So it works.") == "Fine. So it works."
|
|
98
|
+
assert strip_disfluencies("mmhmm that works") == "that works"
|
|
99
|
+
|
|
100
|
+
def test_fillers_inside_hyphenated_words_survive(self):
|
|
101
|
+
assert strip_disfluencies("a hmm-hmm sound") == "a hmm-hmm sound"
|
|
102
|
+
assert strip_disfluencies("she said uh-uh twice") == "she said uh-uh twice"
|
|
103
|
+
assert strip_disfluencies("the 5 mm drill") == "the 5 mm drill"
|
|
104
|
+
|
|
91
105
|
def test_preserves_emphatic_short_repeat(self):
|
|
92
106
|
# Short repeats are emphasis, not a re-decode artifact — keep them.
|
|
93
107
|
assert strip_disfluencies("No. No.") == "No. No."
|
|
@@ -936,3 +936,20 @@ class TestZombieStreamRecovery:
|
|
|
936
936
|
# any real signal → not a zombie
|
|
937
937
|
rec._ring.append(np.full(rec._ring._max, 0.1, dtype=np.float32))
|
|
938
938
|
assert rec.is_zombie() is False
|
|
939
|
+
|
|
940
|
+
|
|
941
|
+
def test_app_imports_when_portaudio_cannot_initialize(tmp_path):
|
|
942
|
+
# ubuntu-26.04 runners: libportaudio2 pulls libpulse0, and with no pulse
|
|
943
|
+
# server `import sounddevice` raises; importing voiceio.app must not.
|
|
944
|
+
import subprocess
|
|
945
|
+
import sys
|
|
946
|
+
(tmp_path / "sounddevice.py").write_text(
|
|
947
|
+
"class PortAudioError(Exception): pass\n"
|
|
948
|
+
"raise PortAudioError('PulseAudio_Initialize: Can\\'t connect to server')\n")
|
|
949
|
+
code = ("import voiceio.app, voiceio.recorder as r\n"
|
|
950
|
+
"try:\n r.sd.InputStream\nexcept Exception as e:\n"
|
|
951
|
+
" print(type(e).__name__)\n")
|
|
952
|
+
out = subprocess.run([sys.executable, "-c", code], capture_output=True, text=True,
|
|
953
|
+
env={**__import__("os").environ, "PYTHONPATH": str(tmp_path)})
|
|
954
|
+
assert out.returncode == 0, out.stderr
|
|
955
|
+
assert out.stdout.strip() == "PortAudioError"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.15.2"
|
|
@@ -20,11 +20,9 @@ from pathlib import Path
|
|
|
20
20
|
|
|
21
21
|
import numpy as np
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
from voiceio.platform import desktop_dep_hint
|
|
27
|
-
raise ImportError(desktop_dep_hint("sounddevice")) from _e
|
|
23
|
+
from voiceio.platform import LazySounddevice
|
|
24
|
+
|
|
25
|
+
sd = LazySounddevice()
|
|
28
26
|
|
|
29
27
|
log = logging.getLogger(__name__)
|
|
30
28
|
|
|
@@ -15,6 +15,22 @@ log = logging.getLogger(__name__)
|
|
|
15
15
|
DESKTOP_EXTRA_INSTALL = "pipx install --force 'python-voiceio[desktop]'"
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
class LazySounddevice:
|
|
19
|
+
"""`sounddevice`, imported on first use. Its import initializes PortAudio,
|
|
20
|
+
which raises when libpulse is installed but no sound server runs (CI,
|
|
21
|
+
headless boxes): imported eagerly, that broke `import voiceio.app` and
|
|
22
|
+
every command behind it."""
|
|
23
|
+
|
|
24
|
+
def __getattr__(self, name: str):
|
|
25
|
+
if name.startswith("_"): # introspection (mock, inspect) must not import it
|
|
26
|
+
raise AttributeError(name)
|
|
27
|
+
try:
|
|
28
|
+
import sounddevice
|
|
29
|
+
except ImportError as e:
|
|
30
|
+
raise ImportError(desktop_dep_hint("sounddevice")) from e
|
|
31
|
+
return getattr(sounddevice, name)
|
|
32
|
+
|
|
33
|
+
|
|
18
34
|
def desktop_dep_hint(package: str) -> str:
|
|
19
35
|
"""One-line message for a desktop dependency that failed to import."""
|
|
20
36
|
return (
|
|
@@ -19,8 +19,9 @@ _NO_CASE_LANGUAGES = frozenset({"zh", "ja", "ko", "ar", "he", "th", "hi", "bn",
|
|
|
19
19
|
# own line doesn't swallow the paragraph/list break around it.
|
|
20
20
|
# Word repetitions ("had had" is valid English) and filler "like"/"you know"
|
|
21
21
|
# need judgment and are left to the LLM layer. Order matters: multi-token
|
|
22
|
-
# "uh-huh"
|
|
23
|
-
|
|
22
|
+
# "uh-huh" and "mm-hmm" (Parakeet invents "Mm-hmm." on a clip's quiet tail)
|
|
23
|
+
# before the bare forms. Never a piece of a hyphenated word: that left "Mm-.".
|
|
24
|
+
_FILLER = r"(?<!-)\b(?:[Uu]h[-\s]?huh|[Mm]m-?[Hh]m+|[Mm]hm|[Uu]h+m*|[Uu]m+|[Hh]m{2,})\b(?!-)"
|
|
24
25
|
# A run of fillers and the comma/space around it; the lowercase letter after it, when
|
|
25
26
|
# it opened a sentence, gets capitalized ("those. Um so I" -> "those. So I"),
|
|
26
27
|
# or the sentence end before it would read as a false stop and become a comma.
|
|
@@ -8,19 +8,15 @@ from typing import TYPE_CHECKING, Callable
|
|
|
8
8
|
|
|
9
9
|
import numpy as np
|
|
10
10
|
|
|
11
|
-
try:
|
|
12
|
-
import sounddevice as sd
|
|
13
|
-
except ImportError as _e:
|
|
14
|
-
from voiceio.platform import desktop_dep_hint
|
|
15
|
-
raise ImportError(desktop_dep_hint("sounddevice")) from _e
|
|
16
|
-
|
|
17
11
|
from voiceio.audio_source import AudioBuffer
|
|
12
|
+
from voiceio.platform import LazySounddevice
|
|
18
13
|
|
|
19
14
|
if TYPE_CHECKING:
|
|
20
15
|
from voiceio.config import AudioConfig
|
|
21
16
|
from voiceio.vad import VadBackend
|
|
22
17
|
|
|
23
18
|
log = logging.getLogger(__name__)
|
|
19
|
+
sd = LazySounddevice()
|
|
24
20
|
|
|
25
21
|
# Peak amplitude below this is treated as no signal at all (a muted mic emits
|
|
26
22
|
# exact zeros; a working mic's "silence" still noises above ~1e-4). Matches the
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.15.1"
|
|
File without changes
|
|
File without changes
|
{python_voiceio-1.15.1 → python_voiceio-1.15.2}/python_voiceio.egg-info/dependency_links.txt
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
|
{python_voiceio-1.15.1 → python_voiceio-1.15.2}/voiceio/core/decoders/faster_whisper/__init__.py
RENAMED
|
File without changes
|
{python_voiceio-1.15.1 → python_voiceio-1.15.2}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|