一键导入
hermes-voice-debugging
Debug TTS silence, voice mode failures, and audio playback issues in Hermes Agent CLI and gateway modes.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Debug TTS silence, voice mode failures, and audio playback issues in Hermes Agent CLI and gateway modes.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | hermes-voice-debugging |
| description | Debug TTS silence, voice mode failures, and audio playback issues in Hermes Agent CLI and gateway modes. |
Diagnostic procedures for when TTS is enabled but users don't hear responses, or voice recording fails silently.
Verify edge-tts works:
edge-tts --voice en-US-JennyNeural --text "Hello world" | mpv --no-video -
If this doesn't play, the issue is system-level (audio server, mpv, permissions).
Verify mpv works:
mpv /path/to/tts_file.mp3 --no-video
Try with --volume=50 flag matching what cli.py uses.
Check if TTS tool generates files:
python3 -c "from tools.tts_tool import text_to_speech_tool; print(text_to_speech_tool('test'))"
voice.auto_tts: true is set in configtext_to_speech_tool() generates audio files successfullympv plays files correctly when called manuallyThe function _cli_speak_response_async(self, text) at cli.py ~line 8576 generates TTS audio and plays it via mpv — but has zero callers in the codebase. It was written but never wired into the response handler.
Verify: grep -cn '_cli_speak_response_async(' cli.py — should return 1 (only definition).
The inline MANDATORY TTS at cli.py ~line 9758 calls TTS + mpv for every response, but both stdout and stderr go to subprocess.DEVNULL. Errors become invisible.
Debug: Temporarily replace subprocess.DEVNULL with subprocess.PIPE and read stderr to spot failures.
The _cli_auto_tts flag was added to the config loader but the response handler may not check it. The flow is:
_cli_auto_tts set in HermesCLI.__init__ from config_voice_speak_response_async checks both _voice_tts AND _cli_auto_tts_voice_speak_response_async at allFix checklist:
self._cli_auto_tts = True in __init__ by grepping for the config load_voice_speak_response_async gets called from the response handlerresponse variable actually has content when TTS would triggerSoundDevice not installed or no audio devices:
python3 -c "import sounddevice as sd; print(sd.query_devices())"
Fix: pip install sounddevice or check pavucontrol is running.
Permissions issue:
audio group: sudo usermod -a -G audio $USERsystemctl --user status pipewire pulseaudioSTT provider not configured:
stt.enabled: true in configfaster-whisper, groq needs GROQ_API_KEY)_cli_speak_response_async (~8576)DEVNULL → invisible failures/tmp/hermes_voice/ or $HERMES_HOME/cache/audio/MEDIA: tags in response textWhen a user reports voice issues, follow this order:
mpv test.mp3 --no-video work? If no → audio system issue.text_to_speech_tool("hello") produce a file? If no → provider/key issue._cli_auto_tts being set? Check init logs. Is it being called? Check grep.DEVNULL with PIPE in MANDATORY TTS block temporarily.voice_compatible flag is True in TTS response.To make _cli_speak_response_async the canonical TTS path, add to the response handler at ~line 9757:
# After MANDATORY TTS block or as its replacement:
if self._cli_auto_tts and response and not use_streaming_tts:
self._cli_speak_response_async(response)
Or, use _voice_speak_response_async instead if voice mode infrastructure is preferred.
tui_gateway/server.py — completely separate from cli.py code paths_voice_tts_enabled() (line ~5488) was ONLY checking HERMES_VOICE_TTS env var — never read voice.auto_tts from config.yamlvoice.auto_tts: true in config.yaml have ZERO effect in TUI mode_voice_tts_enabled() now checks BOTH HERMES_VOICE_TTS env var AND voice.auto_tts from config via _voice_cfg_dict()When a user reports voice issues, follow this order:
mpv test.mp3 --no-video work? If no → audio system issue.text_to_speech_tool("hello") produce a file? If no → provider/key issue._cli_auto_tts being set? Check init logs. Is it being called? Check grep._voice_tts_enabled() reading config? If not, patch it (see TUI section above).DEVNULL with PIPE in MANDATORY TTS block temporarily.voice_compatible flag is True in TTS response.Some users configure Hermes as voice-first: the SOUL.md says "always speak your responses", config has voice.auto_tts: true, and TTS is the primary output channel (headless, CLI, no terminal needed to see responses).
For voice-first users:
_cli_speak_response_async as it's cleaner than inline MANDATORY TTS