语音模式#
Hermes Agent 支持在 CLI 和消息平台上进行 完整的语音交互。通过麦克风与 Agent 对话,听取语音回复,并在 Discord 语音频道中进行实时语音对话。前提条件#
1.
已安装 Hermes Agent — pip install hermes-agent(参见 安装) 2.
已配置 LLM 提供商 — 运行 hermes model 或在 ~/.hermes/.env 中设置首选提供商的凭据
3.
基础设置正常 — 运行 hermes 验证 Agent 能够响应文字消息,再启用语音功能
~/.hermes/ 目录和默认的 config.yaml 会在首次运行 hermes 时自动创建。只需手动创建 ~/.hermes/.env 来存放 API 密钥。
付费的 Nous Portal 订阅通过 Tool Gateway 同时提供 LLM(第 2 步)和 OpenAI TTS — 无需单独的 OpenAI 密钥。全新安装时,hermes setup --portal 可一次性完成两项配置。 | 功能 | 平台 | 说明 |
|---|
| 交互式语音 | CLI | 按 Ctrl+B 开始录音,Agent 自动检测静音并回复 |
| 自动语音回复 | Telegram、Discord | Agent 在文字回复的同时发送语音音频 |
| 语音频道 | Discord | Bot 加入语音频道,监听用户发言并语音回复 |
环境要求#
Python 包#
| 扩展包 | 包含的包 | 用途 |
|---|
voice | sounddevice、numpy | CLI 语音模式 |
messaging | discord.py[voice]、python-telegram-bot、aiohttp | Discord 和 Telegram 机器人 |
tts-premium | elevenlabs | ElevenLabs TTS 提供商 |
可选本地 TTS 提供商:使用 python -m pip install -U neutts[all] 单独安装 neutts。首次使用时会自动下载模型。discord.py[voice] 会自动安装 PyNaCl(用于语音加密)和 opus 绑定。这是 Discord 语音频道支持的必要条件。
系统依赖#
| 依赖项 | 用途 | 适用场景 |
|---|
| PortAudio | 麦克风输入和音频播放 | CLI 语音模式 |
| ffmpeg | 音频格式转换(MP3 → Opus、PCM → WAV) | 所有平台 |
| Opus | Discord 语音编解码器 | Discord 语音频道 |
| espeak-ng | Phonemizer 后端 | 本地 NeuTTS 提供商 |
API 密钥#
如果已安装 faster-whisper,语音模式的 STT 无需任何 API 密钥即可运行。模型(base 约 150 MB)会在首次使用时自动下载。
CLI 语音模式#
语音模式在经典 CLI(hermes chat)和 TUI(hermes --tui)中均可使用。两者行为完全一致 — 相同的斜杠命令、相同的 VAD(语音活动检测)静音检测、相同的流式 TTS、相同的幻觉过滤器。TUI 额外将崩溃诊断日志转发至 ~/.hermes/logs/,以便在异常音频后端出现按键录音失败时提供完整堆栈跟踪,而非静默消失。快速开始#
/voice 切换语音模式开/关
/voice on 启用语音模式
/voice off 禁用语音模式
/voice tts 切换 TTS 输出
/voice status 显示当前状态
工作原理#
1.
使用 hermes 启动 CLI,并通过 /voice on 启用语音模式
2.
按下 Ctrl+B — 播放提示音(880Hz),开始录音
3.
开始说话 — 实时音频电平条显示输入状态:● [▁▂▃▅▇▇▅▂] ❯
6.
音频通过 Whisper 转录后发送给 Agent
7.
如果启用了 TTS,Agent 的回复将以语音朗读
此循环持续进行,直到在录音过程中按下 Ctrl+B(退出连续模式),或连续 3 次录音均未检测到语音为止。录音键可通过 ~/.hermes/config.yaml 中的 voice.record_key 配置(默认:ctrl+b)。
静音检测#
1.
语音确认 — 等待音频 RMS 值超过阈值(200)至少 0.3 秒,允许音节间的短暂停顿
2.
结束检测 — 语音确认后,持续静音 3.0 秒即触发停止
silence_threshold 和 silence_duration 均可在 config.yaml 中配置。也可通过 voice.beep_enabled: false 禁用录音开始/结束提示音。流式 TTS#
启用 TTS 后,Agent 在生成文字的同时逐句朗读回复 — 无需等待完整响应:2.
去除 Markdown 格式和 <think> 块
幻觉过滤器#
Whisper 有时会从静音或背景噪音中生成幻觉文字(如"Thank you for watching"、"Subscribe"等)。Agent 使用包含 26 个已知幻觉短语(覆盖多种语言)的列表以及能捕获重复变体的正则表达式模式对其进行过滤。
Gateway 语音回复(Telegram 和 Discord)#
Discord:频道与私信#
| 模式 | 交互方式 | 是否需要 @提及 | 设置 |
|---|
| 私信(DM) | 打开 Bot 的个人资料 → "发消息" | 否 | 立即可用 |
| 服务器频道 | 在 Bot 所在的文字频道中发言 | 是(@botname) | Bot 必须被邀请到服务器 |
私信(个人使用推荐): 直接与 Bot 开启私信并发送消息 — 无需 @提及。语音回复和所有命令与在频道中使用完全相同。服务器频道: Bot 仅在被 @提及时响应(例如 @hermesbyt4 你好)。请确保从提及弹窗中选择 Bot 用户,而非同名角色。如需在服务器频道中禁用提及要求,在 ~/.hermes/.env 中添加: 以下命令在 Telegram 和 Discord(私信和文字频道)中均可使用:/voice 切换语音模式开/关
/voice on 仅在您发送语音消息时回复语音
/voice tts 对所有消息回 复语音
/voice off 禁用语音回复
/voice status 显示当前设置
| 模式 | 命令 | 行为 |
|---|
off | /voice off | 仅文字(默认) |
voice_only | /voice on | 仅当您发送语音消息时才语音回复 |
all | /voice tts | 对每条消息均语音回复 |
平台投递#
| 平台 | 格式 | 说明 |
|---|
| Telegram | 语音气泡(Opus/OGG) | 在聊天中内联播放。如需要 ,ffmpeg 将 MP3 转换为 Opus |
| Discord | 原生语音气泡(Opus/OGG) | 像用户语音消息一样内联播放。如语音气泡 API 失败则回退为文件附件 |
Discord 语音频道#
最具沉浸感的语音功能:Bot 加入 Discord 语音频道,监听用户发言,转录语音,通过 Agent 处理后,在语音频道中语音回复。1. Discord Bot 权限#
前往 Discord 开发者门户 → 您的应用 → Installation → Default Install Settings → Guild Install:| 权限 | 用途 | 是否必需 |
|---|
| Connect | 加入语音频道 | 是 |
| Speak | 在语音频道中播放 TTS 音频 | 是 |
| Use Voice Activity | 检测用户是否正在说话 | 推荐 |
| 级别 | 整数 | 包含内容 |
|---|
| 仅文字 | 274878286912 | 查看频道、发送消息、读取历史、嵌入内容、附件、帖子、反应 |
| 文字 + 语音 | 274881432640 | 以上所有 + Connect、Speak |
https://discord.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot+applications.commands&permissions=274881432640
将 YOUR_APP_ID 替换为开发者门户中的应用 ID。将 Bot 重新邀请到已加入的服务器只会更新其权限,不会将其移除。不会丢失任何数据或配置。
2. 特权 Gateway Intents#
在 开发者门户 → 您的应用 → Bot → Privileged Gateway Intents 中,启用以下三项:| Intent | 用途 |
|---|
| Presence Intent | 检测用户在线/离线状态 |
| Server Members Intent | 将 DISCORD_ALLOWED_USERS 中的用户名解析为数字 ID(条件性) |
| Message Content Intent | 读取频道中的文字消息内容 |
Message Content Intent 为必需项。Server Members Intent 仅在 DISCORD_ALLOWED_USERS 列表使用用户名时才需要 — 如果使用数字用户 ID,可以关闭。语音频道中 SSRC → user_id 的映射来自 Discord 语音 WebSocket 上的 SPEAKING opcode,不需要 Server Members Intent。3. Opus 编解码器#
运行 gateway 的机器上必须安装 Opus 编解码器库:macOS: /opt/homebrew/lib/libopus.dylib
4. 环境变量#
启动 Gateway#
在 Bot 所在的 Discord 文字频道中使用以下命令:/voice join Bot 加入您当前所在的语音频道
/voice channel /voice join 的别名
/voice leave Bot 断开语音频道连接
/voice status 显示语音模式和已连接的频道
运行 /voice join 前,您必须已在某个语音频道中。Bot 会加入您所在的语音频道。
工作原理#
2.
检测静音 — 至少 0.5 秒语音后出现 1.5 秒静音即触发处理
3.
转录音频(通过本地、Groq 或 OpenAI 的 Whisper STT)
4.
处理完整的 Agent 流水线(会话、工具、记忆)
文字频道集成#
转录内容会出现在文字频道中:[Voice] @user: 您说的内容
Agent 回复同时以文字发送到频道并在语音频道中朗读
文字频道为发出 /voice join 命令的那个频道
回声消除#
Bot 在播放 TTS 回复时会自动暂停音频监听,防止听到并重复处理自身的输出。访问控制#
只有 DISCORD_ALLOWED_USERS 中列出的用户才能通过语音进行交互。其他用户的音频会被静默忽略。
配置参考#
config.yaml#
环境 变量#
STT 提供商对比#
| 提供商 | 模型 | 速度 | 质量 | 费用 | 需要 API 密钥 |
|---|
| 本地 | base | 快(取决于 CPU/GPU) | 良好 | 免费 | 否 |
| 本地 | small | 中等 | 较好 | 免费 | 否 |
| 本地 | large-v3 | 慢 | 最佳 | 免费 | 否 |
| Groq | whisper-large-v3-turbo | 非常快(约 0.5 秒) | 良好 | 免费额度 | 是 |
| Groq | whisper-large-v3 | 快(约 1 秒) | 较好 | 免费额度 | 是 |
| OpenAI | whisper-1 | 快(约 1 秒) | 良好 | 付费 | 是 |
| OpenAI | gpt-4o-transcribe | 中等(约 2 秒) | 最佳 | 付费 | 是 |
提供商优先级(自动回退):本地 > groq > openaiTTS 提供商对比#
| 提供商 | 质量 | 费用 | 延迟 | 需要密钥 |
|---|
| Edge TTS | 良好 | 免费 | 约 1 秒 | 否 |
| ElevenLabs | 优秀 | 付费 | 约 2 秒 | 是 |
| OpenAI TTS | 良好 | 付费 | 约 1.5 秒 | 是 |
| NeuTTS | 良好 | 免费 | 取决于 CPU/GPU | 否 |
NeuTTS 使用上方的 tts.neutts 配置块。
故障排查#
"No audio device found"(CLI)#
Bot 在 Discord 服务器频道中不响应