☰
TTS Server 完整指南:系统 TTS 配置、旁白对话朗读规则与 HTTP 转发器实战(tts-server-android)
2026/10/2 16:20:45 网站建设 项目流程
  • 语音
  • 后端
  • 音频

【免费下载链接】tts-server-android

这是一个Android系统TTS应用,内置微软演示接口,可自定义HTTP请求,可导入其他本地TTS引擎,以及根据中文双引号的简单旁白/对话识别朗读 ,还有自动重试,备用配置,文本替换等更多功能。

项目地址:https://gitcode.com/GitHub_Trending/tt/tts-server-android
点击查看免费下载

本文以项目内置帮助文档 app.md 为主线,围绕 tts-server-android 的核心玩法展开:如何通过"系统 TTS"四大界面管理网络语音源、用朗读规则实现旁白/对话多音色朗读、用替换规则纠正发音,以及在系统 TTS 与阅读类 App 之间架设 HTTP 转发器以提升段落间流畅度。读完本文,你将掌握从配置导入导出、文本处理到 HTTP 接口调用的完整实战链路。

tts-server-android 本身不提供任何语音合成服务,官方定位是"网络 TTS 的搬运工"——通过插件驱动调用互联网上的 TTS 接口(如微软 Azure),再以安卓系统 TTS 引擎的身份供其他 App 使用。这种"搬运"思路让它兼具两大能力:对外以TextToSpeechService服务系统,对内以 HTTP 服务(转发器)面向网页与阅读 App。

系统 TTS:四大管理界面总览

系统 TTS 是 App 的核心模块,共包含四个管理界面:主界面(配置列表)、朗读规则、插件、替换规则。这四个界面在右上角的"更多选项"中都有独立的导入、导出功能;此外在设置中还提供全部数据的备份、恢复操作(对应仓库中的 BackupRestoreActivity.kt 与 BackupDialog.kt)。

主界面:配置列表与分组切换

主界面是 TTS 配置的管理列表,用于统一管理各条 TTS 配置。它的核心价值在于分组功能——可将多条配置归入同一分组,实现"一键切换多个配置",例如按小说场景切换"微软组 / 备用组"。

  • 每条配置展示名称、语言、语速、音量、音高、解码参数、来源插件等信息(从 images/1.jpg 截图可见);
  • 可在设置中调换编辑与试听按钮的位置:长按编辑按钮进行试听,反之,长按试听按钮进行编辑,避免误触;
  • 系统 TTS 引擎侧的实现位于 SystemTtsService.kt,它继承TextToSpeechService,在onGetVoices()(L248-L276)中把数据库里的每条配置动态注册为一个语音Voice(名称形如配置名_id),在onSynthesizeText()(L314-L397)中再通过 voiceName 反查配置 ID 并交给MixSynthesizer合成,这就是"配置列表"能直接出现在系统朗读引擎语音列表中的原理。

朗读规则:旁白/对话的自动识别

朗读规则用于处理朗读文本:根据用户配置的标签(tag)去匹配不同的 TTS 配置,典型场景就是小说朗读中的"旁白 / 对话"多音色。程序已内置基于中文双引号的旁白对话朗读规则,可直接使用。

内置规则位于 speech_rule.js,其核心是一个 JavaScript 对象:

let SpeechRuleJS = { name: "旁白/对话", id: "ttsrv.multi_voice", author: "TTS Server", version: 4, tags: {narration: "旁白", dialogue: "对话"}, handleText(text) { const list = []; let tmpStr = ""; let endTag = "narration"; text.split("").forEach((char, index) => { tmpStr += char; if (char === '“') { endTag = "dialogue"; list.push({text: tmpStr, tag: "narration"}); tmpStr = ""; } else if (char === '”') { endTag = "narration"; tmpStr = tmpStr.slice(0, -1) list.push({text: tmpStr, tag: "dialogue"}); tmpStr = ""; } else if (index === text.length - 1) { list.push({text: tmpStr, tag: endTag}); } }); return list; }, splitText(text) { let separatorStr = "。??!!;;" // ...按标点切分为句子列表... } };

其工作逻辑直观易懂:遇到左双引号“时,此前累积的文本标记为narration(旁白),之后进入dialogue(对话)模式;遇到右双引号”时截断对话文本(去掉引号本身)并标记为dialogue,随即切回旁白;结尾残余文本按当前模式收尾。splitText则按。??!!;;等标点把长文切成句子,并过滤掉纯引号内容。

引擎侧的调度在 SpeechRuleEngine.kt:它通过 Rhino 执行规则脚本,向 JS 暴露getTagName、handleText、splitText三个方法(L22-L24)。其中handleText(L110-L132)把每段文本、标签与配置 ID 封装成TextWithTag(text, tag, id),供后续按标签匹配 TTS 配置。

多语音模式下的配置匹配策略,见 TextProcessor.kt 的process()(L114-L137):精确匹配配置 ID > 同标签内随机匹配 > 全量随机匹配,均失败才报MissingConfig。也就是说,即使某个标签没有专属配置,也会退而求其次用其他配置朗读,不会中断。需要提醒:多语音模式需先在设置中开启(isMultiVoiceEnabled,见 SysTtsConfig.kt),并给各配置打上对应标签,否则会提示缺少朗读规则(MissingRule)。

插件:用 JS 脚本扩展 TTS 能力

插件用于扩展 TTS 功能,本质是用 JS 脚本调用互联网上的 TTS 接口。App 内置了Azure插件,完整实现位于 plugin-azure.js,它是学习插件编写的绝佳范本,包含四部分能力:

  1. 变量声明:vars字段声明key(密钥)与region(区域)两个可配置变量,用户在"更多选项 → 设置变量"中填写;脚本顶部通过ttsrv.userVars['key']读取;
  2. 音频请求:getAudio(text, locale, voice, rate, volume, pitch)把语速rate、音高pitch映射为 SSML 的百分比(rate = rate * 2 - 100),拼装<mstts:express-as>风格标签与<prosody>韵律标签后,ttsrv.httpPost()请求https://{region}.tts.speech.microsoft.com/cognitiveservices/v1,对 401/403 分别给出"密钥区域错误"与"账户被禁用"的中文提示;
  3. 语音数据加载:onLoadData()优先读本地voices.json缓存,不存在则请求微软语音列表接口并写回缓存,避免每次联网拉取;
  4. 自定义编辑界面:onLoadUI()用JSpinner、JSeekBar等组件动态构建"语言技能 / 风格 / 角色 / 风格强度"的编辑 UI,配合onVoiceChanged()按所选 voice 动态刷新可选项——这意味着插件可以完全定制 TTS 配置编辑页。

插件由 PluginManager.kt 统一管理,可导入、导出、试听、设置变量。此外,仓库 assets 中还内置了配置直链上传示例 direct_link_upload.js,展示了ttsrv.httpPostMultipart()上传文件的用法,与插件体系共用同一套 JS 运行时(Rhino),可以一并参考。

替换规则:正则纠正发音

替换规则用于替换朗读文本以纠正发音,例如把"你好"替换为"您好"。规则以组为单位管理,支持启用开关、是否正则、匹配模式与替换文本,数据模型见 ReplaceRule.kt(isRegex、pattern、replacement、isEnabled等字段)。

文档给出的高级示例,是将字数 5 以内的对话双引号替换为【】,从而让旁白规则只负责朗读、避免引号被读出来:

(启用正则表达式) 替换规则:(“)(.{1,5})(”) 替换为:【$2】

这里的$2表示捕获组(.{1,5}),即双引号内的 1~5 个字符。替换逻辑在 TextReplacer.kt 的replace()(L30-L47)实现:按isRegex决定走Regex(pattern)还是普通字符串替换,并支持在**文本处理前(BEFORE)与切分后(AFTER)**两个时机分别执行(见 TextProcessor.kt L94-L102 与常量类 ReplaceExecution.kt),因此既能在朗读前统一替换,也能在按段落拆分后逐段精修。

系统 TTS 常见问题

1. 锁屏后一段时间朗读突然停止?

在系统设置 → 应用 → 电池优化中将本 APP 与阅读 APP 加入电池优化白名单。

对于本 APP,你可在左侧滑菜单中单击电池优化白名单进行快捷设置,无需手动进入系统设置。

PS:对于国内系统,你可能还需对后台任务上锁、启用后台权限等操作。

源码层面,App 自身也做了保活措施:SystemTtsService.onCreate()(SystemTtsService.kt L136-L163)会获取PARTIAL_WAKE_LOCK唤醒锁与WIFI_MODE_FULL_HIGH_PERFWi-Fi 锁(分别用于防止息屏休眠与网络降速),并在合成开始时续期唤醒锁(reNewWakeLock())且可通过配置开关前台服务通知(isForegroundServiceEnabled)。不过这些只能缓解,最根本的仍是系统层面的电池优化白名单与厂商后台权限,尤其国内 ROM 需要额外对后台任务上锁。

2. 段落间隔时间长?

一般是由于网络延迟原因,因为安卓系统 TTS 服务的技术限制,导致无法预缓存音频,故每次只能同步获取。

这是由TextToSpeechService的同步回调机制决定的:系统按句逐段调用合成,App 无法在后台提前拉取下一段音频,段落间隔 ≈ 每段请求的网络往返时间。要突破该限制,就要用到下面的 TTS 转发器方案。

TTS 转发器:把系统 TTS 变成 HTTP 接口

TTS 转发器用于将安卓系统 TTS 转为 HTTP 网络接口形式,便于在网页中调用。

配合阅读 APP 的网络 TTS 引擎调用,可变相实现预缓存一章的音频,提高段落间流畅度。这正是上一条"段落间隔时间长"问题的根治方案:阅读 App 以 HTTP 客户端身份连续拉取整章音频并自行缓冲,不再受系统 TTS 同步回调的约束。

转发器基于 Ktor + Netty 实现,完整路由见 SystemTtsForwardServer.kt(L47-L120),核心接口如下:

接口方法参数说明
/api/ttsGETtext(必填)、engine(必填)、locale、voice、rate/speed(默认 50)、pitch(默认 100)合成文本,返回audio/x-wav音频流
/api/ttsPOSTJSON 请求体(TtsParams)同上,适合参数较多的客户端
/api/enginesGET—列出可用 TTS 引擎(配置)
/api/voicesGETengine(必填)列出指定引擎的可用语音
/api/legadoGETapi、name、engine、voice、pitch直接生成阅读 App(Legado)可导入的 JSON 配置

其中/api/legado很有特色:它调用 LegadoUtils.kt 的getLegadoJson(),拼接出形如

{api}?engine={engine}&text={{java.encodeURI(speakText)}}&rate={{speakSpeed * 2}}&pitch={pitch}&voice={voice}

的模板 URL,并封装为contentType: "audio/x-wav"、concurrentRate: "100"的 Legado JSON。阅读 App 内置的{{java.encodeURI(speakText)}}、{{speakSpeed * 2}}模板变量会自动代入每段文本与语速,从而实现整章文本的连续预拉取与缓冲。

实际使用流程:在 App 内打开转发器界面(截图见 images/4.jpg),下拉切换 TTS 引擎,输入测试文本与语速后点击"测试"验证朗读;确认无误后点击"阅读 Legado"生成上述 JSON,导入阅读 App 的网络 TTS 引擎即可。转发器的启动、停止与生命周期管理由 ForwarderServiceManager.kt 与 SysTtsForwarderService.kt 负责,端口、引擎映射等配置可参考 SystemTtsForwarderConfig.kt。

延伸阅读

  • 官方帮助文档:app.md
  • 内置旁白/对话朗读规则脚本:speech_rule.js
  • 内置 Azure 插件示例:plugin-azure.js
  • 系统 TTS 服务实现:SystemTtsService.kt
  • 文本处理(规则 + 替换 + 切分)编排:TextProcessor.kt
  • 朗读规则引擎:SpeechRuleEngine.kt
  • HTTP 转发器路由:SystemTtsForwardServer.kt
  • Legado 配置生成:LegadoUtils.kt
  • 语音
  • 后端
  • 音频

【免费下载链接】tts-server-android

这是一个Android系统TTS应用,内置微软演示接口,可自定义HTTP请求,可导入其他本地TTS引擎,以及根据中文双引号的简单旁白/对话识别朗读 ,还有自动重试,备用配置,文本替换等更多功能。

项目地址:https://gitcode.com/GitHub_Trending/tt/tts-server-android
点击查看免费下载
上一篇:Perfetto Bigtrace 在 Kubernetes 上的完整部署指南:从 GKE 集群搭建到 Clickhouse 与 Superset 接入
下一篇:.NET 集合与 LINQ 性能优化实战指南:从 FrozenDictionary 到零分配模式

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询