ai-engineering-hub 如何用 Minimax M2.1 与 TTS 2.6 把网页文章转成双人播客【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub如果你有一段网页文章的 URL希望把它变成一段两位主持人对话形式的完整播客音频ai-podcast-generator 就是为此准备的输入文章 URL它会自动抓取正文、用 Minimax-M2.1 生成双人对话脚本、用 Minimax Speech 2.6 逐段合成语音最后合并成单个 MP3 供在线试听和下载。整个工具链由 Firecrawl网页抓取、Streamlit交互界面以及上述两个 Minimax 模型组成运行环境要求 Python 3.12依赖通过uv管理。运行流程与对应的代码文件一次URL → 播客的生成在 app.py 中串联了四个阶段各阶段分别由独立模块实现阶段模块作用内容抓取scraper.py用 Firecrawl 以 markdown 格式抓取 URL 正文脚本生成script_generator.py调用 Minimax-M2.1 生成 Host 1 / Host 2 双人对话脚本语音合成tts_converter.py用 speech-2.6-hd 逐段生成 mp3音频合并app.py校验各段后用 pydub 合并为full_podcast.mp3双人设定的分工在脚本生成阶段就固定下来提示词要求 Host 1男声担任好奇的提问者Host 2女声担任该话题的专家脚本中每一行必须写成Host 1:或Host 2:开头的对话。准备环境README 声明前置条件为Python 3.12pyproject.toml 中requires-python 3.12与之一致。如果系统里还没有uv按 README 给出的命令安装# MacOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows powershell -ExecutionPolicy ByPass -c irm https://astral.sh/uv/install.ps1 | iex然后进入项目的ai-podcast-generator目录创建虚拟环境并安装依赖README 中对应步骤是新建目录后执行这里直接在仓库子目录内操作即可cd ai-podcast-generator uv venv source .venv/bin/activate # MacOS/LinuxWindows 用 .venv\Scripts\activate uv syncuv sync会按 pyproject.toml 安装firecrawl-py、ipykernel、pydub、python-dotenv、requests、streamlit等依赖。配置三个 API 密钥本工具需要三个密钥作用各不相同MINIMAX_API_KEY语音合成speech-2.6-hd走 Minimax 官方 APIOPENROUTER_API_KEY脚本生成经 OpenRouter 调用minimax/minimax-m2.1FIRECRAWL_API_KEY网页抓取。按 README 在项目根目录创建.env文件MINIMAX_API_KEYYOUR_MINIMAX_API_KEY FIRECRAWL_API_KEYYOUR_FIRECRAWL_API_KEY OPENROUTER_API_KEYYOUR_OPENROUTER_API_KEY三个占位符需替换为你各自从 Minimax、Firecrawl、OpenRouter 平台申请的密钥。scraper.py、script_generator.py、tts_converter.py都会通过python-dotenv自动加载它。如果不想用.env也可以把三个密钥直接填在应用的侧边栏输入框里——app.py 在点击生成时会将侧边栏的值写入环境变量。两种方式任选其一即可。启动应用并生成播客streamlit run app.py应用打开在http://localhost:8501。操作顺序在左侧侧边栏的 API Keys 区域填写三个密钥若已配置.env可跳过在 Article URL 输入框粘贴目标文章的 URL占位提示为https://example.com/article需替换为真实地址点击Generate Podcast。页面会依次执行抓取、脚本生成、音频合成、合并四个阶段每个阶段都有独立的状态框。各阶段实际发生了什么抓取阶段scraper.py 调用Firecrawl.api.scrape(url, formats[markdown])从返回结果中取markdown字段作为正文如果取不到内容抛出No content extracted from URL页面显示❌ Scraping failed: ...并停止。抓取成功时显示✅ Successfully scraped N charactersN 为正文字符数。脚本生成阶段script_generator.py 向https://openrouter.ai/api/v1/chat/completions发送请求model字段为minimax/minimax-m2.1。提示词要求把正文改写为两位主持人的自然对话并强制每行以Host 1:或Host 2:开头。失败时页面显示❌ Script generation failed: ...并停止。语音合成阶段tts_converter.py 只解析以Host 1:/Host 2:开头的行_parse_script其余行被忽略并按说话人映射音色Host 1→ male →English_Explanatory_ManHost 2→ female →English_captivating_female1每段文本调用 Minimax 的异步 TTS 接口t2a_async_v2model为speech-2.6-hdvoice_setting中speed: 1.0、vol: 1.0、pitch: 0audio_setting为sample_rate: 32000、bitrate: 128000、format: mp3。拿到task_id后每 2 秒轮询一次状态最多 60 次status Success时取file_id下载Failed时报TTS generation failed: ...轮询耗尽报TTS generation timeout。各段保存为segment_001.mp3、segment_002.mp3等编号文件。任何一段失败都会显示❌ Audio generation failed: ...并停止。合并阶段app.py 对每段文件做校验——文件不存在、小于 1KB、不是合法 MP3 或时长不足 100ms 的段会被标记为损坏并跳过页面提示⚠️ Segment N corrupted/too short/invalid MP3若没有任何有效段则抛出No valid audio segments to merge。有效段按顺序用 pydub 拼接导出为full_podcast.mp3并显示✅ Podcast merged successfully (N bytes)。结果验证生成结束后页面出现Results区域两个页签Podcast页签内嵌音频播放器并提供podcast.mp3下载按钮Script页签展示完整对话脚本文本并提供podcast_script.txt下载按钮。能播放、能下载且脚本页签中的对话与原文主题对应即说明整条链路跑通。仓库中 test_audio/ 目录存放的segment_001.mp3至segment_008.mp3共 8 个文件就是该工具链输出的示例分段音频可参考其命名格式。如果只想单独验证 TTS 这一段不依赖网页抓取和脚本生成可以直接运行python tts_converter.pytts_converter.py 底部的__main__内置了一段 8 行的示例对话脚本会把 8 个分段音频生成到test_audio/目录并逐段打印保存路径成功时输出✅ Test completed successfully!及文件清单失败时输出❌ Test failed: 错误信息。已知边界与失败现象脚本中不符合Host 1:/Host 2:行首格式的行会被_parse_script直接丢弃不会合成语音某段 TTS 轮询达到 60 次上限仍无结果时该次生成以TTS generation timeout报错终止而不是无限等待合并阶段对损坏段的跳过只保证输出能播被跳过的段在最终音频中对应的对话内容会缺失页面会以ℹ️ Note: N segments were skipped due to corruption提示数量密钥缺失或无效时各阶段在首次对应 API 调用处报错并st.stop()中止整个流程不会出现部分成功的中间产物。【免费下载链接】ai-engineering-hubIn-depth tutorials on LLMs, RAGs and real-world AI agent applications.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-hub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考