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),仅供参考