news 2026/10/17 2:03:36

tts-server-android 语音规则完全指南:如何写出第一条 JS 朗读规则

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
tts-server-android 语音规则完全指南:如何写出第一条 JS 朗读规则

tts-server-android 语音规则完全指南:如何写出第一条 JS 朗读规则

【免费下载链接】tts-server-android这是一个Android系统TTS应用,内置微软演示接口,可自定义HTTP请求,可导入其他本地TTS引擎,以及根据中文双引号的简单旁白/对话识别朗读 ,还有自动重试,备用配置,文本替换等更多功能。项目地址: https://gitcode.com/GitHub_Trending/tt/tts-server-android

tts-server-android 语音规则让 TTS 在合成前先跑一段 JavaScript,把文本按内容分段、打标、切句,再交给不同的音色。下面从一条能直接跑的规则讲起,帮你在十分钟内让旁白和对话各归其位。

先看看它到底错在哪

朗读不自然,往往不是音色问题,而是"文本还没准备好"。常见表现:

  • 日期数字:"2024年3月5日" 被逐位念成 "二、零、二、四"
  • 特殊符号:"A+B" 念出 "加号",或干脆跳过
  • 对话提示:引号里的台词和叙述混成同一个声音,角色全糊在一起

这类问题靠调语速、音量解决不了,得在朗读前动手。语音规则就是那个动手的地方:按下播放前,用一段脚本对原始文本做一次可控的改写与切分。

原始文本是怎么变成语音的

整条链路很短。原始文本先过前置替换规则,再由语音规则脚本(Rhino 引擎执行)调用handleText分段打标,程序按标签把每段路由到对应 TTS 配置,接着splitText切成句子,最后过一遍后置替换再送合成。

环节由谁做作用
分段打标语音规则handleText把文本切成带 tag 的片段
路由音色系统按 tag 匹配不同片段交给不同配置
分句语音规则splitText按标点切成可合成的句子

一句话:语音规则不决定"念得多好听",它决定"把什么内容、按什么节奏、交给哪个声音"。

如何写下第一条语音规则

规则是一个叫SpeechRuleJS的对象,必须带元信息(name、id、author、version、tags)和两个方法。最小可跑版本:

let SpeechRuleJS = { name: "我的第一条规则", id: "demo.rule", author: "me", version: 1, tags: { plain: "通用" }, handleText(text) { return [{ text: text, tag: "plain" }]; // 原样返回,只打一个标签 }, splitText(t) { return t.match(/[^。!?!?;;]+[。!?!?;;]?/g) || [t]; } };

逐句说:id是规则唯一标识;tags声明"键→显示名",handleText返回的tag必须对上某个键,程序才能把片段派给绑定该标签的 TTS 配置;splitText返回字符串数组,一句一个元素。还有第三个可选方法getTagName,只在界面上显示标签名。

三个实用技巧 💡

符号与数字归一化。在handleText开头,把"机器写法"改成"人话":

function clean(t) { return t.replace(/+/g, "加").replace(/-/g, "减") .replace(/(\d{4})-/.-/./g, "$1年$2月$3日"); } // handleText 内:text = clean(text)

对话识别。内置规则speech_rule.js的核心,用中文双引号切旁白/对话:

if (c === "“") { out.push({ text: buf, tag: "narration" }); buf = ""; cur = "dialogue"; } else if (c === "”") { out.push({ text: buf, tag: "dialogue" }); buf = ""; cur = "narration"; }

“之前归旁白,”之前归对话,两段打不同 tag,就能分配两个音色。

改写公式与代码。命中数学式就替换成可读文字:

text = text.replace(/(\d+)\s*[×*]\s*(\d+)/g, "$1乘$2");

进阶:组合、分支与容错

语音规则可以和替换规则叠加:替换规则分"前置 / 后置"两种时机,正好包在handleText前后。多条配置绑定同一个 tag 时,先精确匹配id、再随机挑一个。想更细,可用tagsData在对话里声明"角色",实现角色级匹配。

健壮性很关键:handleText一旦抛错,整段合成会被记为失败。所以脚本里少写裸循环、给正则加边界,拿不准就try/catch兜底并返回一个合法数组。

常见问题排查 🔧

  • 标签没生效、全走一个音色→ 多半handleText返回的tag与tags键或 TTS 配置对不上 → 核对标签键是否一致。
  • 分句太碎或根本不切→ 多半是splitText的分隔标点不合适 → 调整可匹配的分隔符。
  • 改了代码没反应→ 脚本每次合成时重新读取,确认已保存;version只是版本标识。
  • 合成直接失败→ 多半脚本报错或返回结构不是[{text, tag}]→ 打开"日志"页看报错,保证每个片段都含text与tag。

资源导航

想深入,直接翻这几处:

  • 规则引擎:model/rhino/speech_rule/SpeechRuleEngine.kt
  • 处理链路:service/systts/help/TextProcessor.kt
  • 内置规则:assets/defaultData/speech_rule.js
  • 配置:conf/SpeechRuleConfig.kt
  • 官方说明:help/js/speechRule.md

【免费下载链接】tts-server-android这是一个Android系统TTS应用,内置微软演示接口,可自定义HTTP请求,可导入其他本地TTS引擎,以及根据中文双引号的简单旁白/对话识别朗读 ,还有自动重试,备用配置,文本替换等更多功能。项目地址: https://gitcode.com/GitHub_Trending/tt/tts-server-android

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 2:02:47

C# Console.WriteLine详解:从格式化字符串到输出重定向实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/17 2:01:54

3 步把网盘文件交给自选下载器:网盘直链下载助手快速上手

3 步把网盘文件交给自选下载器:网盘直链下载助手快速上手 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…

作者头像 李华
网站建设 2026/10/17 2:00:58

GitHub_Trending/templa/templates高级功能解析:API请求与变量提取

GitHub_Trending/templa/templates高级功能解析:API请求与变量提取 GitHub_Trending/templa/templates是一个基于开源QD框架的公共HAR模板库,专门用于指导用户学习如何使用QD框架进行自动化任务和API请求。本文重点解析该模板库中的高级功能,…

作者头像 李华
网站建设 2026/10/17 2:00:18

MP2642GR-Z双节锂电池被动均衡实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/17 1:59:19

ELK 日志平台实战:从部署到调优的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华