第22篇:语音合成——AI 开口说话
Hermes 功能详解第22篇:语音与 TTS。把文字变成语音,还能自定义音色和语速。
这篇教程将带你了解 Hermes Agent 的语音合成功能,教你怎么让 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 请求piperextra。如果你用的是准备好的源码检出,显式命令是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