hermes-agent/tools
Teknium bf8004e3a8 fix(stt): kill faster-whisper silence hallucinations at the source
Local faster-whisper called model.transcribe with bare {'beam_size': 5}:
no VAD, cross-window conditioning on, no confidence filtering. Pure
silence produced hallucinated tokens (E2E: 5s anullsrc WAV -> 'You',
no_speech_prob=0.705) and noisy clips could produce runs of junk, often
in other languages.

Three-layer class fix, one shared owner for every local-whisper call
site (build_local_transcribe_kwargs):

1. Silero VAD filter (bundled with faster-whisper) on by default —
   silence never reaches the model. stt.local.vad: false restores the
   raw behavior for music/ambient transcription.
   stt.local.vad_min_silence_ms tunes chunk splitting (default 500).
2. condition_on_previous_text=False — one hallucinated token can no
   longer seed a self-reinforcing run; negligible cost for
   voice-note-length audio.
3. Segment confidence gate (_join_confident_segments): drop a segment
   only when no_speech_prob > 0.6 AND avg_logprob < -1.0 (openai-whisper's
   own heuristic shape; both must hit so quiet-but-real speech survives).
   Config: stt.local.no_speech_prob_threshold / logprob_threshold.

The WHISPER_HALLUCINATIONS blocklist in voice_mode.py stays as
last-resort defense but should now almost never fire.

E2E (real faster-whisper 'base', CPU int8):
  silence.wav  before 'You'                        -> after ''
  noise.wav    before ''                           -> after ''
  speech.wav   before/after 'Hello World, this is a test of the
               transcription system.' (unchanged)

Docs (EN + zh-Hans), DEFAULT_CONFIG, cli-config.yaml.example updated;
19 unit tests (kwargs contract, off-switch, confidence gate incl.
quiet-speech survival, _transcribe_local wiring), sabotage-verified.
2026-07-29 00:01:33 -07:00
..
computer_use fix(computer_use): revive ended cua-driver sessions once 2026-07-28 14:24:30 -07:00
environments fix(environments): exclude multiline session env from terminal snapshots 2026-07-26 19:30:02 -07:00
neutts_samples
…
wakewords feat(voice): bundle the trained "hey hermes" model as the out-of-the-box default 2026-07-28 07:58:16 -07:00
__init__.py
…
ansi_strip.py
…
approval.py Reapply "feat(observability): integrate NeMo Relay runtime and shared metrics" 2026-07-27 21:10:51 -07:00
async_delegation.py feat(delegation): structured stall metadata + live per-child status in /agents 2026-07-26 17:13:52 -07:00
audio_container.py refactor: extract shared audio container sniffer to tools/audio_container.py 2026-07-28 11:52:44 -07:00
binary_extensions.py
…
blueprints.py
…
browser_camofox.py
…
browser_camofox_state.py
…
browser_cdp_tool.py fix(browser): stop stale cdp_url from stalling every startup by 10+ seconds 2026-07-27 14:32:05 -07:00
browser_dialog_tool.py
…
browser_supervisor.py
…
browser_tool.py fix: scope private URL policy per profile 2026-07-28 14:17:45 -07:00
budget_config.py
…
checkpoint_manager.py feat(diff): cross-surface /diff with staged/all/session modes 2026-07-26 18:28:20 -07:00
clarify_gateway.py feat(clarify): extend multi-select to gateway text fallback and TUI bridge 2026-07-26 17:46:55 -07:00
clarify_tool.py fix(clarify): route multi_select through current dispatch paths and harden callback detection 2026-07-26 17:46:55 -07:00
close_terminal_tool.py
…
code_execution_tool.py fix(kanban): harden delegated-child mutation boundary 2026-07-23 07:33:36 -07:00
computer_use_tool.py
…
credential_files.py
…
cronjob_tools.py feat(cron): user-owned model pins + cron.model fleet default 2026-07-28 11:52:47 -07:00
daemon_pool.py
…
debug_helpers.py
…
delegate_tool.py fix(delegate): isolate async batches from parent interrupts 2026-07-28 14:20:10 -07:00
delegation_live_log.py
…
desktop_ui.py
…
discord_tool.py
…
env_passthrough.py
…
env_probe.py fix(windows): re-fit env_probe console suppression to the temp-file _run + add no-window tests (#67690 follow-up) 2026-07-23 18:20:24 -07:00
fal_common.py
…
feishu_doc_tool.py
…
feishu_drive_tool.py
…
file_operations.py
…
file_state.py
…
file_tools.py
…
focus_pane_tool.py
…
fuzzy_match.py fix(tools): normalize Unicode space family and minus sign in patch fuzzy matching 2026-07-26 20:58:43 -07:00
homeassistant_tool.py
…
hook_output_spill.py
…
image_generation_tool.py
…
image_source.py
…
interrupt.py
…
kanban_tools.py fix: scope kanban auto-subscriptions to active profile 2026-07-26 16:27:52 -07:00
lazy_deps.py fix: route memory-provider dep installs through lazy_deps durable target 2026-07-28 22:40:33 -07:00
managed_tool_gateway.py fix(windows): sweep remaining bare read_text/write_text sites + linter rule 2026-07-24 17:10:39 -07:00
mcp_dashboard_oauth.py
…
mcp_oauth.py fix(mcp): make Figma remote OAuth work via DCR allowlist defaults 2026-07-28 00:53:16 -05:00
mcp_oauth_manager.py fix(mcp): make Figma remote OAuth work via DCR allowlist defaults 2026-07-28 00:53:16 -05:00
mcp_stdio_watchdog.py
…
mcp_tool.py fix: reject ambiguous MCP tool name collisions 2026-07-28 15:02:52 -07:00
memory_tool.py fix(memory): close second-read drift race and treat invalid UTF-8 as unreadable 2026-07-24 15:58:01 -07:00
microsoft_graph_auth.py
…
microsoft_graph_client.py
…
neutts_synth.py fix(voice): reconcile NeuTTS backbone/codec GPU device strings 2026-07-28 14:07:21 -07:00
open_preview_tool.py
…
openrouter_client.py
…
osv_check.py
…
patch_parser.py
…
path_security.py
…
process_registry.py fix(process_registry): reader loop no longer hangs when an orphaned grandchild holds the stdout pipe 2026-07-24 15:59:02 -07:00
project_tools.py
…
read_extract.py
…
read_terminal_tool.py
…
registry.py fix: reject ambiguous MCP tool name collisions 2026-07-28 15:02:52 -07:00
schema_sanitizer.py fix(schema): preserve dependentRequired property names 2026-07-28 14:37:19 -07:00
send_message_tool.py fix(send_message): pass photon DM chat GUIDs through as explicit targets 2026-07-28 18:21:01 -07:00
session_search_tool.py fix(session-search): allow scrolling compacted lineage history 2026-07-26 16:18:31 -07:00
skill_manager_tool.py fix(skills): fail closed on unknown curator ownership 2026-07-25 20:15:37 -07:00
skill_provenance.py
…
skill_usage.py fix(curator): make the autonomous write policy consistent (#67140) 2026-07-25 19:27:17 -07:00
skills_ast_audit.py
…
skills_guard.py
…
skills_hub.py refactor: remove the claude-marketplace skill source (redundant Marketplace hub tab) 2026-07-28 23:16:27 -07:00
skills_sync.py fix(skills): avoid redundant bind-mount scans (#72622) 2026-07-28 04:24:50 -05:00
skills_tool.py fix(skills): scope 60-char description enforcement to the create path 2026-07-24 07:54:21 -07:00
slash_confirm.py
…
terminal_tool.py Reapply "feat(observability): integrate NeMo Relay runtime and shared metrics" 2026-07-27 21:10:51 -07:00
thread_context.py
…
threat_patterns.py
…
tirith_security.py fix: add explicit UTF-8 encoding to all subprocess text=True calls (#53428) 2026-07-24 11:45:57 -07:00
todo_tool.py
…
tool_backend_helpers.py fix(voice): single scoped resolver — STT/TTS keys fall back to the credential pool 2026-07-28 11:53:09 -07:00
tool_output_limits.py
…
tool_result_storage.py
…
tool_search.py feat(tool_search): probe-validate blind tool_call args against the deferred schema 2026-07-26 20:59:36 -07:00
transcription_tools.py fix(stt): kill faster-whisper silence hallucinations at the source 2026-07-29 00:01:33 -07:00
tts_streaming.py fix(tts): route streaming-provider secrets through resolve_provider_secret; bound per-sentence stream bodies at 16 MiB 2026-07-28 22:31:40 -07:00
tts_text_normalize.py fix(tts): unify TTS text preprocessing behind one shared cleaner 2026-07-28 11:55:01 -07:00
tts_tool.py feat(tools): env_passthrough allowlist for command-provider secret scrub 2026-07-28 18:12:26 -07:00
url_safety.py fix: scope private URL policy per profile 2026-07-28 14:17:45 -07:00
video_generation_tool.py
…
vision_tools.py fix(security): pin DNS resolutions for SSRF-safe fetches 2026-07-23 11:44:43 -07:00
voice_mode.py fix(voice): bare stop phrase ends the voice chat on every surface, spoken or typed 2026-07-29 00:01:06 -07:00
wake_word.py fix(wake): coerce dead onnx->tflite on macOS ARM64; clear stale voice turn-timeout 2026-07-28 19:40:25 -07:00
web_tools.py fix: add encoding="utf-8" to Path.write_text() calls (P1) 2026-07-24 17:10:39 -07:00
website_policy.py
…
working_diff.py feat(diff): cross-surface /diff with staged/all/session modes 2026-07-26 18:28:20 -07:00
write_approval.py
…
x_search_tool.py docs(xai): clarify x_search vs xurl routing without schema cross-refs 2026-07-23 21:06:47 -07:00
xai_http.py fix(voice): single scoped resolver — STT/TTS keys fall back to the credential pool 2026-07-28 11:53:09 -07:00
xai_video_tools.py
…
yuanbao_tools.py
…