TTS Server 完整指南:系统 TTS 配置、旁白对话朗读规则与 HTTP 转发器实战(tts-server-android)
语音后端音频【免费下载链接】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。其中handleTextL110-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.ktisRegex、pattern、replacement、isEnabled等字段。文档给出的高级示例是将字数 5 以内的对话双引号替换为【】从而让旁白规则只负责朗读、避免引号被读出来(启用正则表达式) 替换规则(“)(.{1,5})(”) 替换为【$2】这里的$2表示捕获组(.{1,5})即双引号内的 15 个字符。替换逻辑在 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.ktL47-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直接生成阅读 AppLegado可导入的 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.ktHTTP 转发器路由SystemTtsForwardServer.ktLegado 配置生成LegadoUtils.kt赞分享语音后端音频【免费下载链接】tts-server-android这是一个Android系统TTS应用内置微软演示接口可自定义HTTP请求可导入其他本地TTS引擎以及根据中文双引号的简单旁白/对话识别朗读 还有自动重试备用配置文本替换等更多功能。项目地址https://gitcode.com/GitHub_Trending/tt/tts-server-android点击查看免费下载相关推荐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是流处理任务监控与性能分析的核心可视化工具通过后端大数据流处理批处理上一篇Perfetto Bigtrace 在 Kubernetes 上的完整部署指南从 GKE 集群搭建到 Clickhouse 与 Superset 接入下一篇.NET 集合与 LINQ 性能优化实战指南从 FrozenDictionary 到零分配模式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →