Releases: Whereis-Alice/astrbot_plugin_genie_tts_llm
Releases · Whereis-Alice/astrbot_plugin_genie_tts_llm
Release list
v1.10.1 · 关于页接口清单补齐语音收藏的 11 条接口
- [修复] 工作台「ⓘ 关于」页的接口清单少了语音收藏的 11 条:这一页有两处在讲同一件事 —— 顶部那枚 chip 写「接口 39」,是后端
_routes()注册完之后回报的真实条数;下面那张「接口清单」逐行列出每个接口,取的却是前端自己维护的一份静态表。v1.10.0 加语音收藏时后端注册了 11 个新接口,前端这张表忘了同步,于是同一张卡上一边说 39、一边只列得出 28 行,favorites/*整个分区在清单里搜不到 —— 想照着清单调接口、或者只是想确认某个功能到底有没有对应的 HTTP 入口,都会被误导。现在把这 11 条按后端注册顺序补进清单(读取整个音库、浏览器里试听原始音频、改名、改备注 / 标签 / 置顶、删掉一条、清空音库、下载单条音频、导出收藏包 zip、导入收藏包 zip、拖放上传音频入库、把试听结果存进收藏),并逐条校过前后端的「路径 + 方法」集合完全一致,两边的数字终于对得上了。本版只改关于页的展示数据,不涉及任何接口行为,升级后不需要做任何操作。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.10.0...v1.10.1
v1.10.0 · 语音收藏 / 语音转文件:把 bot 发过的好语音原样留住
- [新增] 语音收藏:把 bot 发过的好语音原样留住:TTS 每次合成都带随机性 —— 同一句话、同一个参考音频,这一遍的气口和语气就是比上一遍好,可临时音频 30 分钟后就被清理了,想留下来只能干瞪眼。现在引用我发的那条语音、再发一句
/语音收藏,这条就进了收藏夹:- 无损:走的是插件自己的发送记录(每个会话记最近 16 条),把原始 WAV 逐字节复制进
voice_vault/,不重新编码、不重采样、不转格式,收藏出来和当时听到的是同一串字节。 - 对得上人:很多平台的引用消息里拿不到可用的音频 ID,所以改成按时间窗匹配 —— 引用那条消息的时间戳跟发送记录对得上(±45 秒)就认它,并在回执里写明
时间匹配 ±X.Xs让你自己复核。不引用直接发指令,就取本会话最近发出的那一条。 - 兜底也说实话:发送记录里翻不到(AstrBot 重启过、语音是半小时前发的)时,退回去读协议端存的那份副本 —— 那通常是它自己转码过的 silk/amr,比原始 WAV 有损。这种条目在列表里带一个
有损角标,回执里也直说「想要无损请在 30 分钟内引用」,不拿转码副本冒充原件。 - 不重复:入库前算 sha256,同一条语音收两次只留一份,第二次直接告诉你已经收过了。
- 不怕丢:
voice_vault/独立于临时音频目录,定时清理不碰它。索引index.json万一写坏了,下次加载会扫audio/目录把音频文件重新认领回来,收藏不会因为一个 JSON 损坏而全部消失。
- 无损:走的是插件自己的发送记录(每个会话记最近 16 条),把原始 WAV 逐字节复制进
- [新增]
/语音转文件:把语音存到手机或电脑上:收藏是留在服务器上的,想把语音搬到自己设备里得能当文件发出来。引用语音发/语音转文件,同一份音频会以文件形式外发,长按就能存进相册或文件管理器。这条指令不入库、也不受语音收藏总开关的限制 —— 它只是换一种发送方式。外发通道由voice_file_upload_mode决定:auto(默认)先试 AstrBot 的文件消息段,抛异常就退回 OneBot 的upload_group_file/upload_private_file;component只走消息段;onebot_action只走 OneBot 接口。两条路都没走通时,两边的失败原因会合并报给你,而不是只留一句「发送失败」让人无从下手。 - [新增] 收藏管理的 12 条指令:
/语音收藏、/收藏列表、/发收藏、/收藏文件、/语音转文件、/删收藏、/收藏改名、/收藏备注、/收藏置顶、/收藏导出、/收藏导入、/收藏清空,每条都配了英文别名(/tts-fav、/tts-favs、/tts-fav-send…)。几个真用起来会踩到的细节都处理了:- 序号或名字都能定位:
/发收藏 2按列表序号,/发收藏 撒娇按名字 —— 先精确匹配别名,再试 ID 前缀,最后模糊匹配别名和正文;命中多条不会瞎猜,而是把候选连同序号列出来让你挑。 /收藏清空分两步:光发指令只给预览(要删几条、留几条置顶),补一个确认才真删;默认保留置顶,想连置顶一起清得显式写全部。- 容量淘汰只挑未置顶的:超出
voice_favorite_limit时从最旧的未置顶条目开始删,置顶过的永远不会被自动淘汰。
- 序号或名字都能定位:
- [新增] 收藏包:整库打包搬家:
/收藏导出打一个 zip 出来(index.json+audio/<id>.wav),别名、备注、标签、角色、情感、原文这些元信息随音频一起走;/收藏导出 1,3,5只导指定的几条。/收藏导入认三种模式,语义和感情包那套对齐:merge(默认,只补新的)、overwrite(同名覆盖)、replace(先清空再导)。导入前先校验:不是 zip 直接拒,音频扩展名不在白名单的丢弃,ID 形状不对的挡掉(防伪造路径穿越),解压总量超过 512MB 直接拒绝(防 zip 炸弹)。 - [新增] 工作台多了一个「🎧 语音收藏」页:指令适合随手收,批量整理还是得有界面。这一页可以直接试听原文件(不是重新合成,是收藏进去的那串字节)、改名 / 写备注 / 打标签 / 置顶、按角色 / 情感 / 标签 / 有损与否 / 关键词多维筛选、单条下载到本地、拖放音频文件上传入库、整库导入导出。合成台上也多了一个「存进收藏」按钮 —— 试听觉得这一遍不错,当场就能留下,不用先发到聊天里再引用一遍。为此新增 11 个 WebUI 接口(合计 39 个)。
- [新增] 4 项配置(配置 → 语音收藏):
enable_voice_favorites(总开关,默认开;关掉只是让指令回一句提示,已存的收藏不删)、voice_favorite_limit(条数上限,默认 200,范围 1~5000)、voice_favorite_max_mb(单条体积上限,默认 32MB,最小 1)、voice_file_upload_mode(文件外发通道,auto/component/onebot_action)。 - [修复] 同一秒里连收两条,列表顺序会随机换位:收藏排序原本是「时间戳降序,打平了比 ID」,而时间戳只精确到秒、ID 是随机 uuid —— 一秒内收两条以上(批量导入、连点工作台的「存进收藏」)就会撞上并列,顺序完全取决于随机 ID 谁大谁小。后果是实打实的:刷新一下列表序号就换了,
/发收藏 2发的不是你刚看到的那条;工作台和指令各排一次序,两边序号还能不一致;容量淘汰挑「最旧」时也在并列里随机挑,可能删掉后收藏的那一条。现在每条收藏带一个单调递增的内部序号seq,同秒按「先收藏的排在后面」稳定排列,容量淘汰用同一把尺子。老索引里没有seq,首次加载会按现有顺序自动补齐并写回,升级不用做任何操作。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.7...v1.10.0
v1.9.7 · 日志页不再自己跳、界面偏好终于能读回来,运行日志上色
- [修复] 展开 / 折叠合成记录时页面会自己往上跳:点一下「展开」,视口经常直接蹿到别的地方,想接着看下一条得重新往下翻。原因是展开态一变就
renderLogs()整页重画:clear(view)先把内容全删掉,文档瞬间变短,浏览器立刻把scrollTop夹到新的最大值(往往就是 0),等内容补回来滚动条已经回页首了。现在展开 / 折叠只替换那一条记录的节点,并按这一行在视口里的位置回填滚动量 —— 点过的那行钉在原地不动,键盘焦点也留在它上面。 - [修复] 自动刷新会每 5 秒把你弹回页首:同一个成因。日志页是全站唯一会自己定时重画的分区,开着自动刷新往下翻记录时,每一轮 tick 都把视口打回顶部。现在日志页所有重画(自动刷新、手动刷新、改筛选条件、搜索防抖回调)都走保位版本:重画期间先钉住容器高度让文档别缩,画完再把滚动位置写回去。切换子视图(合成记录 / 运行日志 / 情感统计)仍然明确回到页首 —— 那是换内容,本来就该从头看。
- [修复] 界面偏好从来没被恢复过:每次打开工作台,主题都退回「月夜」、密度退回「宽松」、上次停在哪个分区也不记得。日志里只有一条 DEBUG:
读取界面偏好失败: PluginKVStoreMixin.get_kv_data() missing 1 required positional argument: 'default'。get_kv_data(key, default)在这些 AstrBot 版本里default是必填位置参数(不是带缺省值的关键字参数),插件只传了 key,于是读取每次都抛异常、每次都吞掉、每次都回落到默认值 —— 保存那一侧一直是好的,写进去的偏好只是从来没被读出来。现在按签名补上default,并把这条日志从 DEBUG 提到 WARNING(读不回来只影响记忆、不影响功能,但不该查不到原因)。 - [新增] 运行日志着色:以前一屏运行日志是清一色的灰字,要在几十行里找出「哪条是情感、哪条是合成、哪条炸了」只能逐行读。现在分三层上色:
- 按分类给色相:14 个分类各一个 hue(合成 / 分段停顿 / 情感 / 提示词 / 翻译 / 感情库 / 感情包 / 服务器 / 队列 / 触发 / 会话 / 生命周期 / WebUI / 其它),左侧细条、分类名前的小圆点、分类名本身共用它 —— 扫一眼就能按颜色成组。
WebUI一类是工作台自己戳接口产生的噪音,故意压成灰蓝,不跟真正的业务日志抢注意力。 - 级别优先:WARNING / ERROR / CRITICAL 的左条特异性更高,会盖掉分类色,出问题的行永远优先显示成黄 / 红,不会被分类色淹掉。
- 正文分词:
[会话 ID]、[emotion=…]这类方括号 ID,「」/“”里的原话,成败关键词(失败 / 超时 / 放弃 vs 成功 / 命中 / 就绪 vs 跳过 / 重试 / 截断),文件路径与标识符(tts_engine.py:441、emotions.json、aino/normal、Worker-3),全大写缩写(TTS、LLM),带单位的数字(1420ms、12.5KB、3 次)各自单独上色;普通拉丁词只换等宽字体、不换颜色,避免整行花成圣诞树。 - 六套主题共用一份色表:所有分类色都用
color-mix往正文色里兑,暗色主题自动提亮、亮色主题自动压深,不用为每套配色各写一遍。 - 顺带把级别 badge 定宽(分类与正文对齐成列,行首不再左右跳)、加了一层极淡斑马纹。
- 「筛运行日志」卡片里多了一个着色开关,关掉就退回纯文本;这个选择和主题、密度一样会被记住。着色纯粹是前端渲染,复制 / 下载 / 搜索走的都是原始数据,导出的文本与真实日志逐字符一致。
- 按分类给色相:14 个分类各一个 hue(合成 / 分段停顿 / 情感 / 提示词 / 翻译 / 感情库 / 感情包 / 服务器 / 队列 / 触发 / 会话 / 生命周期 / WebUI / 其它),左侧细条、分类名前的小圆点、分类名本身共用它 —— 扫一眼就能按颜色成组。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.6...v1.9.7
v1.9.6 · 合成失败不再往聊天里插提示
- [变更] 合成失败不再往聊天里插提示:以前 TTS 失败会在回复末尾挂一行
(TTS合成失败),于是对话里会冒出「里面还有一只粉色小猪(TTS合成失败)」这种把内部管道直接摊给对面看的句子,角色扮演的沉浸感当场碎掉。失败提示追加到回复(enable_tts_failure_notice)默认改为关:失败时聊天里只是少一条语音、文字照发,别的什么都不加。v1.9.5 起完整的失败链路已经躺在工作台「日志」页(合成记录 + 运行日志 + 情感统计),聊天里那行提示纯属噪音。真要旧行为,去「配置 → 输出形态」把它打开。 - [修复] 老安装不会因为「改了默认值」就自动生效:AstrBot 会把插件首次加载时的默认值写进
data/config/…_config.json,所以光改模板默认值救不了已经装过的实例(配置文件里明明白白写着true)。这次带了一次性迁移:升级后首次加载把这一项关掉并保存,同时写一个 KV 标记 —— 只做一次,之后你自己重新打开也不会又被它关掉。存盘失败则回滚内存里的值,保证行为和配置文件一致。 - [修复] 有一条失败提示绕过了开关,而且从来不写日志:「语音合成成功、但 AstrBot 主动发送音频失败」这条回退分支是硬拼的
(TTS音频发送失败),既不看上面那个开关,也不打日志;更糟的是外层已经先把这次合成记成了「成功」,于是这类失败在日志页里根本查不到。现在它走同一个开关、补一条带会话 ID 的 WARNING,合成记录也会如实记成失败(原因:音频发送失败)—— 和 LLM 主动发语音那条链路的记法对齐。 - [改进] 提示被隐藏时日志级别升到 WARNING:提示不进聊天之后,日志就是这次失败唯一的出口,只有 WARNING 以上才能被日志页的「只看问题」一档筛出来。
- [改进] LLM 主动发语音失败时也别让模型念技术细节:那条链路是把失败原因当工具返回值交给模型的,原文写着「请检查翻译配置或日志」,模型很自然就把这句转述给了用户。现在这几条内部失败的返回值末尾都补了一句约束:只用角色口吻简短提一句没能发出语音,不要复述工具名、配置项和日志。模型自己传错文本或情感名那几种情况不受影响 —— 那些本来就该让它改了重试。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.5...v1.9.6
v1.9.5 · WebUI 新增日志模块,把「情感为什么选成这样」变成可查
- [新增] WebUI「日志」页:终于能看见 bot 为什么挑了这个情感:以前情感选得不好只能干瞪眼 —— AstrBot 控制台里插件的日志和其它插件混在一起、刷得飞快,而「LLM 原话是什么、翻译成了什么、真正送进 TTS 的是哪串文本、最后落到哪个角色的哪个情感、是 LLM 自己选的还是关键词兜底的」这条链路根本没留痕。现在工作台多了一个 ▤ 日志页,三个子页各管一段:
- 合成记录:每次合成一行,展开后是完整链路 —— LLM 原文 / 翻译结果 / 真正送进 TTS 的文本 / 命中的参考音频与参考文本 / 情感来源(LLM 选择、关键词兜底、固定情感、随机)与当时的候选情感列表 / 分段数与段间停顿 / 输出方式 / 重试与尾部截断补偿 / 耗时 / 失败时的原因原文。对着这些字段就能判断是情感选错了、参考音频不对,还是文本在送出前就被改坏了。
- 运行日志:只收本插件自己打的日志,不掺别的插件;按级别(含「只看问题」一档,等于 WARNING + ERROR + CRITICAL)和分类(翻译 / 情感 / 提示词 / 触发 / 服务器 / 队列 / 分段 / 合成 / 会话…)筛,也能全文搜关键词。
- 情感统计:按「角色 · 情感」聚合、按失败率倒序排,直接回答「哪些情感不好」;同时给出调用次数、平均耗时、成功率。
- [新增] 日志页配套操作:关键词 / 级别 / 分类 / 状态 / 来源 / 角色多维筛选(筛选条件会一并交给后端,不是前端假筛),5 秒自动刷新(输入框正在打字时自动让路,不会把光标刷掉),一键把当前一屏复制成纯文本,按当前筛选导出
.txt,以及清空缓冲。 - [新增] 4 项配置(配置 → 日志与诊断):
enable_run_log(总开关,默认开)、run_log_capacity(运行日志条数,505000,默认 500)、2000,默认 200)、run_log_synth_capacity(合成记录条数,20run_log_full_text(关掉后只留 160 字摘要,省内存)。整套日志是纯内存环形缓冲,不写盘,重载插件即清空 —— 不会悄悄在磁盘上堆日志文件,也不会把 LLM 原文留到本次会话之后。 - [新增] 日志页签带角标:有合成失败/跳过时显示红色条数,只有 WARNING 以上日志时显示黄色条数,都没有就显示当前缓冲里的合成条数 —— 不用点进去也知道有没有事发生。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.4...v1.9.5
v1.9.4 · 变更报告的五个等宽列装不下差异极大的内容
- [修复] WebUI 导入感情包:粘完 JSON 按钮还是灰的:「感情包内容」输入框的
oninput只把文本写进内部状态,不刷新按钮,于是手动粘贴或输入之后试运行 / 执行导入 / 直接写入 / 清空内容 / 格式化 JSON五个按钮仍是渲染那一刻的禁用状态,字数提示也一直停在「还是空的」,非得再去点一下合并模式或试运行开关才活过来(拖放文件那条路径本来就会重渲染,所以只有手动粘贴会撞上)。现在按钮和提示随输入实时刷新,并且只定点更新这几个节点,不整块重渲染,光标和焦点不会被吃掉。 - [修复] 变更报告的五个等宽列装不下差异极大的内容:新增 / 更新 / 跳过 / 移除 / 无效这五个桶的内容量能差出两个数量级 —— 常见形态是「4 个桶空着、1 个桶 1 条」,也可能是「一次新增 39 条、每条带一串
reference_audio/xxx.ogg长路径」。等宽固定列在这两头都难看:空列白占一大片,满列被挤成一行行省略号。现在改成:- 空桶不再建列,收成底下一行灰色 pill(
跳过 0、移除 0…);五个桶全空时直接写明「这份包对现有数据毫无影响」; - 有内容的列按条目数分三档抢宽度,一个桶独占时能吃满整行;
- 每条拆成「角色 · 感情 / 变化原因 / 新旧值」三行竖排,长路径按字符断行 + 两行截断,完整新旧值挂在鼠标悬停提示上;
- 超过 10 条先折叠,点「展开全部 N 条」之后才在列内滚动,不让一份大报告把整页顶飞。
- 空桶不再建列,收成底下一行灰色 pill(
- [优化] 报告里终于能看出「动的是哪条参考音频」:以前
新增 / 跳过 / 移除只报「角色 · 感情」,一次导入 39 条时根本看不出每条指向什么;更新那栏则写死一句「文本/语言有变」,参考音频前缀又都一样,截断后两边显示得一模一样,等于什么都没说。现在导入报告会把具体条目一起带回来,并按桶分别渲染:新增写出新条目的参考音频文件名、语言和参考文本;移除(替换模式)写出即将被清掉的原值,动手之前能看清丢的是什么;跳过明确写「已存在,保留现有值」,并把被忽略的包内值并排摆出来,方便判断要不要改成覆盖模式;更新逐字段比对,只列真正变了的字段,路径只比文件名(a.wav → b.wav),完整值仍可悬停查看。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.3...v1.9.4
v1.9.3 · 把 T2S 重抽搬到 decode 层,根治整句凭空消失
- [修复] 整句凭空消失、结尾少一句:把重采样搬到真正便宜的那一层:v1.9.2 已经会重采样了,但重试代价太高,预算只给得起 4 次尝试,实际不够用。这次量出了准确的失败率与代价结构,改在 decode 层重抽:
- 退化率远高于上版的估计:病例句
こんにちは。+isla_01_calm实测单次 decode 退化率约 60%(退化形态是第一步就吐结束符,semantic token 数 = 0,该句段一点音频都没有)。v1.9.2 的 4 次尝试意味着整句丢失概率约 1/6——正好对应用户遇到的频率。 - 旧的重试贵在无关的部分:v1.9.2 的重试点在
_synthesize_segment,一次重试会把整个tts()重跑一遍,包括 encoder、BERT 和参考音频 SSL——那才是耗时大头,而它们的输出本来就是可复用的。所以预算只能给到 4 次。 - 改到 decode 层重抽(根治):encoder 只算一次,之后只重跑 AR 解码。退化的那一次在解码循环第 1 步就退出,实测一次重抽约 2s,而一次成功的解码约 5s——重抽几乎免费,于是预算可以给到 13 次尝试(
GENIE_T2S_DECODE_RETRIES,默认 12 次重抽)。按 60% 退化率,13 次全败的概率约 0.13%,再叠上下面的插件端兜底基本可以忽略。 - 线上实测:病例短句连打 8 次全部拿到音频(改前的期望是空手 1-2 次),三句一次请求打 6 次、每次都完整保留 2 段句间停顿(无丢句),共 15 次请求 0 失败。Space 日志里能看到
T2S recovered on decode attempt N/13,本轮观测到的最坏情况是第 4 次抽中。 - 用户点停止时立刻返回,取消不消耗重抽预算,也不会被误当成退化。
- 退化率远高于上版的估计:病例句
- [修复] 后端整段合成失败时插件根本不重试:
_attempt_synthesis_on_server里那个「最多合成两次」的循环,只在首次结果时长异常时才会走到第二次;首次就连一个字节都没拿回来(后端整段失败)时是直接return None,也就是这条语音直接发不出去,而这恰好是上面那个退化最常见的表现形式。现在这种情况会自动重抽一次。 - [新增] 合成统计新增「空结果重试」:
/tts-status与 WebUI 工作台侧栏都会显示(为 0 时不占版面)。这个数字长期非 0 说明 Space 端还是旧版app.py,提示文案里会直接写明该去更新。
本版本的根治项在 Hugging Face Space 侧(
app.py):用本仓库推荐 Space 模板的用户请同步更新自己的 Space;v1.9.2 的「Space 端重采样」同样在app.py,一次更新覆盖两个版本。只更新插件也能用——第 2、3 项都是插件侧——但整句丢失的概率仍然是旧的量级。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.2...v1.9.3
v1.9.2 · 长回复后半段被静默丢掉导致「话没说完」
- [修复] 语音结尾被截断、句子念不完,或整句凭空消失:根因在 Space 端——T2S 的 ONNX 采样没有固定随机种子,同一句话偶尔会在第一步就吐出结束符,该句段合成不出任何内容,服务端只写了一行日志就把它静默丢掉。落在最后一段就是「最后一个字没说完就突然结束」,落在中间就是一整句凭空消失。HF Space 日志实测抽样失败率约 25%,且完全随机——重采样一定有效。这次三层一起修:
- Space 端重采样(根治):单个句段采空、或音频明显短于该句段应有的长度时,就地重新采样,最多 3 次(
GENIE_SEGMENT_RETRIES)。短音频的判定阈值是GENIE_SHORT_RETRY_S_PER_CHAR(默认 0.075s/可发音字,只对 4 字以上的句段生效,避免短句误判)。全部不合格时取最长的一次,绝不静默丢句。用户点停止时立即返回,取消不会触发重试。 - 插件端截断防护(兜底):合成结果的时长低于文本应有的下限时重合成一次,取更接近合理区间的那一次。新增
enable_tts_truncation_guard(默认开)与tts_truncation_guard_seconds_per_char(默认 0.10s/字,日语实测最快 0.148s/字,取一半留足余量,只抓量级异常)。 - 尾部补静音:成品语音末尾补一小段静音,新增
tts_tail_padding_ms(默认 180ms,0 为关闭)。Space 有意丢掉每次请求末尾的句间停顿,最后一个音几乎贴着文件结尾,再叠上 QQ 把 WAV 转成 silk 时的收尾,尾音听起来就像被硬切。 - 偏长与偏短统一打分:原来只判「异常偏长=疑似参考音频泄漏」。现在过长、过短、合格用同一套评分排序,「两次都偏长取更短的」「两次都偏短取更长的」由同一个比较式覆盖,两个防护不会互相打架;首次结果偏短时也不会被丢成「合成失败」,缺几个字总好过整条语音发不出去。
- Space 端重采样(根治):单个句段采空、或音频明显短于该句段应有的长度时,就地重新采样,最多 3 次(
- [修复]
[pause=ms]标记本身被当成了要朗读的内容:pause和后面的数字都落在可发音字符集里,于是「只有一个停顿标记的消息」会被判成有内容并送去合成——那正好是触发参考音频泄漏的输入;带标记的正常句子也会把可发音字数算多,让新加的截断防护误判偏短、白白重试一次。现在统计可发音字符前会先剥掉标记本身。 - [修复] 长回复的后半段被静默丢掉,听起来同样像「话没说完」:这是与上面完全独立的第二个成因,而且是必然发生而非随机。
tts_max_text_length之外的文本会被直接丢弃、永远不会被朗读,而它的默认值只有 150 字——中文回复翻成日文后字数普遍要涨,一段稍长的回复很容易在半路被砍掉。旧的截断点还把句末标点和逗号顿号混在一个字符集里从后往前找,于是经常正好切在逗号上,听起来就是标准的「话说到一半断了」。触发时只写了一条info日志,用户根本看不到。这次三处一起改:- 默认上限
150 → 300,够装下绝大多数一次性回复,又不会让一条消息排出十几个分块;0仍然表示完全不限制。 - 截断点分两档优先级:先找句末标点(
。!?!?…..与换行),并把紧跟其后的」』)等收尾符号一起带上;只有当句末标点太靠前(会丢掉一半以上内容)时才退让到逗号顿号一类的软停顿,并把软停顿本身去掉,让后面的补句末标点逻辑给它接上句号,而不是留下「……,。」这种别扭的组合;两档都不可用才硬切。 - 触发截断时日志从
info升级为warning,明确写出「超长部分不会被朗读」和该调哪个配置;同时新增text_truncated统计,/tts-status与 WebUI 工作台侧栏都能看到次数和当前上限,工作台的流水线预览也会写明后面多少字不会被朗读。
- 默认上限
- [新增] 截断拦截次数进入统计面板:
/tts-status的合成统计与 WebUI 工作台侧栏都会显示,工作台的运行参数卡新增「尾部静音」,状态区新增「截断防护 开/关」标记。 - [优化] 新增的 3 项配置已归入 WebUI 配置页分组:原「泄漏防护与持久化」改名为「音质防护与持久化」,同时容纳泄漏与截断两类防护,不会被塞进「其它」分组。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.1...v1.9.2
v1.9.1 · 修好点标签不切换、八个分区全堆在一页
- [修复] WebUI 工作台点标签不切换、内容全堆在一页:
.view自带display: flex,作者样式表的类选择器盖掉了浏览器内置的[hidden] { display: none },导致 JS 已经把非当前分区标成hidden、页面上却 8 个分区一起显示,看起来就像「点了别的模块,内容全跑到页尾去了」。现在在样式表最前面加了[hidden] { display: none !important; }全局兜底。 - [修复] 批量操作条在没有勾选时仍然显示:感情库「已选 N 条 / 导出所选 / 批量删除」那一条用的
.row-tight也带display: flex,属于同一个根因,一并修好。 - [修复] 侧栏「运行统计」与底部状态栏计数不一致:合成完成后只刷新了状态栏,侧栏 RUNTIME 卡还停在打开页面时的快照(会出现「总请求 2 / 成功 0」对「请求 3 · 成功 1」这种对不上的情况)。现在统计卡改成局部刷新,合成成功与失败都会同步,而且不再整体重渲分区——正在播放的试听音频不会被打断。
- [优化] 切换分区时把滚动位置拉回顶部:从很长的分区(比如感情库)切到别的分区,不用再自己往上滚。
- [优化] 离线冒烟测试新增回归断言:切分区后校验「有且仅有一个分区可见」、校验滚动复位真的发生,并对样式表做静态检查确保
[hidden]兜底规则不会再被删掉。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.9.0...v1.9.1
v1.9.0 · 新增 WebUI 语音合成工作台与感情包导入导出
- [新增] WebUI 语音合成工作台:AstrBot WebUI 的插件页里多了一整套可视化面板,不用记指令也能把插件玩明白。后端新增 24 个接口,全部走 AstrBot 自带的插件页桥接,不额外开端口、不引入新依赖。八个视图:
- 合成台:选角色 / 感情、写文本、直接在页面里合成并试听;「分段预览」能看清句子会被怎么切分、每段补多少停顿、哪些片段因为没有可发音字符被跳过。
- 感情库:表格化管理所有角色与感情,支持新增 / 编辑 / 删除 / 复制到别的角色 / 整个角色改名,每行都能一键试听。
- 感情包:导出下载
.json、粘贴文本导入(含三种模式与试运行)、服务端快照的保存与恢复。 - 配置:9 组共 35 项配置带说明与校验,需要重启才生效的项单独标注;密钥类字段回显为掩码,不改就不会被覆盖。
- 服务器:并发探测每台 TTS 服务器的连通性、延迟、可用角色,以及 Space 保活状态。
- 会话:列出当前开了语音的会话与群,可直接在页面上开关。
- 指令:全部指令与别名速查,按「开关 / 音色 / 合成 / 感情包 / 诊断」分组。
- 关于:版本、数据目录、感情统计与合成计数。
- [新增] 6 套 galgame 风格主题:月夜(默认,深色)· 樱色(浅色)· 黄昏(深色)· 苍海(深色)· 薄雪(浅色)· 绯夜(深色),另有「舒适 / 紧凑」两种信息密度。主题与密度保存在插件的 KV 存储里而不是浏览器本地,换浏览器、换设备都能保持一致。
- [新增] 感情包导入导出(指令与 WebUI 双通道):新增
/感情导出、/感情导入、/感情包、/感情包保存、/感情包恢复五条指令。导出时会给出摘要、在服务端存一份快照,QQ 平台还会直接把.json文件发给你;导入支持三种合并模式(merge只补新 /overwrite覆盖同名 /replace清空重建)与「试运行」预演,JSON 可以贴在正文里、引用一条含 JSON 的消息,或者上传.json附件。写入前逐条校验参考音频路径(禁止绝对路径与..)与语言字段,不合法的条目会被跳过并在摘要里说明;导入成功立即生效,不需要重启。 - [修复] 贴在代码块里的感情包导入失败:指令原文里的换行此前会被压成空格,Markdown 代码围栏因此剥不掉,直接报「JSON 解析失败」;同时 AstrBot 的指令过滤器会把正文的第一个 token(代码围栏那一行)当成「模式」参数塞进来,于是又误报「导入模式只能是…」。现在导入会保留原文换行、按任意空白切参数、只采信真正的模式词,围栏无论是否被平台压成一行都能剥掉。写错的模式词(如
/感情导入 xxx {...})则会明确提示模式非法,而不是抛出难懂的解析错误。 - [改进]
emotions.json读写更抗造:保存改为「同目录临时文件 + fsync + 原子替换」,磁盘满或进程被杀不会再留下半个 JSON;加载容忍 UTF-8 BOM(用记事本另存过的文件不再让整库「凭空消失」);文件损坏或顶层不是对象时,会自动留一份emotions.corrupt-<时间戳>.json备份(同样内容只留一份)并提示可用/感情包恢复找回,避免坏文件被下一次写入静默覆盖。 - [改进]
/查看感情支持按角色过滤:/查看感情 kisaki只看一个角色,末尾附上「共 N 个角色 / M 条感情」统计,并给出导入导出与工作台的入口提示。 - [改进] 插件页中英双语:新增
.astrbot-plugin/i18n/zh-CN.json与en-US.json,工作台的标题与入口会跟随 AstrBot 的语言设置。
- 安装/升级:AstrBot 插件市场搜
Genie TTS LLM,或在插件页填仓库地址https://github.com/Whereis-Alice/astrbot_plugin_genie_tts_llm - 完整变更:v1.8.1...v1.9.0