
Read2Me是一个FastAPI应用程序,可从提供的URL中获取内容,处理文本,使用Microsoft Azure的Edge TTS或Local TTS型号F5-TTS,StyletTS2或Piper TTS将其转换为语音,并将其标记为使用Metadata的结果mp3文件。您可以将全文转换为音频,也可以让LLM将种子文本转换为播客。目前,支持Ollama和任何兼容API。您可以将提供的铬扩展安装在任何基于铬的浏览器(例如Chrome或Microsoft Edge)中,以将当前URL或任何文本发送到SEVER,添加源和关键字以自动获取。
这是当前的Beta版本,但我计划将其扩展以支持其他内容类型(例如EPUB),并为英语以外的其他语言提供更强大的支持。当前,当使用默认的Azure Edge TTS时,它已经支持其他语言并试图从文本中自动进行自动检测,但是质量可能会因语言而异。
requirements.txt中列出的依赖项。 克隆存储库:
git clone https://github.com/WismutHansen/READ2ME.git
cd read2me创建并激活虚拟环境:
python -m venv .venv
source .venv/bin/activate # On Windows: .venvScriptsactivate或者,如果您想将UV用于包装管理:
uv venv
source .venv/bin/activate # On Windows: .venvScriptsactivate安装依赖项:
pip install -r requirements.txt (or uv pip install -r requirements.txt)对于本地styletts2文本到语音模型,还请安装其他依赖项:
pip install -r requirements_stts2.txt (or uv pip install -r requirements_stts2.txt)对于F5-TTS模型,请安装其他依赖项:
pip install -r requirements_F5.txt (or uv pip install -r requirements_F5.txt)安装剧作家
playwright install如果使用UV,请还安装:
uv pip install pip对于本地pipertts支持:
python3 -m TTS.piper_tts.instalpipertts (MacOS and Linux) or python -m TTS.piper_tts.instalpipertts (on Windows)注意:使用styletts2或pipertts将WAV文件转换为MP3时,需要FFMPEG。 STYLETTS还需要在系统上安装尤其是NG。
设置环境变量:
.env命名.env.example
OUTPUT_DIR=Output # Directory to store output files
SOURCES_FILE=sources.json # File containing sources to retrieve articles from twice a day
IMG_PATH=front.jpg # Path to image file to use as cover
OLLAMA_BASE_URL=http://localhost:11434 # Standard Port for Ollama
OPENAI_BASE_URL=http://localhost:11434/v1 # Example for Ollama Open AI compatible endpoint
OPENAI_API_KEY=skxxxxxx # Your OpenAI API Key in case of using the official OpenAI API
MODEL_NAME=llama3.2:latest
LLM_ENGINE=Ollama # Valid Options: Ollama, OpenAI您可以将Ollama或任何OpenAI兼容API用于标题和播客脚本生成(摘要功能也很快即将推出)
克隆存储库并切换到其中:
git clone https://github.com/WismutHansen/READ2ME.git && cd read2me将.ENV.example复制为.env并编辑内容:重要:使用本地LLM-engine,例如Ollama时,URL需要遵循此格式“ host.docker.docker.internal.internal:11434”(for Ollama)或“ host.docker.docker.docker.internal.internal:1234”(for lmstudio)
构建Docker容器
docker build -t read2me . 注意:建立时间需要很长时间,请耐心等待
运行Docker容器
docker run -p 7777:7777 -d read2me注意:建立时间需要很长时间,请耐心等待
将.env.example复制并重命名为.env 。按照您的意愿编辑此文件的内容,指定输出目录,任务文件和图像路径,用于MP3文件封面以及源和关键字文件。
运行FastAPI应用程序:
uvicorn main:app --host 0.0.0.0 --port 7777或者,如果您连接到Linux服务器,例如通过SSH连接,并希望在关闭会话后保持应用程序运行
nohup uvicorn main:app --host 0.0.0.0 --port 7777 &这将在您当前的工作目录中将所有命令行输出写入一个名为nohup.out的文件中。
添加用于处理的URL:
将邮政请求发送到http://localhost:7777/v1/url/full包含url的JSON主体:
{
"url" : " https://example.com/article "
}您可以使用curl或像Postman这样的任何API客户端以这样的方式发送此请求:
curl -X POST http://localhost:7777/v1/url/full/
-H " Content-Type: application/json "
-d ' {"url": "https://example.com/article"} '
-d ' {"tts-engine": "edge"} '该存储库还包含一个有效的铬扩展名,您可以在启用开发人员设置时将其安装在任何基于铬的浏览器(例如Google Chrome)中。
处理URL:
该应用程序会定期检查tasks.json文件是否要处理新作业。它获取给定URL的内容,提取文本,将其转换为语音,并使用适当的元数据保存所得的MP3文件。
指定自动检索的来源和关键字:
创建一个名为sources.json的文件,在您的当前工作目录中,使用URL到您要监视新文章的网站的文件。您还可以将全局关键字和每源关键字设置为自动检索的过滤器。如果您为源设置“*”,则将检索所有新文章。这是一个示例结构:
{
"global_keywords" : [
" globalkeyword1 " ,
" globalkeyword2 "
],
"sources" : [
{
"url" : " https://example.com " ,
"keywords" : [ " keyword1 " , " keyword2 " ]
},
{
"url" : " https://example2.com " ,
"keywords" : [ " * " ]
}
]
}两个文件的位置均可在.env文件中配置。
要使用Next.js Frontend,请确保您在系统上安装了node.js。注意:Frontend目前处于早期实验阶段,因此期望很多错误:首先,切换到前端目录
cd frontend然后安装所需的节点依赖项:
npm install然后开始前端运行:
npm run dev您可以在http:// localhost:3000上访问前端
POST/V1/URL/FULL
将URL添加到处理列表中。
请求主体:
{
"url" : " https://example.com/article " ,
"tts-engine" : " edge "
}回复:
{
"message" : " URL added to the processing list "
}POST/V1/url/播客
POST/V1/TEXT/FULL
POST/V1/TEXT/PODCAST
分叉存储库。
创建一个新分支:
git checkout -b feature/your-feature-name进行更改并提交它们:
git commit -m ' Add some feature '推到分支:
git push origin feature/your-feature-name提交拉动请求。
该项目均根据2004年1月的Apache许可证版本2.0版获得许可,除了根据MIT许可证获得许可的STYLETTS2代码。 F5-TTS ABD STYLETTS2预培训模型属于自己的许可。
STYLETTS2预训练的模型:在使用这些预训练的模型之前,您同意通知听众,除非您有许可使用您合成的语音,否则先前训练的模型会合成语音样本。也就是说,您只同意使用其说话者许可的声音直接或通过许可来克隆声音,然后才能在公开合成的声音公开之前,或者您必须公开宣布,如果您没有使用这些声音的许可,则这些声音是合成的。
我要感谢以下存储库和作者的灵感和代码: