花小钱搭了个私有TTS服务,方便多了

文章目录

    • 前言
    • [1 什么是EasyVoice?](#1 什么是EasyVoice?)
    • [2 HiNas系统安装Docker](#2 HiNas系统安装Docker)
    • [3 使用Docker一键部署EasyVoice](#3 使用Docker一键部署EasyVoice)
    • [4 EasyVoice使用和效果演示](#4 EasyVoice使用和效果演示)
      • [4.1 文本转语音](#4.1 文本转语音)
      • [4.2 多角色配音](#4.2 多角色配音)
      • [4.3 AI解析多角色](#4.3 AI解析多角色)
    • [5 安装cpolar](#5 安装cpolar)
      • [5.1 什么是cpolar?](#5.1 什么是cpolar?)
      • [5.2 安装cpolar](#5.2 安装cpolar)
    • [6 穿透EasyVoice支持公网访问](#6 穿透EasyVoice支持公网访问)
      • [6.1 随机域名方式(免费方案)](#6.1 随机域名方式(免费方案))
      • [6.2 固定域名方式](#6.2 固定域名方式)
    • 总结

前言

想把自己攒的小说转成有声书在通勤路上听,试过几个在线 TTS 平台,结论是:要么收费、要么每天有字数上限、要么生成速度快得让人崩溃。买会员吧,一年下来也是一笔开销,而且数据还得经过别人的服务器。

其实这个问题有一个成本低得多的解法:EasyVoice 基于 Edge TTS,封装的逻辑做得不错,核心是完全免费、没有字数限制、支持流式输出,10 万字的小说边生成边播放,不用等全部跑完才能听。对硬件要求也不高,ARM 架构的设备就能跑。

文章里用的是刷了 HiNas 系统的玩客云------这玩意儿当初拿来挖矿的,现在几十块就能买到,功耗才几瓦,跑一个 Docker 镜像绰绰有余。配好之后,在家里不管手机还是平板都能访问,出差的时候用 cpolar 穿透一下,外部网络也能连上来。

1 什么是EasyVoice?

EasyVoice 是一个开源的文本、小说智能转语音解决方案,旨在帮助用户轻松将文本内容转换为高质量的语音输出,原项目由 cosin2077 开发。本文使用的是我基于原项目二次开发的分支版本。

  • 一键生成语音和字幕
  • AI 智能推荐配音
  • 完全免费,无时长、无字数限制
  • 支持将 10 万字以上的小说一键转为有声书!
  • 流式传输,多长的文本都能立刻播放
  • 支持自定义多角色配音

相比原版,该分支在保留 AI 智能推荐配音、流式音频传输、自动字幕生成 等核心功能的基础上,新增了多角色自定义配音UI界面用户登录系统优化为三栏网页布局界面 ,同时扩展了对 AMD64、ARM64、ARMv7 多种 CPU 架构的支持。这意味着除了普通 x86 服务器,你也可以在玩客云、树莓派等 ARM 架构设备上顺利运行。

需要注意的是,上游原始项目并不支持 ARMv7 架构 ,而本分支已做了相应的适配优化,这也是本文能够在玩客云 这类ARMv7架构上部署的前提。

2 HiNas系统安装Docker

在往期教程中,我们已经成功的给玩客云盒子刷入了HiNas系统,且配置好了终端后台登录,为接下来的Docker安装做好准备。

如果您手上的玩客云还没有刷入HiNas系统,可以cpolar官网的《20多块的小盒子,功耗只有3W左右,我把它变成能外网访问的NAS了!》这篇文章。

好啦,接下来进入安装Docker环节,首先点击页面上的Docker面板 图标(如果没有点击右上角的外网切换一下页面就有了),会弹出如下提示:

提示我们需要在终端运行命令install-portainer.sh 命令进行安装Docker管理面板 ,接着点击确定按钮,再点击终端后台图标:
登录上后台终端界面,如果未修改root的密码,默认root用户的密码为ecoo1234,登录后如下图:

接着,在终端输入前面安装Docker管理面板的命令,我们需要借助这个命令一键安装Docker,同时也会安装Docker管理面板(方便新手小白使用):

shell 复制代码
install-portainer.sh

命令执行效果参考如下图:

等待安装完成(过程可能比较长,请耐心等待安装即可),安装完成如下图所示:

接着,回到HiNas首页,刷新一下页面,再次点击Docker面板 ,即可进入Portainer初始化 页面了(也可以直接访问控制台输出的访问地址):

给Portainer设置一个至少为12位 的密码。然后点击创建用户即可进入Portainer首页,点击仪表盘即可查看Docker相关信息,如容器数量状态等:

3 使用Docker一键部署EasyVoice

本部分使用的 EasyVoice Docker 镜像为我基于上游项目二开后构建的新镜像。上游原项目不支持 ARMv7 架构,因为 @node-rs/jieba 依赖的原生模块 jieba.linux-arm-musleabihf.node 没有预编译二进制文件,ARMv7 构建时会编译失败。

我在代码中做了容错处理:加载失败时自动降级为简单分词器,不影响主流程。AMD64 和 ARM64 架构不受影响,仍使用 jieba 分词器。

两种分词器的区别:

  • Jieba 分词器:基于词典和 HMM 模型,分词更精准,能识别新词和专有名词
  • 简单分词器:按标点符号切分,分词粒度较粗,但兼容性好、无依赖

实际使用中,简单分词器对 TTS 语音合成的影响较小,主要体现在长句断句位置可能略有差异。

好啦,接下来开始进行在玩客云上使用Docker一键部署EasyVoice项目。首先,回到终端后台,执行如下Docker一键部署命令(适用于armv7架构):

shell 复制代码
docker run -d -p 9001:9000 --name easyvoice -v ./audio:/app/audio tannic666/easyvoice:v1.1-armv7

如果是amd64和arm64请执行如下命令即可(可以自行使用如uname -m命令查询架构):

shell 复制代码
docker run -d -p 9001:9000 --name easyvoice -v ./audio:/app/audio tannic666/easyvoice:v1.1

执行效果如下:

接着,可以使用如下命令进行查看Docker运行状态,当然也可以访问前面部署好的Docker面板进行查看:

shell 复制代码
docker ps

可以看到,easyvoice容器的状态为UP(表示运行中),外部映射访问的端口为9001。并且也能看到前面安装的Portainer容器:

在Portainer页面也能看到easyvoice的状态和端口映射情况:

接着,执行如下命令进行查看日志:

shell 复制代码
docker logs easyvoice | head -n 10

可以看到,由于ARMv7架构不支持Jieba分词器,加载失败时自动降级为了简单分词器:

可以看到同时服务也运行在9000端口,9000端口为容器内部运行端口外部映射端口为9001 ,我们需要使用玩客云IP+9001端口进行访问,如:

shell 复制代码
http://192.168.50.179:9001

可以看到,成功的访问到了EasyVoice的Web初始化页面!设置一个管理员和账号密码,登录一下,即可进入到主页:

4 EasyVoice使用和效果演示

4.1 文本转语音

EasyVoice 默认内置了 8 种高品质中文语音,每个声音都有独特的音色与风格,适用于不同场景:

语音代号 名称 声音特征
zh-CN-晓晓 女声,温柔自然 旁白、讲解、故事叙述
zh-CN-晓伊 女声,清晰活泼 小说对白、年轻女性角色
zh-CN-云健 男声,沉稳有力 广告、新闻播报
zh-CN-云希 女声,柔和亲切 小说旁白、情感故事
zh-CN-云夏 女声,明亮自然 教程、说明类内容
zh-CN-云扬 男声,清朗温柔 对话、配音场景
zh-CN-辽宁-晓北 男声,地方口音略带特色 地区特色内容、轻松对白
zh-CN-陕西-晓妮 女声,带地方特色 小说人物、多样化对白

接下来使用一段稍微简短内容进行演示一下(灵笼动漫中白月魁的台词):

shell 复制代码
灾难爆发前,我像大多数学者一样,想用自己的学识造福人类。碳基生命是脆弱而短暂的,我想提升人类的寿命。如果有足够的时间积累世间所有的知识,如果可以用时间去弥补天赋的不足,那么每个人都有可能掌握所有的自然、生命、社会、人文等科学知识,让人们更全面地感受这个世界。设想一下,知识的边界一旦被打破,人们对意识、身体乃至整个世界的认知都将发生巨大的改变,人类将以无尽的生命探索整个宇宙化。

操作步骤参考如下:

生成完成后,让我们听一下效果:
你的浏览器不支持 audio 标签。

好啦,效果是不是特别棒?而且它生成的速度非常的快,下面用一本近700W字 的小说,进行演示:

生成效果如下图所示:

从图中可以看到,由于内容特别长,可以看到一直在持续的流式输出,播放3分钟不到的时间,流式生成已经生成了高达34分钟的时长!

由于内容太长,生成完成可能需要很长一段时间,这边就不附上音频了,可以自行下拉项目进行测试!

4.2 多角色配音

EasyVoice 除了基础的文本转语音,还支持多角色配音 ------你可以为不同角色指定不同音色。更省心的是,它还能通过 AI 自动解析内容,智能识别角色并分配对应音色(这个 UI 界面是本分支新增的,上游原项目没有)。

首先,点击页面上的加载 示例按钮,会默认加载一个示例段落:

可以看到有段落显示,每个段落支持调整声音、语速、音量、音调 参数。滚动到底部,点击生成语音按钮,即可开始生成:

生成完成后即可进行播放和下载:

让我们试听一下效果:
你的浏览器不支持 audio 标签。

是不是特别棒!

4.3 AI解析多角色

使用前,需要先在 AI 设置 中配置好 API 地址和 API Key。只要是兼容 OpenAI v1 格式的接口都能用,比如 DeepSeek、通义千问等。

配置好后,回到多角色配音页面,点击AI解析内容按钮,这里使用如下3角色+1旁白的内容:

tex 复制代码
清晨的山谷被薄雾覆盖,阳光像金色碎片洒在林间小路上。远处传来清脆的鸟鸣声。 
沈澜提着工具箱走在最前方,脚步轻快。 
沈澜:"今天一定能找到昨晚看到的光源位置。" 
顾行远抬头望着树梢,手里握着便携探测仪。 
顾行远:"如果真是反射物,那数据应该会有变化。" 
就在他们讨论时,林青岚从溪边快步走来,指尖夹着一片透明碎片。 
林青岚:"我在水边发现这个,边缘有烧蚀痕迹。" 
顾行远立刻接过碎片,探测仪发出轻微的提示音。
沈澜凑近观察,神色变得专注。 
沈澜:"痕迹并不像自然形成的。" 
三人沉默片刻,周围只有风声掠过草叶。 
雾逐渐散开,碎片在光下闪出微弱的蓝色光纹,像是隐藏着尚未被揭开的秘密。

将要解析的内容填写进来后,点击开始解析按钮:

等待解析完成,解析完成后,会自动创建段落 ,分配好旁白和对应角色,可以看到,一共生成了11个段落:

接着点击生成语音按钮,进行测试:

试听一下:
你的浏览器不支持 audio 标签。

对比一下原内容,所有角色和旁白都正常,没有任何错乱,是不是感觉特别棒!如果旁白容易被解析成对话角色,可以尝试添加简单提示词在开头,如:

tex 复制代码
解析规则:除非文本中明确出现角色说话的引号或冒号,否则所有内容都视为旁白,不视为角色语音。 

好啦,到这儿EasyVoice的大概功能就介绍演示完成啦!

5 安装cpolar

到这里,EasyVoice 已经能在局域网里正常使用了。但问题来了:一旦离开家里的网络,手机、笔记本就访问不了了。通勤路上想听刚生成的有声书?出差时想给视频配个旁白?都没戏。这时候就需要 cpolar 出场了。它能把内网服务穿透到公网,让你在任何有网络的地方都能访问自己的 TTS 服务。

5.1 什么是cpolar?

  • cpolar 是一款内网穿透工具,可以将你在局域网内运行的服务(如本地 Web 服务器、SSH、远程桌面等)通过一条安全加密的中间隧道映射至公网,让外部设备无需配置路由器即可访问。
  • 广泛支持 Windows、macOS、Linux、树莓派、群晖 NAS 等平台,并提供一键安装脚本方便部署。

5.2 安装cpolar

在玩客云的终端后台执行如下命令,进行一键安装cpolar:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

接着输入如下命令,确认cpolar是否启动:

shell 复制代码
sudo systemctl status cpolar

可以看到显示为active(running),表示为正常在线状态。

接着,我们在浏览器中,输入你的玩客云IP地址+9200端口,进行访问cpolar的web ui控制台:

shell 复制代码
# 请使用你的访问IP + 9200端口
http://192.168.50.179:9200/

可以发现,成功的访问到cpolar的web ui页面啦!如果没有注册cpolar的小伙伴也可以点击底部的按钮跳转注册!册好账号以后,回到该页面进行登录即可进入后台页面:

6 穿透EasyVoice支持公网访问

6.1 随机域名方式(免费方案)

随机域名方式适合预算有限的用户。使用此方式时,系统会每隔 24 小时 左右自动更换一次域名地址。对于长期访问的不太友好,但是该方案是免费的,如果您有一定的预算,可以查看大纲6.2固定域名方式 ,且访问更稳定

点击左侧菜单栏的隧道管理,展开进入隧道列表页面,页面下默认会有 2 个隧道:

  • ssh隧道,指向22端口,tcp协议
  • website隧道,指向8080端口,http协议(http协议默认会生成2个公网地址,一个是http,另一个https,免去配置ssl证书的繁琐步骤)

点击编辑website的隧道,这里设置名称为easyvoice-9001方便辨识,然后本地地址填写9001端口,地区这里选择的China Top,然后点击更新:

接着,点击左侧菜单的状态菜单,接着点击在线隧道列表菜单按钮,可以看到有2个easyvoice-9001的隧道,一个为http协议,另一个为https协议:

接下来在浏览器中访问easyvoice-9001隧道生成的公网地址(http和https皆可),这里以https为例:

可以看到成功的访问到easyvoice的登录页面啦!

6.2 固定域名方式

虽然前面我们使用 cpolar 的永久免费套餐 版成功实现了内网穿透 ,但免费版的随机域名存在一些不便之处:域名又长又难记忆,而且每隔 24 小时左右就会自动变化一次。这意味着每次域名变化后,我们都需要重新查看新的地址,使用起来非常不方便。

为了解决这个问题,cpolar 提供了固定二级子域名 功能。只需升级到任意 付费套餐,就可以配置一个固定不变、简短易记的专属域名,彻底告别域名频繁变化的烦恼。下面我们来看看如何配置固定二级子域名。

首先,进入官网的预留页面:

shell 复制代码
https://dashboard.cpolar.com/reserved

然后,选择预留 菜单,即可看到保留二级子域名 项,填写其中的地区、名称、描述(可不填)项,然后点击保留按钮,操作步骤图如下:

列表中显示了一条已保留的二级子域名记录:

  • 地区 :显示为China Top
  • 二级域名 :显示为easyvoice01

注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主

进入侧边菜单栏的隧道管理下的隧道列表,可以看到名为easyvoice-9001的隧道:

点击编辑按钮进入编辑页面,修改域名类型为二级子域名,然后填写前面配置好的子域名,点击更新按钮:

接着来到状态菜单下的在线隧道列表可以看到隧道名称为easyvoice-9001的公网地址已经变更为二级子域名+固定域名主体及后缀的形式了:

这里以https访问测试一下:

访问成功!相比于每天都会变化的随机域名,这个固定域名不仅更加简短易记,而且永久不变 ,无论何时何地都可以通过这个地址访问您的EasyVoice服务,极大地提升了使用体验。

总结

用玩客云加 EasyVoice 这套组合,最直接的好处是省下了在线 TTS 平台的订阅费,而且完全私有------所有生成过程跑在自己设备上,没有任何数据经过第三方。

实际用下来,流式生成的速度比预想中快,一篇长篇小说花不了太久就能转成完整的有声书,多角色配音的功能对付小说场景也够用。cpolar 在这里解决的是远程访问的问题,设备藏在家里局域网里,配好穿透之后固定地址存到书签里,手机在任意网络下都能打开使用。

整个成本算下来:设备几十块,cpolar 用免费版基本够用,升级套餐也不贵。对于确实有文本转语音需求的人来说,这套方案比每年续会员划算得多,而且一次性投入,后续没有持续成本。

相关推荐
黑贝是条狗7 天前
HadaTTS藏语文本转语言技术
tts
CV-deeplearning10 天前
太强了!NarratoAI:一键 AI 影视解说+自动剪辑,10分钟视频成本仅0.1元
llm·tts·自动剪辑·narratoai·ai影视解说
ai_coder_ai15 天前
在自动化脚本中如何实现文本转语音?
tts·autojs·自动化脚本·冰狐智能辅助·easyclick
shao91851619 天前
第11章 Streaming(中):高级音频应用(1)——项目六:语音克隆、变声器与文本转录器
语音识别·tts·语音克隆·elevenlabs·stt·变声器·音乐api
Apple_羊先森1 个月前
MOSS-TTS-Nano 教程 01:快速上手与整体认识
ai·tts·moss-tts-nano
互联网散修1 个月前
鸿蒙实战:运动健康类应用核心组件——语音播报模块设计与实现
华为·harmonyos·tts·语音播报
神州数码云基地1 个月前
AI助手语音交互:从技术到体验
人工智能·ai·语音识别·前端开发·tts·ai语音
antzou1 个月前
文本转语音(TTS)
tts·文本转语音·matcha·有声书
今夕资源网1 个月前
IndexTTS2今夕版最新版本号2026-04-12再次更新 新添加功能SRT字幕文件生成音频 以及生成音频同时生成SRT 字幕文件
音视频·tts·最新版·indextts·语音软件·文字转声音·字幕转音频