爱阅书香配置微软tts听书
前言
- docker 实现
- 项目地址yy4382/ms-ra-forwarder-for-ifreetime
- 由 wxxxcxx/ms-ra-forwarder: 免费的在线文本转语音API (github.com) 修改而来,记得给大佬点个star
- 特别感谢 @justnsms 大佬写的代码,没有他的帮助,肯定不可能有这么方便的方法
- 如果还是觉得太烦了,可以看博客里的另一篇,“完全免费的爱阅书香听书 微软TTS vercel部署指南”
- 配置过程中出问题的可以给我发邮件(邮箱在博客侧边栏)
前置条件
- 有一台云服务器/支持docker的NAS/电脑(待测试)
- 安装好 docker
安装服务器端
安装
原版教程见文末,如果几乎一键版搞不定,可以看一看。
支持Linux云服务器和群晖(感谢@rxgame001的测试)
依次执行以下指令(需要机子可以访问dockerhub)
# 建议使用root用户
docker run -d
--name ifreetimeTTS
-p 3000:3000
--restart unless-stopped
yunfinibol/ms-ra-forwarder-for-ifreetime:latest
如果你想用docker-compose,这个和上面的命令等效
# 创建文件夹,名字任意
mkdir ifreetime_tts&&cd ifreetime_tts
# 下载文件
wget https://gist.github.com/yy4382/d0c2a5e2c19323f4aa651f99317fd53e/raw/docker-compose.yml
# 启动容器
docker-compose up -d
# 搞好了!按照下文的方法验证是否成功,然后在爱阅中配置听书
想要设置token的话,docker run 增加一个参数
-e TOKEN=example
,docker-compose 的话按照yaml文件里的注释操作
配置ios端爱阅书香
打开爱阅书香,进入设置->听书->自定义语音库->创建
- 名称:任意
- 合成字数:建议200
- 请求方式:GET
- 地址:第一步里获取的网址,后边加上
/api/aiyue
,最终填进去的应该形如https://ip:3000/api/aiyue
,记得点右上角的保存 - 参数->添加->请输入请求参数:text,内容填%@
- 解析字段->添加->请输入解析字段与规则:playData,内容填ResponseData
- 如果在之前部署时选择了使用TOKEN,则 Http配置->自定义HTTP头->添加->请输入HTTP协议头信息:authorization,内容填
Bearer 你的token
,比如说你的TOKEN是example
,则内容填Bearer example
,没有设置TOKEN的不用管,设置完回到刚刚的页面 - 可选:参数->添加->请输入请求参数:voiceName,内容填自己想要的人声(参考这里),不添加这个参数的话默认 zh-CN-XiaoxiaoNeural(要么填好人声,要么不要添加这个参数,不要添加了参数但是内容为空)
测试发音,如果正确就ok了,记得保存后再退出。
附
原版
- 需要两个服务,一个是tts文字转语音服务,如果只要安卓的阅读3.0使用,只要这个就可以了;另一个是将第一个服务转换成爱阅书香可以使用的格式
- 两个项目的地址:wxxxcxx/ms-ra-forwarder: 免费的在线文本转语音API (github.com) ,iranee/ifreetime: iOS爱阅书香TTS自建服务 (github.com),记得给两位大佬点star
稍显麻烦,需要docker 基础知识,但是可以让你知道这一切是如何运作的,放在文末了
ms-ra-forwarder
- GitHub地址:wxxxcxx/ms-ra-forwarder: 免费的在线文本转语音API (github.com)
- 项目本身提供了
docker-compose.yml
文件,直接用就是了 - 打开
http://你的ip:3000
看看是否有这个页面
也可以用 vercel,但是每月只有100G免费流量,听的多的/还搭了其他服务的要小心些
- 因为微软把Azure的试用关了,所以只能用ra(edge的大声朗读)接口了
ifreetime
- 项目地址:iranee/ifreetime: iOS爱阅书香TTS自建服务 (github.com)
- 如果你的服务器已经在运行一个支持php的网站了,直接把项目里的
ra.php
中的http://127.0.0.1:3000/api/ra
的ip改成你自己在第一步里用的,然后丢到网站里就行 - 如果没有,那么需要建一个docker容器以运行该php文件(警告:我没写过php,dockerfile 的写法是ChatGPT 给的,不保证最优,但应该能用,反正我成功了)
- 新建一个文件夹,假设叫做ifreetime(其他的也行)
- 进入文件夹,再建一个叫做src的文件夹,把项目中的ra.php放进去(或者直接把整个项目clone进去也行)
- 修改ra.php,把
http://127.0.0.1:3000/api/ra
中的127.0.0.1:3000
换成第一步中生成的ip+端口- 对于服务器,最方便的方法是直接用公网ip+端口,对于群晖,最简单的是用局域网ip+端口
- 经测试可行的其他替代方案:
- 云服务器做好域名解析和反代之后,使用类似
https://tts.example.com/api/ra
的格式(使用https://tts.example.com
可以访问ms-ra-forwarder) - 使用本地docker的ip,一般是172.17.0.1,所以应该形如
http://172.17.0.1:3000/api/ra
- 云服务器做好域名解析和反代之后,使用类似
- 不可行的方案: 不可以使用127.0.0.1,因为在容器里
- 可能会出问题的方案:域名+端口的形式,比如
https://www.example.com:3000/api/ra
尤其对于nas来说,因为80/443没法用,所以不得不额外加端口。有人这样搞失败了,但不确定是不是因为这个问题。有人这样搞成功了的话,用邮件踢我一脚(邮箱在博客上有写)
- 回到 ifreetime 文件夹,新建一个叫
Dockerfile
的文件,内容为
# 设置基础镜像
FROM php:7.3
# 将本地代码复制到容器中的 /var/www/html 目录
COPY src/ /var/www/html/
# 设置容器内的工作目录
WORKDIR /var/www/html
# 暴露容器的 8000 端口
EXPOSE 8000
#启动php服务器
CMD ["php", "-S", "0.0.0.0:8000"]
- 构建并运行:在 ifreetime 目录中,依次输入如下指令
docker build -t ifreetime .
docker run -d -p 12222:8000 ifreetime
- 这种方法,需要将爱阅中的配置(还有测试的时候)把3000都换成12222.而且/api/aiyue 都换成/ra.php
- 打开手机App,进入听书配置 -> 自定义语音库
创建->高级自定义语音合成名称:任意合成字数:建议200
请求方式:GET
地址:ra.php网络地址,如果安装上面的方法,是
http://你的ip:12222/ra.php
参数->添加->请输入请求参数:voiceName,内容填自己想要的人声(参考这里),例如zh-CN-XiaoxiaoNeural
参数->添加->请输入请求参数:text,内容填%@
解析字段->添加->请输入解析字段与规则:playData,内容填ResponseData
测试发音,如果正确就ok了。