- 语音
- 后端
- 音频
【免费下载链接】tts-server-android
这是一个Android系统TTS应用,内置微软演示接口,可自定义HTTP请求,可导入其他本地TTS引擎,以及根据中文双引号的简单旁白/对话识别朗读 ,还有自动重试,备用配置,文本替换等更多功能。
本文以项目内置帮助文档 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,它是学习插件编写的绝佳范本,包含四部分能力:
- 变量声明:
vars字段声明key(密钥)与region(区域)两个可配置变量,用户在"更多选项 → 设置变量"中填写;脚本顶部通过ttsrv.userVars['key']读取; - 音频请求:
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 分别给出"密钥区域错误"与"账户被禁用"的中文提示; - 语音数据加载:
onLoadData()优先读本地voices.json缓存,不存在则请求微软语音列表接口并写回缓存,避免每次联网拉取; - 自定义编辑界面:
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/tts | GET | text(必填)、engine(必填)、locale、voice、rate/speed(默认 50)、pitch(默认 100) | 合成文本,返回audio/x-wav音频流 |
/api/tts | POST | JSON 请求体(TtsParams) | 同上,适合参数较多的客户端 |
/api/engines | GET | — | 列出可用 TTS 引擎(配置) |
/api/voices | GET | engine(必填) | 列出指定引擎的可用语音 |
/api/legado | GET | api、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引擎,以及根据中文双引号的简单旁白/对话识别朗读 ,还有自动重试,备用配置,文本替换等更多功能。
相关推荐
Coqui TTS 推理实战:tts 命令行、tts-server 与 Python TTS API 三入口完全指南
Coqui TTS 推理实战:tts 命令行、tts server 与 Python TTS API 三入口完全指南 本文围绕 Coqui TTS 仓库中的推理
人工智能语音音频深度学习预训练自定义语音规则:tts-server-android高级文本处理配置
自定义语音规则:tts server android高级文本处理配置 还在为TTS朗读效果不自然而烦恼吗?tts server android的语音规则功能让文
语音后端音频Apache Flink Web UI实战指南:从入门到精通的监控与优化
Apache Flink Web UI实战指南:从入门到精通的监控与优化 Apache Flink Web UI是流处理任务监控与性能分析的核心可视化工具,通过
后端大数据流处理批处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考