如何把一本电子书变成有声书?用 n8n + 免费AI 工具,轻松搭建一个全自动的音频生成工作流!先来看看效果!!
别只惊叹AI能做什么,来亲眼看看它是怎么做到的!本文将从零开始,逐个节点拆解一个神奇的自动化工作流,看AI如何将一本普通的电子书,一步步“阅读、理解、朗读”,最终变成一部高质量的有声书。硬核教程,小白也能懂!
F5-TTS

声音素材模板:
https://bytedancespeech.github.io/seedtts_tech_report/#full-diffusion-samples
H站在线体验地址:
https://huggingface.co/spaces/mrfakename/E2-F5-TTS

F5-TTS-音频地址:
https://swivid.github.io/F5-TTS_updates/
本次使用音频文件:
https://swivid.github.io/F5-TTS_updates/audios/seedtts_ref_zh_1.wav
1.基础环境
小编的显卡,跑F5-TTS,使用docker部署的话,mac本地也可以跑起来,只不过为了后续的服务,小编使用gpu的机器保证一下性能。

查看系统是否有Miniconda3的虚拟环境
conda -V
如果输入命令没有显示Conda版本号,则需要安装。

更新系统命令,切换到root用户
apt-get update && apt-get install ffmpeg libsm6 libxext6 -y
# 显卡驱动
sudo apt-get install nvidia-driver-535 nvidia-settings nvidia-prime
2.创建虚拟环境
conda create -n f5-tts python=3.10 -y
# 激活“f5-tts"虚拟环境
conda activate f5-tts
conda deactivate

3.下载Pytorch
输入下列命令:
pip install torch==2.4.0+cu124 torchaudio==2.4.0+cu124 --extra-index-url https://download.pytorch.org/whl/cu124

4.下载模型以及依赖包
# 作为 pip 包(如果只是为了推断)
pip install f5-tts
# 下载模型,局部可编辑(如果也进行训练、微调)
git clone https://github.com/SWivid/F5-TTS.git
cd F5-TTS/
# 下载模型依赖包
pip install -e .
耐心等待,直到出现以“Successfully”开头的提示,则下载结束:

网页演示
# 在本地运行 gradio 应用程序,使用下列命令运行项目呈现模型的成功界面
f5-tts_infer-gradio --port 8735 --host 0.0.0.0

程序已成功启动: 你的 f5-tts 语音合成应用正在运行。
监听地址 0.0.0.0:8735:
0.0.0.0 是一个特殊的地址,代表服务器上“所有”的网络接口。这包括你的本地回环地址(127.0.0.1)和你的局域网IP地址(例如 192.168.1.10)。
这么设置的目的是为了让局域网内的其他设备(比如你的手机、其他电脑)也能通过访问你服务器的IP地址来使用这个服务。
谁可以访问?:
默认情况: 任何和你服务器在同一个局域网里的人,都可以通过 http://<你服务器的IP地址>:8735 访问。
互联网访问:
互联网访问: 默认是关闭的。除非你设置了 share=True (这会生成一个临时的公开链接) 或者在你的路由器上做了端口转发,否则外网用户无法访问。
1.如何设置访问密码(key)?
由于使用该框架构建的具体应用(f5-tts)没有暴露这个功能的开关,即基础框架(Gradio)支持某个功能。
解决方案:如何为你的应用添加密码保护 🛡️
既然无法直接通过命令行添加密码,可以采用一种更专业、更通用的方法——使用反向代理 (Reverse Proxy)。这是在生产环境中保护Web应用的行业标准做法。
可以使用 Nginx 作为反向代理,它就像一个在你应用门前的专业保安。
工作原理:
-
• 隐藏应用:让 f5-tts 只在服务器内部监听(127.0.0.1),这样外界就无法直接访问它了。 -
• Nginx站岗:Nginx 监听公共端口(如 8735),并要求所有访问者提供用户名和密码。 -
• 验证放行:只有当用户输入了正确的密码,Nginx 才会将请求转发给躲在后面的 f5-tts 应用。
步骤一:修改 f5-tts 启动命令
首先,修改你的启动命令,将 --host 从 0.0.0.0 改为 127.0.0.1。这样它就只接受来自本机(也就是Nginx)的请求了,建议使用 tmux 或 systemd 运行以下命令:
# 步骤一:修改 f5-tts 启动命令
f5-tts_infer-gradio --port 8735 --host 127.0.0.1
步骤二:安装并配置 Nginx
-
1. 安装 Nginx 和 apache2-utils (用于创建密码文件):
sudo apt update
sudo apt install nginx apache2-utils -y
-
2. 创建密码文件:
创建一个密码文件,用户名为 admin,密码为 datascience。
-c 选项表示创建新文件,只在第一次使用。之后添加新用户时不要带 -c。
# 创建文件并添加第一个用户
sudo htpasswd -c /etc/nginx/.htpasswd admin
执行后,系统会提示你输入两次密码(请输入 datascience)。
-
3. 创建 Nginx 配置文件:
sudo vim /etc/nginx/sites-available/f5-tts
-
4. 将下面的配置粘贴进去:
这个配置告诉 Nginx 监听 8735 端口,要求密码验证,并将通过验证的流量转发给 f5-tts。
server {
listen 8735;
server_name _; # 监听所有指向这个端口的IP
# --- 密码验证配置 ---
auth_basic "Restricted Access"; # 登录提示信息
auth_basic_user_file /etc/nginx/.htpasswd; # 指向我们创建的密码文件
location / {
# --- 核心的反向代理配置 ---
proxy_pass http://127.0.0.1:8735;
# --- Gradio需要的额外配置 (支持WebSocket) ---
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
-
5. 启用这个配置:
我们需要创建一个从 sites-available到 sites-enabled的符号链接。
sudo ln -s /etc/nginx/sites-available/f5-tts /etc/nginx/sites-enabled/
# 顺便可以移除默认的站点,避免冲突
sudo rm /etc/nginx/sites-enabled/default
步骤三:重启 Nginx 并测试
1.检查 Nginx 配置语法是否有误:
sudo nginx -t
如果看到 syntax is ok 和 test is successful 就表示没问题。
-
2. 重启 Nginx 使配置生效:
sudo systemctl restart nginx
现在,当你通过浏览器访问 http://<你服务器的IP地址>:8735 时,浏览器会弹出一个登录框,要求你输入用户名和密码。只有输入正确的凭据后,你才能看到并使用 f5-tts 的界面。
2.如何让程序在后台启动并持久运行
如果你直接在终端里运行上面的命令,一旦你关闭了终端窗口(SSH连接断开),程序就会被终止。为了让它像一个真正的服务一样7x24小时运行,你需要让它在后台执行。
这里有三种常用且推荐的方法,从简单到专业:
方法一:使用 nohup 和 & (最简单)
这是最快速、最简单的“一次性”后台运行方法。
nohup: 是 "no hang up" 的缩写,保证在你退出账户/断开终端后,程序不会被挂断。
&: 将命令放入后台执行。
: 将程序的标准输出信息重定向到一个日志文件中,方便你以后排查问题。
命令格式:
nohup <你的启动命令> > f5-tts.log 2>&1 &
# 实际应用:
nohup f5-tts_infer-gradio --port 8735 --host 0.0.0.0 > f5-tts.log 2>&1 &
# 如何查看日志:
tail -f f5-tts.log
#如何停止程序:
## 找到进程ID (PID):
ps aux | grep f5-tts_infer-gradio
## 杀掉进程:
kill <进程ID>
优点: 非常简单,无需安装任何额外工具。
缺点: 管理起来稍显麻烦,程序崩溃后不会自动重启。
方法二:使用 tmux 或 screen (功能更强)
tmux 和 screen 是终端复用工具,它们可以创建一个“虚拟终端会话”,你可以随时断开或重新连接这个会hp会话,而里面的程序会一直运行。tmux 更为现代和流行。
使用 tmux 的步骤:
安装 tmux (如果你的系统没有的话):
# Ubuntu/Debian
sudo apt update && sudo apt install tmux
# CentOS/RHEL
sudo yum install tmux
# 创建一个新的 tmux 会话:
tmux new -s tts_service
-s tts_service 的意思是创建一个名为 tts_service 的会话。
在 tmux 会话中运行你的程序:
f5-tts_infer-gradio --port 8735 --host 0.0.0.0
脱离 (Detach) 会话: 现在程序已经在运行了,你可以安心地断开连接。按下快捷键 Ctrl+b,然后松开,再按 d。你就回到了主终端,但 tts_service 会话和里面的程序仍在后台运行。
如何重新连接:
tmux attach -t tts_service
你又会看到熟悉的程序输出界面。
优点: 可以随时回去查看实时输出,管理非常方便,一个会话里可以开多个窗口和面板。
缺点: 程序崩溃后同样不会自动重启。
方法三:使用 systemd 创建系统服务 (最专业、最推荐)
这是在Linux上部署服务的标准做法。它能让你的程序像Nginx、Docker一样,作为系统服务来管理,可以实现开机自启、崩溃后自动重启等高级功能。
步骤:
创建一个服务文件:
sudo nano /etc/systemd/system/f5-tts.service
将以下内容粘贴到文件中:
注意: 你需要修改 ExecStart 和 User 这两行中的路径和用户名。
which f5-tts_infer-gradio: 在终端运行这个命令,找到程序的确切路径。
User: 换成你自己的用户名。
Ini, TOML
[Unit]
Description=F5-TTS Gradio Service
After=network.target
[Service]
Type=simple
强烈建议使用程序的绝对路径
ExecStart=/home/your_user/.local/bin/f5-tts_infer-gradio --port 8735 --host 0.0.0.0
User=your_user
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Restart=on-failure: 这是关键,表示如果程序因为错误退出,5秒后 (RestartSec=5s) 自动重启。
# 让 systemd 加载新服务:
sudo systemctl daemon-reload
# 启动你的服务:
sudo systemctl start f5-tts.service
(可选)设置开机自启:
sudo systemctl enable f5-tts.service
# 常用的 systemd 管理命令:
查看服务状态: sudo systemctl status f5-tts.service
查看实时日志: sudo journalctl -u f5-tts.service -f
停止服务: sudo systemctl stop f5-tts.service
重启服务: sudo systemctl restart f5-tts.service
优点: 非常稳定、强大,是生产环境的最佳实践。
缺点: 配置比前两种方法稍微复杂一点。
N8N 自动生成高质量有声书
第一步:准备好“AI炼丹炉”
在开始之前,需要准备几个核心工具。正是它们的协同工作,才让魔法成为可能。
-
• n8n (自动化中枢):所有操作的可视化指挥中心,负责连接和调度所有工具。 -
• Ollama (本地AI模型库):一个能让你在自己电脑上运行各种AI模型的强大工具。我们将用它来运行 bge-m3
模型,这是我们AI“阅读理解”能力的关键。 -
• TTS服务 (AI的声音):一个文本转语音(Text-to-Speech)的API服务。在工作流里,使用了一个基于Gradio的TTS接口,它就是AI的“声带”,负责将文字转换成声音。
准备好这些,就可以开始深入工作流的每一个细节了。
第二步:工作流深度解析 (节点功能全揭秘)
区块一:知识的入口与“消化系统”
这个部分是AI“阅读和理解”一本书的核心。
-
• 节点1: On form submission
(表单触发器)-
• 功能说明:这是与工作流交互的唯一入口。它会创建一个简单的网页,上面只有一个文件上传按钮。 -
• 特色:在这里设置了它只接受 .txt
和.pdf
文件。用户从这里上传电子书,整个自动化流程就正式启动了。它是整个魔法的“启动咒语”。
-
-
• 节点2: Recursive Character Text Splitter
(递归字符文本分割器)-
• 功能说明:一本书动辄几十万字,不能一口气把整本书都丢给AI,那样会“噎着”。这个节点就像一个精密的“切片机”,它会智能地将长文本按照段落、句子等方式,切分成一个个更小、但语义完整的文本块。 -
• 特色:采用“递归”方式,能最大程度地保持句子和段落的完整性,确保AI在理解时不会断章取义。
-
-
• 节点3: Embeddings Ollama
(Ollama嵌入模型)-
• 功能说明:这是AI“理解”文字最关键的一步。它连接到本地运行的Ollama,调用 bge-m3
模型。 -
• 特色:它的作用,是把上一步切分好的每一个文字块,都“翻译”成AI能理解的数学语言——向量(Vector)。你可以想象成,AI为书中的每一个知识点都在一个巨大的三维空间里标注了一个独一无二的坐标。这步操作,叫做“向量化嵌入”。
-
-
• 节点4: Simple Vector Store
(简单向量存储)-
• 功能说明:这个节点就像是AI为了这本书临时建立的一个“短期记忆库”或“大脑海马体”。 -
• 特色:它接收所有被“向量化”的文本块,并把它们有序地存储起来。后续的流程就可以从这个“记忆库”中,一块一块地提取内容去朗读。
-
区块二:AI的“发声与表达”
当书本内容被AI完全“消化”后,就到了开口说话的环节。
-
• 节点5: Loop Over Items
(循环器)-
• 功能说明:这是工作流的“发动机”。它会从前面建立的“记忆库”中,按顺序取出每一个文本块,然后执行一次后续的“朗读”操作。读完一块,再取下一块,直到读完全部内容。 -
• 特色:保证了有声书是按照原文顺序,一段一段生成的,逻辑清晰。
-
-
• 节点6: HTTP Request
(调用TTS服务)-
• 功能说明:这是AI的“声带”!在循环中,它将当前拿到的文本块,通过API请求发送给我们的TTS服务。 -
• 特色:在请求的 JSON Body
中,使用了n8n的表达式{{ $json.pageContent.replaceAll('\n','').replaceAll('\"','') }}
,它能动态地将文本块内容填入请求中,并做一些清理,确保API能正确处理。
-
# 发起预测请求 result = client.predict( handle_file(ref_audio_path), # 参考声音样本,用于克隆声音特征 "", # 与参考音频对应的文字内容 text, # 要合成的文字(输出语音内容) False, # 是否去除参考音频中的静音段 0.15, # 帧之间的过渡混合时间 32, # 推理步骤数 1.0, # 语音速度 api_name="/basic_tts" )

区块三:成果的获取与“后期制作”
发出朗读请求后,还需要一点耐心和技巧来获取并保存最终的音频。
-
• 节点7 & 8: Wait
(等待) &Get audio address
(获取音频地址)-
• 功能说明:文本转语音需要后台处理时间,不是瞬间完成的。因此, Wait
节点会先让工作流暂停10秒,给AI一点反应时间。然后,Get audio address
节点会去轮询API,检查音频是否已经生成完毕,并获取其返回结果。 -
• 特色:这种“等待-查询”的模式,是处理异步任务(需要后台处理时间的任务)的经典方法,保证了我们不会在音频还没生成时就去空手而归。
-
-
• 节点9: Code
(代码节点 - 数据清洗师)-
• 功能说明:很多时候,API返回的数据并不是我们想要的干净URL,而是一大串混杂着其他信息的文本(如此工作流中的 event: complete data: [...]
)。 -
• 特色:这个节点是整个工作流的“点睛之笔”!用一小段JavaScript代码,像一个熟练的数据清洗师,从这堆原始数据中精准地“择”出我们真正需要的那个音频文件的URL。这展示了n8n的强大之处:当标准化节点无法满足需求时,可以用代码实现任何你想要的骚操作!
-
-
• 节点10 & 11: Download Audio
(下载) &Read/Write Files
(保存)-
• 功能说明:最后的收尾工作! Download Audio
节点会根据上一步代码节点提取出的干净URL,去下载生成的音频文件。 -
• 特色: Read/Write Files from Disk
节点会将下载好的音频文件,以当前时间{{$now.format('yyyy-MM-dd hh:mm:ss')}}.mp3
来命名,并保存到你指定的本地文件夹中。自动化、标准化,方便归档整理。
-
如下图片所示,将生成的音频保存到本地了,如果不知道本地docker 映射路径如何配置,请参考: https://mp.weixin.qq.com/s/T1GgnfdMeXOYidgRSyuNnQ

supabase 扩展选项
https://supabase.com/
Supabase 对个人开发者是免费的,并且免费额度相当可观,非常适合用于学习、开发个人项目、产品原型验证(MVP)以及小型应用的初期阶段。 个人用户可以将mav 的音频录制上传到这里,然后替换TTS 的音频url即可。

第三步 成品工作流如下

这个工作流的真正魅力在于,它像乐高积木一样,将文档处理、本地AI模型、外部API服务、数据清洗、文件操作等不同模块,优雅地拼接在了一起,最终实现了一个看似复杂却逻辑清晰的强大功能。
现在,你不仅知道了AI能把书变成有声读物,更知道了它是如何一步步完成这一切的。这意味着,你已经拥有了修改、定制,甚至创造属于你自己的AI工作流的知识和能力。
你,也可以是AI魔法师!
本篇文章来源于微信公众号: DataScience
文章评论