🤖HermesBlog
Hermes 功能详解 · 第22篇2026/8/9· Easy Understand Hermes Agent

第22篇:语音合成——AI 开口说话

Hermes 功能详解第22篇:语音与 TTS。把文字变成语音,还能自定义音色和语速。

这篇教程将带你了解 Hermes Agent 的语音合成功能,教你怎么让 AI 在聊天里“开口说话”。

语音合成:AI 开口说话

为什么需要语音?

想象一下,你在做饭时收到一条长消息,盯着屏幕读很麻烦。如果 AI 能直接把回复“说”出来,你一边炒菜一边听,是不是方便多了?Hermes Agent 内置了 11 种语音引擎,从免费到付费,任你挑选。

第1步:选一个“嗓子”

打开配置文件 ~/.hermes/config.yaml,找到 tts 部分。默认用的是 Edge TTS,完全免费、无需注册,效果也不错,适合新手体验。

想换更高级的声音?把 provider 改一下就行:

tts:
  provider: "elevenlabs"   # 换成 ElevenLabs,音质“天花板”

小提示:如果你有 Nous Portal 付费订阅,可以免费用 OpenAI TTS,不用单独申请 API Key。新安装可以跑 hermes setup --portal 一次登录并打开所有网关工具;已有安装则可以在 hermes model 或 hermes tools 里单独为 TTS 选 Nous Subscription。

第2步:配置你的“嗓子”

每种引擎都有自己的设置项。比如用 Edge TTS,可以选声音和语速:

tts:
  provider: "edge"
  edge:
    voice: "zh-CN-XiaoxiaoNeural"   # 中文女声,温柔好听
    speed: 1.0                      # 1.0 是正常语速,调大更快

用 Gemini TTS 的话,还能写“人设提示词”,让 AI 用特定语气说话。比如创建一个 butler-voice.md 文件,里面写“你是一位英国老管家,说话沉稳、礼貌”,然后:

tts:
  provider: "gemini"
  gemini:
    voice: "Kore"
    persona_prompt_file: "~/.hermes/tts/butler-voice.md"

AI 就会用管家的腔调回复你,很有趣。

第3步:测试一下

在 CLI 里直接发消息,AI 回复后,音频会保存到 ~/.hermes/audio_cache/ 文件夹。在 Telegram 或 Discord 里,AI 会直接发语音气泡,点一下就能听。

第4步:处理长文本

如果 AI 回复特别长,超过引擎的单次限制(比如 Edge 是 5000 字符),Hermes 会自动把文本切成几段,按顺序合成,不会丢内容。你不需要做任何事,它自己会搞定。

第5步:高级玩法(可选)

  • 加音效标签:Gemini 3.1 和 xAI 支持在文本里加 [whispers]、[laughs] 这样的标签,AI 会真的用气声说话或笑出来。开启方式:
tts:
  gemini:
    audio_tags: true
  • 调语速:全局语速在 tts.speed 设置,每个引擎可以单独覆盖。比如 OpenAI 想快一点,就写 tts.openai.speed: 1.5。

  • 流式播放的采样率:如果你用的是 OpenAI 兼容的第三方 TTS 服务,流式播放时收到的是没有头信息的裸 PCM,Hermes 得知道它的采样率才不会变调。官方 OpenAI 是 24kHz;如果服务端会在响应头里报采样率(X-Audio-Sample-Rate,或 Content-Type 里的 rate=),Hermes 会自动采用。什么都不报的服务端,就手动设一下 tts.openai.pcm_sample_rate(比如 Piper 后端填 22050),否则声音会变快变尖。

  • 克隆音的授权声明:有些自建的 OpenAI 兼容服务端,用克隆音时会要求请求里带一个 consent_attestation 字段,否则直接返回 400 consent_required。把服务端要求的声明文本填到 tts.openai.consent_attestation 就行,Hermes 会原样转发。用官方 OpenAI API 的话不用管这一项。

  • 本地引擎预热与卸载:Piper、KittenTTS 这类本地引擎是“懒加载”的——第一次说话时才去加载模型(全新安装还要先下载语音),所以开启语音后的第一句回复会先沉默一阵。Hermes 会把语音开关当作“马上要用 TTS”的信号:桌面端打开 Read replies aloud 或开始一次语音对话,CLI / TUI 里执行 /voice tts(以及设置了 voice.auto_tts 时的 /voice on),都会在后台提前加载好引擎;把开关关掉则会卸载常驻模型(Piper 语音几十 MB,KittenTTS 最多约 80MB),不再白占内存。每个开关持有一份“租约”,只有所有界面的租约都释放后模型才会卸载,所以在一个桌面窗口关掉朗读,不会影响另一个窗口正在进行的对话。卸载会等最后一次释放后再等 tts.keep_warm_seconds(默认 60 秒),这段时间内任何开关重新打开语音都会保留已加载的模型,所以唤醒词循环或快速重启的语音对话不会每次都重新加载。把它设为 0 就立即卸载。云端引擎没有模型可加载,开关只是确保按需安装的 SDK(edge-tts、ElevenLabs、Mistral)已经就位。预热是尽力而为的:加载失败也不影响开关本身,第一句回复会像以前一样按需加载。

  • 插件式流式合成:如果你自己写 Python 插件接 TTS 引擎,而引擎在合成的同时就能吐出音频、你希望回复从第一句就开始朗读,那就走插件路线:设 streams_pcm = True 并重写 stream()。Hermes 会调用 stream(text, format="pcm", voice=..., model=..., speed=...),参数和 synthesize() 拿到的 tts.voice / tts.model / tts.speed 一致,并期望返回该采样率下的裸 int16 小端单声道 PCM。streams_pcm、stream_sample_rate 和 is_available() 会在每次回复开始时重新读取,所以可以做成反映实时状态的属性。注意 stream() 和 synthesize() 不同:前一句音频还在播时,最多可能有三句连续调用它,所以必须线程安全。如果 stream_sample_rate 不是正数,或者 is_available() 返回 False,Hermes 就退回一句一句合成。

  • 本地模型下载走镜像:Piper、KittenTTS 这类本地引擎第一次用会从 Hugging Face 拉模型,之后优先用本地缓存,不再联网检查版本。如果你的网络访问不了 Hugging Face,可以在启动 Hermes 的 shell 或服务里导出镜像地址:

HF_ENDPOINT=https://your-hugging-face-mirror.example
HF_HUB_DISABLE_XET=1

HF_HUB_DISABLE_XET=1 是为了让下载走镜像的普通 HTTP 通道,而不是去连不认 HF_ENDPOINT 的 Xet 主机。

  • ElevenLabs:让 agent 自己挑声音:配好 tts.provider: elevenlabs 和 ELEVENLABS_API_KEY 之后,agent 可以在每次 text_to_speech 调用时换一个声音——比如一段对话剧本里,每个角色一个嗓子。ElevenLabs 版的工具比别的提供商多两个字段(其他提供商永远只能用它配置里那个声音):

    • voice_id:这一次用哪个声音。不填就用 tts.elevenlabs.voice_id,配置本身不会被改写。
    • find_voices:不朗读,改成“找声音”。默认每页 20 个(最多 100),用 next_page 翻下一批:
      • source: library(默认)搜公开声音库,几千个社区声音,按使用量排序。库里的声音不用先保存,直接用 voice_id 就能说话(ElevenLabs 只允许付费套餐通过 API 使用库声音,个别声音的 credit_rate 会更高)。
      • source: account 列出你账号下的声音:预置的、你保存过的、克隆的、设计的。
      • 过滤条件:自由文本 query、gender、age、accent、language(ISO 码,比如 en),声音库还支持 use_case(比如 characters_animation)和 sort(usage_character_count_1y、trending、cloned_by_count、created_date)。
    • 库搜索是按声音名字和描述字面匹配的:“orc” 能找到兽人音,但 “dwarf” 可能一个都找不到——所以 agent 会被引导改用“形容音色 + age、use_case 过滤”的方式(比如 “gravelly old” 配 age: old、use_case: characters_animation)。
    • 权限:密钥要开 Text to Speech(说话)和 Voices: Read(搜索)两项。
    • agent 自己听不到声音,只能看每个声音的标签和描述——但每条结果都带 preview_url,你可以先点开试听再定。
    • 在 CLI / TUI 里,/voice tts(以及设置了 voice.auto_tts 时的 /voice on)做的是同一件事,/voice off 释放;连在共享网关上的 TUI 会拒绝 /voice tts,因为网关没法在那个终端里放声音。

两个小提醒

  • KittenTTS 的平台限制:KittenTTS 在 Intel 芯片的 macOS 和 Windows ARM64 上不可用——它的依赖没有为这些平台发布 onnxruntime 或 PyTorch 的 wheel。在这些平台上选中它会直接提示该引擎不可用。

  • Piper 的安装方式:Piper 通过 hermes tools → Voice & TTS → Piper 安装,Hermes 会通过 PM 请求 piper extra。如果你用的是准备好的源码检出,显式命令是 python -c "import pm; pm.sync_venv(['piper'], explicit=True)"。平台标记依然生效。依赖变更后,需要重新激活源码检出并重启 Hermes。

  • 外部命令提供方的环境:像 doubao-speech 这类外部命令提供方,要装在它自己的工具环境里,不要装进 Hermes 的 Python 环境,并让它的可执行文件出现在 PATH 上。

总结

让 AI 开口说话,只需三步:选引擎 → 配声音 → 发消息。免费方案足够日常使用,付费方案音质更惊艳。语音功能让 AI 从“屏幕里的文字”变成了“耳边的小伙伴”,互动感直接拉满。

下篇预告:AI 会说话了,那它能“听懂”我们说话吗?下一篇我们聊聊语音转文字——让 AI 听懂你的语音消息。

📖 官方文档

本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/features/tts