
前言
手里放着一堆小说资源,想转成有声书在通勤路上听?试过在线 TTS 网站,要么限制字数,要么收费,要么生成速度慢得让人崩溃。想自己搭个 TTS 服务?一看硬件要求——要 GPU、要高配置,算了算了。
但 EasyVoice 不一样。它基于 Edge TTS,完全免费、无字数限制,而且支持流式输出——不用等全部生成完,边生成边播放,10 万字的小说也能秒出声。更赞的是,它对硬件要求极低,支持 ARM 架构,像玩客云这种几十块、功耗才几瓦的小盒子都能跑。
本文就以刷了 HiNas 系统的玩客云为例,带你用 Docker 一键部署 EasyVoice,搭建自己的私有 TTS 服务。
1 什么是EasyVoice?

原项目地址:https://github.com/cosin2077/easyVoice
二次开发项目地址:https://gitee.com/jun-wan/easyvoice
EasyVoice 是一个开源的文本、小说智能转语音解决方案,旨在帮助用户轻松将文本内容转换为高质量的语音输出,原项目由 cosin2077 开发。本文使用的是我基于原项目二次开发的分支版本。
- 一键生成语音和字幕
- AI 智能推荐配音
- 完全免费,无时长、无字数限制
- 支持将 10 万字以上的小说一键转为有声书!
- 流式传输,多长的文本都能立刻播放
- 支持自定义多角色配音
相比原版,该分支在保留 AI 智能推荐配音、流式音频传输、自动字幕生成 等核心功能的基础上,新增了多角色自定义配音UI界面、用户登录系统 和 优化为三栏网页布局界面,同时扩展了对 AMD64、ARM64、ARMv7 多种 CPU 架构的支持。这意味着除了普通 x86 服务器,你也可以在玩客云、树莓派等 ARM 架构设备上顺利运行。
需要注意的是,上游原始项目并不支持 ARMv7 架构,而本分支已做了相应的适配优化,这也是本文能够在玩客云这类ARMv7架构上部署的前提。
2 HiNas系统安装Docker
在往期教程中,我们已经成功的给玩客云盒子刷入了HiNas系统,且配置好了终端后台登录,为接下来的Docker安装做好准备。

如果您手上的玩客云还没有刷入HiNas系统,可以查看往期的玩客云拆机短接输入HiNas系统教程:https://www.cpolar.com/blog/a-small-box-that-costs-around-20-yuan-has-a-power-consumption-of-only-about-3w-i-turned-it-into-a-nas-that-can-be-accessed-from-the-internet
好啦,接下来进入安装Docker环节,首先点击页面上的Docker面板图标(如果没有点击右上角的外网切换一下页面就有了),会弹出如下提示:

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

接着,在终端输入前面安装Docker管理面板的命令,我们需要借助这个命令一键安装Docker,同时也会安装Docker管理面板(方便新手小白使用):
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架构):
docker run -d -p 9001:9000 --name easyvoice -v ./audio:/app/audio tannic666/easyvoice:v1.1-armv7
如果是amd64和arm64请执行如下命令即可(可以自行使用如uname -m命令查询架构):
docker run -d -p 9001:9000 --name easyvoice -v ./audio:/app/audio tannic666/easyvoice:v1.1
执行效果如下:

接着,可以使用如下命令进行查看Docker运行状态,当然也可以访问前面部署好的Docker面板进行查看:
docker ps
可以看到,easyvoice容器的状态为UP(表示运行中),外部映射访问的端口为9001。并且也能看到前面安装的Portainer容器:

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

接着,执行如下命令进行查看日志:
docker logs easyvoice | head -n 10
可以看到,由于ARMv7架构不支持Jieba分词器,加载失败时自动降级为了简单分词器:

可以看到同时服务也运行在9000端口,9000端口为容器内部运行端口,外部映射端口为9001,我们需要使用玩客云IP+9001端口进行访问,如:
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-陕西-晓妮 | 女声,带地方特色 | 小说人物、多样化对白 |
接下来使用一段稍微简短内容进行演示一下(灵笼动漫中白月魁的台词):
灾难爆发前,我像大多数学者一样,想用自己的学识造福人类。碳基生命是脆弱而短暂的,我想提升人类的寿命。如果有足够的时间积累世间所有的知识,如果可以用时间去弥补天赋的不足,那么每个人都有可能掌握所有的自然、生命、社会、人文等科学知识,让人们更全面地感受这个世界。设想一下,知识的边界一旦被打破,人们对意识、身体乃至整个世界的认知都将发生巨大的改变,人类将以无尽的生命探索整个宇宙化。
操作步骤参考如下:

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

生成效果如下图所示:

从图中可以看到,由于内容特别长,可以看到一直在持续的流式输出,播放3分钟不到的时间,流式生成已经生成了高达34分钟的时长!
由于内容太长,生成完成可能需要很长一段时间,这边就不附上音频了,可以自行下拉项目进行测试!
4.2 多角色配音
EasyVoice 除了基础的文本转语音,还支持多角色配音——你可以为不同角色指定不同音色。更省心的是,它还能通过 AI 自动解析内容,智能识别角色并分配对应音色(这个 UI 界面是本分支新增的,上游原项目没有)。
首先,点击页面上的加载示例按钮,会默认加载一个示例段落:

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

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

让我们试听一下效果:
是不是特别棒!
4.3 AI解析多角色
使用前,需要先在 AI 设置 中配置好 API 地址和 API Key。只要是兼容 OpenAI v1 格式的接口都能用,比如 DeepSeek、通义千问等。

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

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

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

试听一下:
对比一下原内容,所有角色和旁白都正常,没有任何错乱,是不是感觉特别棒!如果旁白容易被解析成对话角色,可以尝试添加简单提示词在开头,如:
解析规则:除非文本中明确出现角色说话的引号或冒号,否则所有内容都视为旁白,不视为角色语音。
好啦,到这儿EasyVoice的大概功能就介绍演示完成啦!
5 安装cpolar
到这里,EasyVoice 已经能在局域网里正常使用了。但问题来了:一旦离开家里的网络,手机、笔记本就访问不了了。通勤路上想听刚生成的有声书?出差时想给视频配个旁白?都没戏。这时候就需要 cpolar 出场了。它能把内网服务穿透到公网,让你在任何有网络的地方都能访问自己的 TTS 服务。
5.1 什么是cpolar?

- cpolar 是一款内网穿透工具,可以将你在局域网内运行的服务(如本地 Web 服务器、SSH、远程桌面等)通过一条安全加密的中间隧道映射至公网,让外部设备无需配置路由器即可访问。
- 广泛支持 Windows、macOS、Linux、树莓派、群晖 NAS 等平台,并提供一键安装脚本方便部署。
5.2 安装cpolar
在玩客云的终端后台执行如下命令,进行一键安装cpolar:
sudo curl https://get.cpolar.sh | sh

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

可以看到显示为active(running),表示为正常在线状态。
接着,我们在浏览器中,输入你的玩客云IP地址+9200端口,进行访问cpolar的web ui控制台:
# 请使用你的访问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 提供了固定二级子域名功能。只需升级到任意付费套餐,就可以配置一个固定不变、简短易记的专属域名,彻底告别域名频繁变化的烦恼。下面我们来看看如何配置固定二级子域名。
首先,进入官网的预留页面:
https://dashboard.cpolar.com/reserved
然后,选择预留菜单,即可看到保留二级子域名项,填写其中的地区、名称、描述(可不填)项,然后点击保留按钮,操作步骤图如下:

列表中显示了一条已保留的二级子域名记录:
- 地区:显示为China Top。
- 二级域名:显示为easyvoice01。
注:二级域名是唯一的,每个账号都不相同,请以自己设置的二级域名保留的为主
进入侧边菜单栏的隧道管理下的隧道列表,可以看到名为easyvoice-9001的隧道:

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

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

这里以https访问测试一下:

访问成功!相比于每天都会变化的随机域名,这个固定域名不仅更加简短易记,而且永久不变,无论何时何地都可以通过这个地址访问您的EasyVoice服务,极大地提升了使用体验。
总结
本文以刷了 HiNas 系统的玩客云为例,通过 Docker 一键部署 EasyVoice,搭建了一个低成本、低功耗的私有 TTS 服务,并通过 cpolar 内网穿透实现了公网访问。
- EasyVoice 基于 Edge TTS,完全免费、无字数限制,支持流式输出、多角色配音和 AI 智能解析
- 本文使用的二次开发分支新增了 ARMv7 架构支持,玩客云、树莓派等设备均可运行
- 配合 cpolar 穿透后,随时随地都能访问自己的 TTS 服务,通勤听书、出差配音都不在话下
几十块的小盒子,功耗才几瓦,就能跑起一个属于自己的有声书生产工具。如果你也有小说想听、视频想配音,不妨动手试试!
感谢您阅读本篇文章,有任何问题欢迎留言交流。cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站



