@kmchai/cortico-world-voice

中文文档
0.2.0发布于 2026/11/01MITES Module零依赖

Cortico World:语音工具、概率阅读、情感和副语言标签、文本过滤和本地回放;语音由Kmch AI服务通过HTTP合成

中文使用文档
文档目录11 节
  1. 安装
  2. 最小配置
  3. 工具
  4. 触发
  5. 情绪、语速与标签
  6. 文本过滤
  7. 出口
  8. 与服务的关系
  9. 从 0.1.x 迁移
  10. 验证
  11. 许可

@kmchai/cortico-world-voice

Cortico 的语音 World:把回复念出来。触发、概率、文本过滤、情绪语义、队列与播放留在这里;合成经 Kmch AI · 服务 的 HTTP 网关完成。

  • 语音工具:voice_speak、voice_hush、voice_style。
  • 三条触发路径:工具显式调用、用户语义请求(「念给我听」)、按概率自动朗读。
  • 情绪与标签:自然语言指令、分类情绪、语速、副语言标签([Laughter]、[Sigh] 等)。
  • 文本过滤:Markdown、代码、网址、动作标记、emoji、指定符号都不念。
  • 出口可拆:本机播放、发 tts.voice 事件交给播放插件、或只合成并交回音频附件。

它不发送聊天消息,也不碰渠道;可见的回复仍走原来的发送工具。Voice 只负责声音,不唱歌。

安装

装两个包:服务负责托管本机 TTS 并暴露网关,语音只连它。

# 在部署的 extensions/ 目录里
corepack pnpm add "D:/path/to/cortico-world-service" --ignore-workspace
corepack pnpm add "D:/path/to/cortico-world-voice" --ignore-workspace

或在控制台「扩展」页选「从本机目录安装」,装完重启进程。启用 worlds.service.enabled 与 worlds.voice.enabled。

最小配置

服务负责拉起本机 TTS 并暴露网关;语音只连它:

{
  "worlds": {
    "voice": {
      "enabled": true,
      "serviceUrl": "http://127.0.0.1:9883",
      "serviceTokenSecret": "",
      "model": "ming3-tts",
      "voice": "4016",
      "playback": "local",
      "autoSpeak": true,
      "autoProbability": 0.3
    }
  }
}

serviceUrl 默认为 http://127.0.0.1:9883。serviceTokenSecret 填部署 .env 里的变量名,值只在请求时读取;服务监听非回环地址时必须配令牌。后端条目、模型 profile 与上游密钥都配在服务 World 里,见服务包 README。

工具

工具作用
voice_speak念一句;可带 emotion、instruct、voice、speed、silent。不受概率限制。
voice_style读或改长期风格(情绪、指令、音色、语速),写回 worlds.voice,影响之后的自动朗读。
voice_hush立刻停声,清空排队。

silent: true 只合成、不在本机播放,音频随工具回执交给渠道,用于语音条这类出口。

触发

路径行为
voice_speak 工具立即念;不受概率限制。可带 emotion、instruct、voice、speed、silent。
用户语义请求最近 explicitWindowSec 秒内的外部消息含 explicitKeywords(默认「语音,声音,发语音,念给我听,读给我听,voice,tts」)时必定朗读。
自动朗读助手正文、指定工具参数、指定事件三类来源,按 autoProbability 掷一次。
<tts>…</tts>只念标签内文,并强制朗读。标签会出现在可见文字里;渠道可见时优先用工具触发。

自动来源:

  • autoFromText:一轮里只有正文、没有函数调用时,念这一轮的正文。
  • autoTools:这些工具的参数会被当作正文。默认 pet_say, pet_ask, console_send,取 script / question / text / content / message / body 里第一个字符串。
  • autoEvents:轮询事件库,念这些事件类型的 meta.body 或正文。

同一段文字 5 秒内只念一次。概率按「一段话」掷,不按句掷。

只想响应工具与显式请求、不要随机朗读:保留 autoSpeak: true,把 autoProbability 设为 0。把 autoSpeak 整个关掉会让 tap 不再挂载,显式关键词也就看不到正文了;这时只保留 voice_speak 工具触发。

自动朗读依赖 Persona 把已挂载 World 的 outputTap() 扇进主 session;仓内 cormini 与 Coopanion 都这样做。只想要工具触发时,把 autoSpeak 关掉即可。

情绪、语速与标签

语音只把语义字段发给服务,由服务的模型 profile 决定怎么落到具体模型:

emotionMode语音发送audiocpp-ming3 profile 的落点
instruct(默认)instructions:默认情绪/指令与语速折成自然语言。options.template_name = "freeform",带上指令。
categoricalemotion:只发情绪标签;没配时用「平静」。emotion 字段。
basicspeed:只发语速倍率。basic 模板,按 speedLevels 取慢速/中速/快速。
tags不发情绪参数,只用正文标签。正文标签。
none都不发。—

OpenAI 兼容条目把 instructions / emotion / speed 直接放进请求。其他模型可在服务面板里覆盖 profile 的字段映射,语音不用改配置。

response_format 每次都带;model 与 voice 配了才带,工具参数里的音色优先于配置默认值。

  • 情绪来源:工具参数 > 正文里的 [emotion:开心] 标记 > defaultEmotion。
  • voice_style 读写长期风格(情绪、指令、音色、语速),写回 worlds.voice。
  • 副语言标签:[Breathing] [Cough] [Sigh] [Laughter] [Surprise-ah] [Surprise-oh] [Dissatisfaction-hnn] [Uhm] [Confirmation-en] [Question-ei] [Question-ah] [Question-en] [Question-oh] [Question-huh]。 paralinguistic: auto 保留标签,由服务里的模型决定演不演;keep 一律保留,strip 一律删除。表外 [...] 会从朗读文本里剥掉,防止被念出来。

文本过滤

按顺序:取 <tts> 内文 → 去围栏代码/行内代码 → 去图片/链接/网址 → 去 Markdown 记号 → 去 【…】、<…>、〈…〉 → 去 emoji 与不可见字符 → 去 filterSymbols 里的字符 → 压缩空白。

过滤后短于 minChars 不念,长于 maxChars 在句末截断。切句优先中英文句末标点,过长在逗号处再切;chunkMax 是单块上限,gapMs 是块间停顿。

出口

playback行为
local(默认)本机播放。Windows 用一个常驻 PowerShell 调 winmm MCI;macOS 用 afplay;Linux 用 ffplay/paplay/aplay。不需要原生 npm 模块。
event每块推一条 tts.voice 事件(带音频附件,deliver: false)。cortico-world-audio-play 默认就监听这个类型。
none只合成,不播放;适合语音只交给别的渠道。

shareAudio: true 时工具回执带音频附件,渠道工具可以用 [blob …] 句柄发送同一段音频。silent: true 的 voice_speak 只合成、不播放,并默认带回附件。

与服务的关系

语音只经 HTTP 调服务,不解析后端方言、不监听端口、不做模型 profile:

路由用途
POST /v1/audio/speech合成音频;体 {model?, input, voice?, response_format, speed?, instructions?, emotion?}。
GET /health探活;World 页的服务灯每 15 秒刷新。
GET /v1/models模型下拉。
GET /v1/audio/voices?model=音色下拉。

服务不可达时:模型与音色下拉保留上一次读到的表,服务灯变红,voice_speak 回失败。语音 0.2.0 不保留直连后端的回退路径。服务不重试上游,语音也不重试。

语音不唱歌:0.1.x 的 voice_sing、【唱】 前缀与 sing* 配置已删除。唱歌由服务的 /v1/audio/sing 和网关/唱歌插件接入。

从 0.1.x 迁移

0.1.x0.2.0
backend、baseUrl、apiKeySecret删除;在服务里添加对应服务条目,语音改填 serviceUrl 与 serviceTokenSecret。
customUrl / customMethod / customHeaders / customBody / customResponse / customAudioPath删除;在服务的 custom 条目里配置。
httpApi / httpPort / httpToken / httpPlay删除;服务的网关取代本地语音接口。
singUrl / singToken、voice_sing、【唱】删除;唱歌由服务的 /v1/audio/sing 与网关接入。
model / voice / format / timeoutMs保留,含义不变。
emotionMode / defaultEmotion / defaultInstruct / speed / paralinguistic保留;语音只发语义字段,由服务的模型 profile 映射到具体模型。
触发、过滤、输出配置保留。

验证

pnpm typecheck
pnpm test
pnpm smoke:player out.wav                 # 本机播放器,音量 0
pnpm smoke:chain http://127.0.0.1:9883    # 触发→过滤→经服务合成→tts.voice 全链路

装进 Cortico 后应看到:World 页多一张「Kmch AI · 语音」卡,服务灯、队列灯与 service / model / voice 徽标;服务在线时灯亮;让 bot 调 voice_speak 能听见;说「念给我听」会绕过概率;playback: event 时时间线出现 tts.voice。

许可

MIT。

版本与发布记录

@kmchai/cortico-world-voice 共发布 3 个版本,首次发布于 2026/11/01;过去 12 个月发布了 3 个版本。

版本发布日期距今
0.2.0latest2026/11/011 天前
0.1.02026/11/012 天前
0.0.0-stage2026/11/012 天前

关于 @kmchai/cortico-world-voice 的常见问题

@kmchai/cortico-world-voice 是什么?

Cortico World:语音工具、概率阅读、情感和副语言标签、文本过滤和本地回放;语音由Kmch AI服务通过HTTP合成

如何安装 @kmchai/cortico-world-voice?

在项目目录运行 npm install @kmchai/cortico-world-voice,或使用 pnpm add / yarn add / bun add。

@kmchai/cortico-world-voice 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/kmchai__cortico-world-voice 是否存在。

@kmchai/cortico-world-voice 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@kmchai/cortico-world-voice 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@kmchai/cortico-world-voice 可以商用吗?

@kmchai/cortico-world-voice 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@kmchai/cortico-world-voice 还在维护吗?

最新版本 0.2.0 发布于 2026/11/01(1 天前);至今共发布 3 个版本,其中过去 12 个月发布了 3 个;首次发布于 2026/11/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。