agent-cli 0.74.0__tar.gz → 0.76.0__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.
- {agent_cli-0.74.0 → agent_cli-0.76.0}/PKG-INFO +14 -8
- {agent_cli-0.74.0 → agent_cli-0.76.0}/README.md +8 -6
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_extras.json +25 -10
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/vad.txt +20 -2
- agent_cli-0.76.0/agent_cli/_requirements/whisper-transformers.txt +256 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/vad.py +121 -13
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/example-config.toml +4 -1
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/install/extras.py +5 -3
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/sync_extras.py +14 -3
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/cli.py +45 -25
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/backends/__init__.py +8 -1
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/backends/mlx.py +10 -0
- agent_cli-0.76.0/agent_cli/server/whisper/backends/transformers.py +315 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/architecture/index.md +1 -1
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/install-extras.md +6 -5
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/server/index.md +2 -2
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/server/whisper.md +17 -5
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/getting-started.md +3 -2
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/installation/linux.md +5 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/installation/macos.md +4 -2
- {agent_cli-0.74.0 → agent_cli-0.76.0}/pyproject.toml +6 -1
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/core/test_vad.py +14 -24
- agent_cli-0.76.0/tests/test_transformers_backend.py +57 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/uv.lock +11 -23
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.claude/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.claude-plugin/README.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.claude-plugin/skills/agent-cli-dev/SKILL.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.cursorrules +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.dockerignore +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.env.example +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/logo.svg +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/release-drafter.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/renovate.json +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/release.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.gitignore +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.jscpd.json +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.pre-commit-config.yaml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.prompts/docs-review.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/.prompts/pr-review.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/CLAUDE.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/LICENSE +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/__main__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/_tools.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/transcribe_daemon.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/cli.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/config.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/constants.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/process.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/cli.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/base.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/skill/SKILL.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/tmux.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/install/common.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/install/services.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/opts.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/py.typed +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run-piper-windows.ps1 +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run-piper.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run-whisper-linux.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run-whisper-macos.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run-whisper-windows.ps1 +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run-whisper.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/run_faster_whisper_server.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/common.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docker/docker-compose.yml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/CNAME +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/architecture/memory.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/architecture/rag.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/assistant.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/chat.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/config.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/dev.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/index.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/install-services.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/memory.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/speak.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/start-services.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/transcribe-daemon.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/configuration.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/index.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/installation/docker.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/installation/index.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/installation/nixos.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/installation/windows.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/logo-clean.svg +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/docs/system-integration.md +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/justfile +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/shell.nix +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_transcribe_daemon.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/conftest.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/core/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/core/test_sse.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/core/test_watch.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/test_cli.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/test_project.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/test_terminals.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/test_verification.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/install/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/install/test_extras.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_client.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_files.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_store.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/mocks/audio.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/mocks/llm.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/__init__.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_history.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_store.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_api.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_api_integration.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_asr.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_cli.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_config.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_env_vars.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_json_output.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_llm.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_process_manager.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_server_tts.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_services.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_tools.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_tts.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_utils.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_wake_word.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.74.0 → agent_cli-0.76.0}/zensical.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.76.0
|
|
4
4
|
Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
|
|
5
5
|
Project-URL: Homepage, https://github.com/basnijholt/agent-cli
|
|
6
6
|
Author-email: Bas Nijholt <bas@nijho.lt>
|
|
@@ -83,7 +83,11 @@ Requires-Dist: pytest-mock; extra == 'test'
|
|
|
83
83
|
Requires-Dist: pytest-timeout; extra == 'test'
|
|
84
84
|
Requires-Dist: pytest>=7.0.0; extra == 'test'
|
|
85
85
|
Provides-Extra: vad
|
|
86
|
-
Requires-Dist:
|
|
86
|
+
Requires-Dist: onnxruntime>=1.16.0; extra == 'vad'
|
|
87
|
+
Provides-Extra: whisper-transformers
|
|
88
|
+
Requires-Dist: fastapi[standard]; extra == 'whisper-transformers'
|
|
89
|
+
Requires-Dist: torch>=2.0.0; extra == 'whisper-transformers'
|
|
90
|
+
Requires-Dist: transformers>=4.30.0; extra == 'whisper-transformers'
|
|
87
91
|
Provides-Extra: wyoming
|
|
88
92
|
Requires-Dist: wyoming>=1.5.2; extra == 'wyoming'
|
|
89
93
|
Description-Content-Type: text/markdown
|
|
@@ -424,7 +428,7 @@ Our installation scripts automatically handle all dependencies:
|
|
|
424
428
|
|---------|---------|-----------------|
|
|
425
429
|
| **[Ollama](https://ollama.ai/)** | Local LLM for text processing | ✅ Yes, with default model |
|
|
426
430
|
| **[Wyoming Faster Whisper](https://github.com/rhasspy/wyoming-faster-whisper)** | Speech-to-text | ✅ Yes, via `uvx` |
|
|
427
|
-
| **[`agent-cli server whisper`](docs/commands/server/whisper.md)** | Speech-to-text (alternative) | ✅ Built-in, `pip install "agent-cli[whisper]"` |
|
|
431
|
+
| **[`agent-cli server whisper`](docs/commands/server/whisper.md)** | Speech-to-text (alternative) | ✅ Built-in, `pip install "agent-cli[faster-whisper]"` |
|
|
428
432
|
| **[Wyoming Piper](https://github.com/rhasspy/wyoming-piper)** | Text-to-speech | ✅ Yes, via `uvx` |
|
|
429
433
|
| **[Kokoro-FastAPI](https://github.com/remsky/Kokoro-FastAPI)** | Premium TTS (optional) | ⚙️ Can be added later |
|
|
430
434
|
| **[Wyoming openWakeWord](https://github.com/rhasspy/wyoming-openwakeword)** | Wake word detection | ✅ Yes, for `assistant` |
|
|
@@ -512,12 +516,13 @@ agent-cli install-extras rag memory vad
|
|
|
512
516
|
|
|
513
517
|
• rag - RAG proxy server (ChromaDB, embeddings)
|
|
514
518
|
• memory - Long-term memory proxy (ChromaDB)
|
|
515
|
-
• vad - Voice Activity Detection (
|
|
519
|
+
• vad - Voice Activity Detection (Silero VAD via ONNX)
|
|
516
520
|
• audio - Local audio recording/playback
|
|
517
521
|
• piper - Local Piper TTS engine
|
|
518
522
|
• kokoro - Kokoro neural TTS engine
|
|
519
523
|
• faster-whisper - Whisper ASR for CUDA/CPU
|
|
520
524
|
• mlx-whisper - Whisper ASR for Apple Silicon
|
|
525
|
+
• whisper-transformers - Whisper ASR via HuggingFace transformers (safetensors)
|
|
521
526
|
• wyoming - Wyoming protocol for ASR/TTS servers
|
|
522
527
|
• server - FastAPI server components
|
|
523
528
|
• speed - Audio speed adjustment
|
|
@@ -534,7 +539,8 @@ agent-cli install-extras rag memory vad
|
|
|
534
539
|
|
|
535
540
|
╭─ Arguments ────────────────────────────────────────────────────────────────────────────╮
|
|
536
541
|
│ extras [EXTRAS]... Extras to install: rag, memory, vad, audio, piper, kokoro, │
|
|
537
|
-
│ faster-whisper, mlx-whisper,
|
|
542
|
+
│ faster-whisper, mlx-whisper, whisper-transformers, wyoming, │
|
|
543
|
+
│ server, speed, llm │
|
|
538
544
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
539
545
|
╭─ Options ──────────────────────────────────────────────────────────────────────────────╮
|
|
540
546
|
│ --list -l Show available extras with descriptions (what each one enables) │
|
|
@@ -630,8 +636,8 @@ the `[defaults]` section of your configuration file.
|
|
|
630
636
|
```toml
|
|
631
637
|
[defaults]
|
|
632
638
|
# llm_provider = "ollama" # 'ollama', 'openai', or 'gemini'
|
|
633
|
-
# asr_provider = "wyoming" # 'wyoming' or '
|
|
634
|
-
# tts_provider = "wyoming" # 'wyoming', 'openai', or '
|
|
639
|
+
# asr_provider = "wyoming" # 'wyoming', 'openai', or 'gemini'
|
|
640
|
+
# tts_provider = "wyoming" # 'wyoming', 'openai', 'kokoro', or 'gemini'
|
|
635
641
|
# openai_api_key = "sk-..."
|
|
636
642
|
# gemini_api_key = "..."
|
|
637
643
|
```
|
|
@@ -643,7 +649,7 @@ the `[defaults]` section of your configuration file.
|
|
|
643
649
|
**Workflow:** This is a simple, one-shot command.
|
|
644
650
|
|
|
645
651
|
1. It reads text from your system clipboard (or from a direct argument).
|
|
646
|
-
2. It sends the text to
|
|
652
|
+
2. It sends the text to your configured LLM provider (default: Ollama) with a prompt to perform only technical corrections.
|
|
647
653
|
3. The corrected text is copied back to your clipboard, replacing the original.
|
|
648
654
|
|
|
649
655
|
**How to Use It:** This tool is ideal for integrating with a system-wide hotkey.
|
|
@@ -334,7 +334,7 @@ Our installation scripts automatically handle all dependencies:
|
|
|
334
334
|
|---------|---------|-----------------|
|
|
335
335
|
| **[Ollama](https://ollama.ai/)** | Local LLM for text processing | ✅ Yes, with default model |
|
|
336
336
|
| **[Wyoming Faster Whisper](https://github.com/rhasspy/wyoming-faster-whisper)** | Speech-to-text | ✅ Yes, via `uvx` |
|
|
337
|
-
| **[`agent-cli server whisper`](docs/commands/server/whisper.md)** | Speech-to-text (alternative) | ✅ Built-in, `pip install "agent-cli[whisper]"` |
|
|
337
|
+
| **[`agent-cli server whisper`](docs/commands/server/whisper.md)** | Speech-to-text (alternative) | ✅ Built-in, `pip install "agent-cli[faster-whisper]"` |
|
|
338
338
|
| **[Wyoming Piper](https://github.com/rhasspy/wyoming-piper)** | Text-to-speech | ✅ Yes, via `uvx` |
|
|
339
339
|
| **[Kokoro-FastAPI](https://github.com/remsky/Kokoro-FastAPI)** | Premium TTS (optional) | ⚙️ Can be added later |
|
|
340
340
|
| **[Wyoming openWakeWord](https://github.com/rhasspy/wyoming-openwakeword)** | Wake word detection | ✅ Yes, for `assistant` |
|
|
@@ -422,12 +422,13 @@ agent-cli install-extras rag memory vad
|
|
|
422
422
|
|
|
423
423
|
• rag - RAG proxy server (ChromaDB, embeddings)
|
|
424
424
|
• memory - Long-term memory proxy (ChromaDB)
|
|
425
|
-
• vad - Voice Activity Detection (
|
|
425
|
+
• vad - Voice Activity Detection (Silero VAD via ONNX)
|
|
426
426
|
• audio - Local audio recording/playback
|
|
427
427
|
• piper - Local Piper TTS engine
|
|
428
428
|
• kokoro - Kokoro neural TTS engine
|
|
429
429
|
• faster-whisper - Whisper ASR for CUDA/CPU
|
|
430
430
|
• mlx-whisper - Whisper ASR for Apple Silicon
|
|
431
|
+
• whisper-transformers - Whisper ASR via HuggingFace transformers (safetensors)
|
|
431
432
|
• wyoming - Wyoming protocol for ASR/TTS servers
|
|
432
433
|
• server - FastAPI server components
|
|
433
434
|
• speed - Audio speed adjustment
|
|
@@ -444,7 +445,8 @@ agent-cli install-extras rag memory vad
|
|
|
444
445
|
|
|
445
446
|
╭─ Arguments ────────────────────────────────────────────────────────────────────────────╮
|
|
446
447
|
│ extras [EXTRAS]... Extras to install: rag, memory, vad, audio, piper, kokoro, │
|
|
447
|
-
│ faster-whisper, mlx-whisper,
|
|
448
|
+
│ faster-whisper, mlx-whisper, whisper-transformers, wyoming, │
|
|
449
|
+
│ server, speed, llm │
|
|
448
450
|
╰────────────────────────────────────────────────────────────────────────────────────────╯
|
|
449
451
|
╭─ Options ──────────────────────────────────────────────────────────────────────────────╮
|
|
450
452
|
│ --list -l Show available extras with descriptions (what each one enables) │
|
|
@@ -540,8 +542,8 @@ the `[defaults]` section of your configuration file.
|
|
|
540
542
|
```toml
|
|
541
543
|
[defaults]
|
|
542
544
|
# llm_provider = "ollama" # 'ollama', 'openai', or 'gemini'
|
|
543
|
-
# asr_provider = "wyoming" # 'wyoming' or '
|
|
544
|
-
# tts_provider = "wyoming" # 'wyoming', 'openai', or '
|
|
545
|
+
# asr_provider = "wyoming" # 'wyoming', 'openai', or 'gemini'
|
|
546
|
+
# tts_provider = "wyoming" # 'wyoming', 'openai', 'kokoro', or 'gemini'
|
|
545
547
|
# openai_api_key = "sk-..."
|
|
546
548
|
# gemini_api_key = "..."
|
|
547
549
|
```
|
|
@@ -553,7 +555,7 @@ the `[defaults]` section of your configuration file.
|
|
|
553
555
|
**Workflow:** This is a simple, one-shot command.
|
|
554
556
|
|
|
555
557
|
1. It reads text from your system clipboard (or from a direct argument).
|
|
556
|
-
2. It sends the text to
|
|
558
|
+
2. It sends the text to your configured LLM provider (default: Ollama) with a prompt to perform only technical corrections.
|
|
557
559
|
3. The corrected text is copied back to your clipboard, replacing the original.
|
|
558
560
|
|
|
559
561
|
**How to Use It:** This tool is ideal for integrating with a system-wide hotkey.
|
|
@@ -6,12 +6,16 @@
|
|
|
6
6
|
]
|
|
7
7
|
],
|
|
8
8
|
"faster-whisper": [
|
|
9
|
-
"
|
|
10
|
-
[
|
|
9
|
+
"Whisper ASR via CTranslate2",
|
|
10
|
+
[
|
|
11
|
+
"faster_whisper"
|
|
12
|
+
]
|
|
11
13
|
],
|
|
12
14
|
"kokoro": [
|
|
13
|
-
"
|
|
14
|
-
[
|
|
15
|
+
"Kokoro neural TTS (GPU)",
|
|
16
|
+
[
|
|
17
|
+
"kokoro"
|
|
18
|
+
]
|
|
15
19
|
],
|
|
16
20
|
"llm": [
|
|
17
21
|
"LLM framework (pydantic-ai)",
|
|
@@ -28,12 +32,16 @@
|
|
|
28
32
|
]
|
|
29
33
|
],
|
|
30
34
|
"mlx-whisper": [
|
|
31
|
-
"
|
|
32
|
-
[
|
|
35
|
+
"Whisper ASR for Apple Silicon",
|
|
36
|
+
[
|
|
37
|
+
"mlx_whisper"
|
|
38
|
+
]
|
|
33
39
|
],
|
|
34
40
|
"piper": [
|
|
35
|
-
"
|
|
36
|
-
[
|
|
41
|
+
"Piper TTS (CPU)",
|
|
42
|
+
[
|
|
43
|
+
"piper"
|
|
44
|
+
]
|
|
37
45
|
],
|
|
38
46
|
"rag": [
|
|
39
47
|
"RAG proxy (ChromaDB, embeddings)",
|
|
@@ -55,9 +63,16 @@
|
|
|
55
63
|
]
|
|
56
64
|
],
|
|
57
65
|
"vad": [
|
|
58
|
-
"Voice Activity Detection (
|
|
66
|
+
"Voice Activity Detection (Silero VAD via ONNX)",
|
|
67
|
+
[
|
|
68
|
+
"onnxruntime"
|
|
69
|
+
]
|
|
70
|
+
],
|
|
71
|
+
"whisper-transformers": [
|
|
72
|
+
"Whisper ASR via HuggingFace transformers",
|
|
59
73
|
[
|
|
60
|
-
"
|
|
74
|
+
"transformers",
|
|
75
|
+
"torch"
|
|
61
76
|
]
|
|
62
77
|
],
|
|
63
78
|
"wyoming": [
|
|
@@ -14,14 +14,20 @@ click==8.3.1
|
|
|
14
14
|
# typer-slim
|
|
15
15
|
colorama==0.4.6 ; sys_platform == 'win32'
|
|
16
16
|
# via click
|
|
17
|
+
coloredlogs==15.0.1
|
|
18
|
+
# via onnxruntime
|
|
17
19
|
dotenv==0.9.9
|
|
18
20
|
# via agent-cli
|
|
21
|
+
flatbuffers==25.12.19
|
|
22
|
+
# via onnxruntime
|
|
19
23
|
h11==0.16.0
|
|
20
24
|
# via httpcore
|
|
21
25
|
httpcore==1.0.9
|
|
22
26
|
# via httpx
|
|
23
27
|
httpx==0.28.1
|
|
24
28
|
# via agent-cli
|
|
29
|
+
humanfriendly==10.0
|
|
30
|
+
# via coloredlogs
|
|
25
31
|
idna==3.11
|
|
26
32
|
# via
|
|
27
33
|
# anyio
|
|
@@ -30,6 +36,16 @@ markdown-it-py==4.0.0
|
|
|
30
36
|
# via rich
|
|
31
37
|
mdurl==0.1.2
|
|
32
38
|
# via markdown-it-py
|
|
39
|
+
mpmath==1.3.0
|
|
40
|
+
# via sympy
|
|
41
|
+
numpy==2.3.5
|
|
42
|
+
# via onnxruntime
|
|
43
|
+
onnxruntime==1.20.1
|
|
44
|
+
# via agent-cli
|
|
45
|
+
packaging==25.0
|
|
46
|
+
# via onnxruntime
|
|
47
|
+
protobuf==6.33.4
|
|
48
|
+
# via onnxruntime
|
|
33
49
|
psutil==7.2.1 ; sys_platform == 'win32'
|
|
34
50
|
# via agent-cli
|
|
35
51
|
pydantic==2.12.5
|
|
@@ -40,6 +56,8 @@ pygments==2.19.2
|
|
|
40
56
|
# via rich
|
|
41
57
|
pyperclip==1.11.0
|
|
42
58
|
# via agent-cli
|
|
59
|
+
pyreadline3==3.5.4 ; sys_platform == 'win32'
|
|
60
|
+
# via humanfriendly
|
|
43
61
|
python-dotenv==1.2.1
|
|
44
62
|
# via dotenv
|
|
45
63
|
rich==14.2.0
|
|
@@ -53,8 +71,8 @@ shellingham==1.5.4
|
|
|
53
71
|
# via
|
|
54
72
|
# typer
|
|
55
73
|
# typer-slim
|
|
56
|
-
|
|
57
|
-
# via
|
|
74
|
+
sympy==1.14.0
|
|
75
|
+
# via onnxruntime
|
|
58
76
|
typer==0.21.1
|
|
59
77
|
# via agent-cli
|
|
60
78
|
typer-slim==0.21.1
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# This file was autogenerated by uv via the following command:
|
|
2
|
+
# uv export --extra whisper-transformers --no-dev --no-emit-project --no-hashes
|
|
3
|
+
annotated-doc==0.0.4
|
|
4
|
+
# via fastapi
|
|
5
|
+
annotated-types==0.7.0
|
|
6
|
+
# via pydantic
|
|
7
|
+
anyio==4.12.1
|
|
8
|
+
# via
|
|
9
|
+
# httpx
|
|
10
|
+
# starlette
|
|
11
|
+
# watchfiles
|
|
12
|
+
certifi==2026.1.4
|
|
13
|
+
# via
|
|
14
|
+
# httpcore
|
|
15
|
+
# httpx
|
|
16
|
+
# requests
|
|
17
|
+
# sentry-sdk
|
|
18
|
+
charset-normalizer==3.4.4
|
|
19
|
+
# via requests
|
|
20
|
+
click==8.3.1
|
|
21
|
+
# via
|
|
22
|
+
# rich-toolkit
|
|
23
|
+
# typer
|
|
24
|
+
# typer-slim
|
|
25
|
+
# uvicorn
|
|
26
|
+
colorama==0.4.6 ; sys_platform == 'win32'
|
|
27
|
+
# via
|
|
28
|
+
# click
|
|
29
|
+
# tqdm
|
|
30
|
+
# uvicorn
|
|
31
|
+
dnspython==2.8.0
|
|
32
|
+
# via email-validator
|
|
33
|
+
dotenv==0.9.9
|
|
34
|
+
# via agent-cli
|
|
35
|
+
email-validator==2.3.0
|
|
36
|
+
# via
|
|
37
|
+
# fastapi
|
|
38
|
+
# pydantic
|
|
39
|
+
fastapi==0.128.0
|
|
40
|
+
# via agent-cli
|
|
41
|
+
fastapi-cli==0.0.20
|
|
42
|
+
# via fastapi
|
|
43
|
+
fastapi-cloud-cli==0.10.1
|
|
44
|
+
# via fastapi-cli
|
|
45
|
+
fastar==0.8.0
|
|
46
|
+
# via fastapi-cloud-cli
|
|
47
|
+
filelock==3.20.3
|
|
48
|
+
# via
|
|
49
|
+
# huggingface-hub
|
|
50
|
+
# torch
|
|
51
|
+
# transformers
|
|
52
|
+
fsspec==2026.1.0
|
|
53
|
+
# via
|
|
54
|
+
# huggingface-hub
|
|
55
|
+
# torch
|
|
56
|
+
h11==0.16.0
|
|
57
|
+
# via
|
|
58
|
+
# httpcore
|
|
59
|
+
# uvicorn
|
|
60
|
+
hf-xet==1.2.0 ; platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'
|
|
61
|
+
# via huggingface-hub
|
|
62
|
+
httpcore==1.0.9
|
|
63
|
+
# via httpx
|
|
64
|
+
httptools==0.7.1
|
|
65
|
+
# via uvicorn
|
|
66
|
+
httpx==0.28.1
|
|
67
|
+
# via
|
|
68
|
+
# agent-cli
|
|
69
|
+
# fastapi
|
|
70
|
+
# fastapi-cloud-cli
|
|
71
|
+
huggingface-hub==0.36.0
|
|
72
|
+
# via
|
|
73
|
+
# tokenizers
|
|
74
|
+
# transformers
|
|
75
|
+
idna==3.11
|
|
76
|
+
# via
|
|
77
|
+
# anyio
|
|
78
|
+
# email-validator
|
|
79
|
+
# httpx
|
|
80
|
+
# requests
|
|
81
|
+
jinja2==3.1.6
|
|
82
|
+
# via
|
|
83
|
+
# fastapi
|
|
84
|
+
# torch
|
|
85
|
+
markdown-it-py==4.0.0
|
|
86
|
+
# via rich
|
|
87
|
+
markupsafe==3.0.3
|
|
88
|
+
# via jinja2
|
|
89
|
+
mdurl==0.1.2
|
|
90
|
+
# via markdown-it-py
|
|
91
|
+
mpmath==1.3.0
|
|
92
|
+
# via sympy
|
|
93
|
+
networkx==3.6.1
|
|
94
|
+
# via torch
|
|
95
|
+
numpy==2.3.5
|
|
96
|
+
# via transformers
|
|
97
|
+
nvidia-cublas-cu12==12.8.4.1 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
98
|
+
# via
|
|
99
|
+
# nvidia-cudnn-cu12
|
|
100
|
+
# nvidia-cusolver-cu12
|
|
101
|
+
# torch
|
|
102
|
+
nvidia-cuda-cupti-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
103
|
+
# via torch
|
|
104
|
+
nvidia-cuda-nvrtc-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
105
|
+
# via torch
|
|
106
|
+
nvidia-cuda-runtime-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
107
|
+
# via torch
|
|
108
|
+
nvidia-cudnn-cu12==9.10.2.21 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
109
|
+
# via torch
|
|
110
|
+
nvidia-cufft-cu12==11.3.3.83 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
111
|
+
# via torch
|
|
112
|
+
nvidia-cufile-cu12==1.13.1.3 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
113
|
+
# via torch
|
|
114
|
+
nvidia-curand-cu12==10.3.9.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
115
|
+
# via torch
|
|
116
|
+
nvidia-cusolver-cu12==11.7.3.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
117
|
+
# via torch
|
|
118
|
+
nvidia-cusparse-cu12==12.5.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
119
|
+
# via
|
|
120
|
+
# nvidia-cusolver-cu12
|
|
121
|
+
# torch
|
|
122
|
+
nvidia-cusparselt-cu12==0.7.1 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
123
|
+
# via torch
|
|
124
|
+
nvidia-nccl-cu12==2.27.5 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
125
|
+
# via torch
|
|
126
|
+
nvidia-nvjitlink-cu12==12.8.93 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
127
|
+
# via
|
|
128
|
+
# nvidia-cufft-cu12
|
|
129
|
+
# nvidia-cusolver-cu12
|
|
130
|
+
# nvidia-cusparse-cu12
|
|
131
|
+
# torch
|
|
132
|
+
nvidia-nvshmem-cu12==3.3.20 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
133
|
+
# via torch
|
|
134
|
+
nvidia-nvtx-cu12==12.8.90 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
135
|
+
# via torch
|
|
136
|
+
packaging==25.0
|
|
137
|
+
# via
|
|
138
|
+
# huggingface-hub
|
|
139
|
+
# transformers
|
|
140
|
+
psutil==7.2.1 ; sys_platform == 'win32'
|
|
141
|
+
# via agent-cli
|
|
142
|
+
pydantic==2.12.5
|
|
143
|
+
# via
|
|
144
|
+
# agent-cli
|
|
145
|
+
# fastapi
|
|
146
|
+
# fastapi-cloud-cli
|
|
147
|
+
# pydantic-extra-types
|
|
148
|
+
# pydantic-settings
|
|
149
|
+
pydantic-core==2.41.5
|
|
150
|
+
# via pydantic
|
|
151
|
+
pydantic-extra-types==2.11.0
|
|
152
|
+
# via fastapi
|
|
153
|
+
pydantic-settings==2.12.0
|
|
154
|
+
# via fastapi
|
|
155
|
+
pygments==2.19.2
|
|
156
|
+
# via rich
|
|
157
|
+
pyperclip==1.11.0
|
|
158
|
+
# via agent-cli
|
|
159
|
+
python-dotenv==1.2.1
|
|
160
|
+
# via
|
|
161
|
+
# dotenv
|
|
162
|
+
# pydantic-settings
|
|
163
|
+
# uvicorn
|
|
164
|
+
python-multipart==0.0.21
|
|
165
|
+
# via fastapi
|
|
166
|
+
pyyaml==6.0.3
|
|
167
|
+
# via
|
|
168
|
+
# huggingface-hub
|
|
169
|
+
# transformers
|
|
170
|
+
# uvicorn
|
|
171
|
+
regex==2026.1.15
|
|
172
|
+
# via transformers
|
|
173
|
+
requests==2.32.5
|
|
174
|
+
# via
|
|
175
|
+
# huggingface-hub
|
|
176
|
+
# transformers
|
|
177
|
+
rich==14.2.0
|
|
178
|
+
# via
|
|
179
|
+
# agent-cli
|
|
180
|
+
# rich-toolkit
|
|
181
|
+
# typer
|
|
182
|
+
# typer-slim
|
|
183
|
+
rich-toolkit==0.17.1
|
|
184
|
+
# via
|
|
185
|
+
# fastapi-cli
|
|
186
|
+
# fastapi-cloud-cli
|
|
187
|
+
rignore==0.7.6
|
|
188
|
+
# via fastapi-cloud-cli
|
|
189
|
+
safetensors==0.7.0
|
|
190
|
+
# via transformers
|
|
191
|
+
sentry-sdk==2.49.0
|
|
192
|
+
# via fastapi-cloud-cli
|
|
193
|
+
setproctitle==1.3.7
|
|
194
|
+
# via agent-cli
|
|
195
|
+
setuptools==80.9.0 ; python_full_version >= '3.12'
|
|
196
|
+
# via torch
|
|
197
|
+
shellingham==1.5.4
|
|
198
|
+
# via
|
|
199
|
+
# typer
|
|
200
|
+
# typer-slim
|
|
201
|
+
starlette==0.50.0
|
|
202
|
+
# via fastapi
|
|
203
|
+
sympy==1.14.0
|
|
204
|
+
# via torch
|
|
205
|
+
tokenizers==0.22.2
|
|
206
|
+
# via transformers
|
|
207
|
+
torch==2.9.1
|
|
208
|
+
# via agent-cli
|
|
209
|
+
tqdm==4.67.1
|
|
210
|
+
# via
|
|
211
|
+
# huggingface-hub
|
|
212
|
+
# transformers
|
|
213
|
+
transformers==4.57.5
|
|
214
|
+
# via agent-cli
|
|
215
|
+
triton==3.5.1 ; platform_machine == 'x86_64' and sys_platform == 'linux'
|
|
216
|
+
# via torch
|
|
217
|
+
typer==0.21.1
|
|
218
|
+
# via
|
|
219
|
+
# agent-cli
|
|
220
|
+
# fastapi-cli
|
|
221
|
+
# fastapi-cloud-cli
|
|
222
|
+
typer-slim==0.21.1
|
|
223
|
+
# via agent-cli
|
|
224
|
+
typing-extensions==4.15.0
|
|
225
|
+
# via
|
|
226
|
+
# anyio
|
|
227
|
+
# fastapi
|
|
228
|
+
# huggingface-hub
|
|
229
|
+
# pydantic
|
|
230
|
+
# pydantic-core
|
|
231
|
+
# pydantic-extra-types
|
|
232
|
+
# rich-toolkit
|
|
233
|
+
# starlette
|
|
234
|
+
# torch
|
|
235
|
+
# typer
|
|
236
|
+
# typer-slim
|
|
237
|
+
# typing-inspection
|
|
238
|
+
typing-inspection==0.4.2
|
|
239
|
+
# via
|
|
240
|
+
# pydantic
|
|
241
|
+
# pydantic-settings
|
|
242
|
+
urllib3==2.3.0
|
|
243
|
+
# via
|
|
244
|
+
# requests
|
|
245
|
+
# sentry-sdk
|
|
246
|
+
uvicorn==0.40.0
|
|
247
|
+
# via
|
|
248
|
+
# fastapi
|
|
249
|
+
# fastapi-cli
|
|
250
|
+
# fastapi-cloud-cli
|
|
251
|
+
uvloop==0.22.1 ; platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'
|
|
252
|
+
# via uvicorn
|
|
253
|
+
watchfiles==1.1.1
|
|
254
|
+
# via uvicorn
|
|
255
|
+
websockets==15.0.1
|
|
256
|
+
# via uvicorn
|
|
@@ -1,24 +1,130 @@
|
|
|
1
|
-
"""Voice Activity Detection using Silero VAD for speech segmentation.
|
|
1
|
+
"""Voice Activity Detection using Silero VAD for speech segmentation.
|
|
2
|
+
|
|
3
|
+
Uses ONNX model with pure numpy inference (no torch dependency).
|
|
4
|
+
"""
|
|
2
5
|
|
|
3
6
|
from __future__ import annotations
|
|
4
7
|
|
|
5
8
|
import logging
|
|
9
|
+
import urllib.request
|
|
6
10
|
from collections import deque
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import TYPE_CHECKING
|
|
7
13
|
|
|
8
14
|
from agent_cli import constants
|
|
9
15
|
|
|
10
|
-
|
|
16
|
+
if TYPE_CHECKING:
|
|
11
17
|
import numpy as np
|
|
12
|
-
from
|
|
13
|
-
except ImportError as e:
|
|
14
|
-
msg = (
|
|
15
|
-
"silero-vad-lite is required for the transcribe-daemon command. "
|
|
16
|
-
"Install it with: `pip install agent-cli[vad]` or `uv sync --extra vad`."
|
|
17
|
-
)
|
|
18
|
-
raise ImportError(msg) from e
|
|
18
|
+
from numpy.typing import NDArray
|
|
19
19
|
|
|
20
20
|
LOGGER = logging.getLogger(__name__)
|
|
21
21
|
|
|
22
|
+
# Silero VAD model URL and cache location
|
|
23
|
+
SILERO_VAD_VERSION = "v6.2"
|
|
24
|
+
SILERO_VAD_URL = (
|
|
25
|
+
f"https://github.com/snakers4/silero-vad/raw/{SILERO_VAD_VERSION}"
|
|
26
|
+
"/src/silero_vad/data/silero_vad.onnx"
|
|
27
|
+
)
|
|
28
|
+
SILERO_VAD_CACHE = Path.home() / ".cache" / "agent-cli" / f"silero_vad_{SILERO_VAD_VERSION}.onnx"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _get_model_path() -> Path:
|
|
32
|
+
"""Get path to Silero VAD ONNX model, downloading if needed."""
|
|
33
|
+
if SILERO_VAD_CACHE.exists():
|
|
34
|
+
return SILERO_VAD_CACHE
|
|
35
|
+
|
|
36
|
+
LOGGER.info("Downloading Silero VAD model...")
|
|
37
|
+
SILERO_VAD_CACHE.parent.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
|
|
39
|
+
# Download with progress
|
|
40
|
+
urllib.request.urlretrieve(SILERO_VAD_URL, SILERO_VAD_CACHE) # noqa: S310
|
|
41
|
+
LOGGER.info("Silero VAD model downloaded to %s", SILERO_VAD_CACHE)
|
|
42
|
+
return SILERO_VAD_CACHE
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class _SileroVADOnnx:
|
|
46
|
+
"""Pure numpy wrapper for Silero VAD ONNX model."""
|
|
47
|
+
|
|
48
|
+
def __init__(self, *, force_cpu: bool = True) -> None:
|
|
49
|
+
"""Initialize the ONNX model session."""
|
|
50
|
+
import onnxruntime # noqa: PLC0415
|
|
51
|
+
|
|
52
|
+
model_path = _get_model_path()
|
|
53
|
+
|
|
54
|
+
opts = onnxruntime.SessionOptions()
|
|
55
|
+
opts.inter_op_num_threads = 1
|
|
56
|
+
opts.intra_op_num_threads = 1
|
|
57
|
+
|
|
58
|
+
providers = ["CPUExecutionProvider"] if force_cpu else None
|
|
59
|
+
self._session = onnxruntime.InferenceSession(
|
|
60
|
+
str(model_path),
|
|
61
|
+
providers=providers,
|
|
62
|
+
sess_options=opts,
|
|
63
|
+
)
|
|
64
|
+
self._sample_rates = [8000, 16000]
|
|
65
|
+
self.reset_states()
|
|
66
|
+
|
|
67
|
+
def reset_states(self, batch_size: int = 1) -> None:
|
|
68
|
+
"""Reset the internal state for a new audio stream."""
|
|
69
|
+
import numpy as np # noqa: PLC0415
|
|
70
|
+
|
|
71
|
+
self._state = np.zeros((2, batch_size, 128), dtype=np.float32)
|
|
72
|
+
self._context = np.zeros(0, dtype=np.float32)
|
|
73
|
+
self._last_sr = 0
|
|
74
|
+
self._last_batch_size = 0
|
|
75
|
+
|
|
76
|
+
def __call__(self, audio: NDArray[np.floating], sample_rate: int) -> float:
|
|
77
|
+
"""Process an audio chunk and return speech probability."""
|
|
78
|
+
import numpy as np # noqa: PLC0415
|
|
79
|
+
|
|
80
|
+
if sample_rate not in self._sample_rates:
|
|
81
|
+
msg = f"Supported sample rates: {self._sample_rates}"
|
|
82
|
+
raise ValueError(msg)
|
|
83
|
+
|
|
84
|
+
# Expected samples per chunk
|
|
85
|
+
num_samples = 512 if sample_rate == 16000 else 256 # noqa: PLR2004
|
|
86
|
+
context_size = 64 if sample_rate == 16000 else 32 # noqa: PLR2004
|
|
87
|
+
|
|
88
|
+
if len(audio) != num_samples:
|
|
89
|
+
msg = f"Expected {num_samples} samples for {sample_rate}Hz, got {len(audio)}"
|
|
90
|
+
raise ValueError(msg)
|
|
91
|
+
|
|
92
|
+
# Ensure 2D: [batch, samples]
|
|
93
|
+
if audio.ndim == 1:
|
|
94
|
+
audio = audio.reshape(1, -1)
|
|
95
|
+
|
|
96
|
+
batch_size = audio.shape[0]
|
|
97
|
+
|
|
98
|
+
# Reset state if sample rate or batch size changed
|
|
99
|
+
if self._last_sr and self._last_sr != sample_rate:
|
|
100
|
+
self.reset_states(batch_size)
|
|
101
|
+
if self._last_batch_size and self._last_batch_size != batch_size:
|
|
102
|
+
self.reset_states(batch_size)
|
|
103
|
+
if not self._last_batch_size:
|
|
104
|
+
self.reset_states(batch_size)
|
|
105
|
+
|
|
106
|
+
# Initialize context if empty
|
|
107
|
+
if len(self._context) == 0:
|
|
108
|
+
self._context = np.zeros((batch_size, context_size), dtype=np.float32)
|
|
109
|
+
|
|
110
|
+
# Concatenate context with audio
|
|
111
|
+
x = np.concatenate([self._context, audio], axis=1)
|
|
112
|
+
|
|
113
|
+
# Run ONNX inference
|
|
114
|
+
ort_inputs = {
|
|
115
|
+
"input": x,
|
|
116
|
+
"state": self._state,
|
|
117
|
+
"sr": np.array(sample_rate, dtype=np.int64),
|
|
118
|
+
}
|
|
119
|
+
out, self._state = self._session.run(None, ort_inputs)
|
|
120
|
+
|
|
121
|
+
# Update context with last samples
|
|
122
|
+
self._context = x[:, -context_size:]
|
|
123
|
+
self._last_sr = sample_rate
|
|
124
|
+
self._last_batch_size = batch_size
|
|
125
|
+
|
|
126
|
+
return float(out[0, 0])
|
|
127
|
+
|
|
22
128
|
|
|
23
129
|
class VoiceActivityDetector:
|
|
24
130
|
"""Silero VAD-based voice activity detection for audio segmentation.
|
|
@@ -56,7 +162,7 @@ class VoiceActivityDetector:
|
|
|
56
162
|
)
|
|
57
163
|
|
|
58
164
|
# Model and state
|
|
59
|
-
self._model =
|
|
165
|
+
self._model = _SileroVADOnnx()
|
|
60
166
|
self._pre_speech_buffer: deque[bytes] = deque(maxlen=pre_speech_windows)
|
|
61
167
|
self._pending = bytearray()
|
|
62
168
|
self._audio_buffer = bytearray()
|
|
@@ -74,7 +180,7 @@ class VoiceActivityDetector:
|
|
|
74
180
|
|
|
75
181
|
def reset(self) -> None:
|
|
76
182
|
"""Reset VAD state for a new recording session."""
|
|
77
|
-
self._model
|
|
183
|
+
self._model.reset_states()
|
|
78
184
|
self._pre_speech_buffer.clear()
|
|
79
185
|
self._pending.clear()
|
|
80
186
|
self._audio_buffer.clear()
|
|
@@ -84,8 +190,10 @@ class VoiceActivityDetector:
|
|
|
84
190
|
|
|
85
191
|
def _is_speech(self, window: bytes) -> bool:
|
|
86
192
|
"""Check if audio window contains speech."""
|
|
193
|
+
import numpy as np # noqa: PLC0415
|
|
194
|
+
|
|
87
195
|
audio = np.frombuffer(window, dtype=np.int16).astype(np.float32) / 32768.0
|
|
88
|
-
prob = self._model
|
|
196
|
+
prob = self._model(audio, self.sample_rate)
|
|
89
197
|
LOGGER.debug("Speech prob: %.3f, threshold: %.2f", prob, self.threshold)
|
|
90
198
|
return prob >= self.threshold
|
|
91
199
|
|
|
@@ -136,7 +244,7 @@ class VoiceActivityDetector:
|
|
|
136
244
|
self._silence_samples = 0
|
|
137
245
|
self._speech_samples = 0
|
|
138
246
|
self._audio_buffer.clear()
|
|
139
|
-
self._model
|
|
247
|
+
self._model.reset_states()
|
|
140
248
|
else:
|
|
141
249
|
# Not speaking - maintain rolling pre-speech buffer (auto-limited by deque maxlen)
|
|
142
250
|
self._pre_speech_buffer.append(window)
|
|
@@ -13,7 +13,10 @@
|
|
|
13
13
|
[defaults]
|
|
14
14
|
|
|
15
15
|
# --- Provider Selection ---
|
|
16
|
-
# Select the default provider for each service
|
|
16
|
+
# Select the default provider for each service.
|
|
17
|
+
# LLM: "ollama", "openai", or "gemini"
|
|
18
|
+
# ASR: "wyoming", "openai", or "gemini"
|
|
19
|
+
# TTS: "wyoming", "openai", "kokoro", or "gemini"
|
|
17
20
|
llm-provider = "ollama" # "local" still works as a deprecated alias
|
|
18
21
|
tts-provider = "wyoming"
|
|
19
22
|
|