GPT-Academic 语音合成实战:EDGE-TTS 与 SoVITS 两种 TTS 方案配置与实现原理 GPT-Academic 语音合成实战EDGE-TTS 与 SoVITS 两种 TTS 方案配置与实现原理【免费下载链接】gpt_academic为GPT/GLM等LLM大语言模型提供实用化交互接口特别优化论文阅读/润色/写作体验模块化设计支持自定义快捷按钮函数插件支持Python和C等项目剖析自译解功能PDF/LaTex论文翻译总结功能支持并行问询多种LLM模型支持chatglm3等本地模型。接入通义千问, deepseekcoder, 讯飞星火, 文心一言, llama2, rwkv, claude2, moss等。项目地址: https://gitcode.com/GitHub_Trending/gp/gpt_academicGPT-Academic 内置了文字转语音TTSText-to-Speech能力可以把模型在对话界面中流式输出的文本逐句朗读出来为论文朗读、听稿等场景提供语音交互。本文基于仓库文档 使用TTS文字转语音 展开先完整给出 EDGE-TTS云端、免部署与 SoVITS本地克隆音色、需显卡两套方案的配置步骤再结合 FastAPI 服务端 与 前端播放脚本 的源码剖析/vits接口的请求链路、音频切分与排队播放机制帮助你既能快速启用 TTS也能理解并排查底层问题。一、TTS 相关配置项总览项目所有 TTS 配置集中在 config.py 中共三个参数# GPT-SOVITS 文本转语音服务的运行地址将语言模型的生成文本朗读出来 TTS_TYPE EDGE_TTS # EDGE_TTS / LOCAL_SOVITS_API / DISABLE GPT_SOVITS_URL EDGE_TTS_VOICE zh-CN-XiaoxiaoNeural各配置项含义如下配置项取值说明TTS_TYPEEDGE_TTS/LOCAL_SOVITS_API/DISABLETTS 引擎类型。DISABLE时服务端不注册任何语音接口前端朗读功能整体关闭GPT_SOVITS_URL形如http://127.0.0.1:19880仅LOCAL_SOVITS_API模式下使用指向本地 SoVITS 推理服务的地址EDGE_TTS_VOICE语音名称默认zh-CN-XiaoxiaoNeural仅EDGE_TTS模式下使用控制朗读音色如zh-CN-YunxiNeural、zh-CN-XiaoyiNeural等微软 Edge 语音可按需替换需要说明的是TTS_TYPE会在启动时被读取并注入到前端初始化脚本中main.py 通过get_conf取出该值并在 main.py 中以_jsf()GptAcademicJavaScriptInit({DARK_MODE},{INIT_SYS_PROMPT},{ADD_WAIFU},{LAYOUT},{TTS_TYPE})的形式传给浏览器端用于决定页面是否启用自动朗读入口。另外EDGE-TTS 方案的依赖已在 requirements.txt 中声明edge-tts7.0.0安装项目依赖后即可使用而 mp3 转 wav 的环节依赖 ffmpeg见后文原理部分。二、方案一使用 EDGE-TTS简单无需显卡这是文档推荐的入门方案无需本地部署任何语音服务直接复用微软 Edge 的在线语音合成能力。只需将 config.py 修改为TTS_TYPE EDGE_TTS EDGE_TTS_VOICE zh-CN-XiaoxiaoNeural修改配置后重启项目即可。EDGE_TTS_VOICE决定了朗读音色默认值zh-CN-XiaoxiaoNeural是晓晓女声也可以换成其他音色名称以改变听感。该方案的前提是服务能够访问 Edge TTS 的在线接口属于网络可达性问题因此在内网或受限网络环境下需要自备代理。三、方案二使用 SoVITS本地部署支持克隆音色需要显卡SoVITSGPT-SoVITS支持用少量参考音频克隆角色音色适合想让模型用指定角色声音朗读的场景。由于推理需要显卡文档建议通过 Docker 部署。操作步骤与文档 使用TTS文字转语音 完全一致1. 创建如下文件夹结构reference目录用于挂载克隆音色的参考素材. ├── docker-compose.yml └── reference ├── clone_target_txt.txt └── clone_target_wave.mp32.docker-compose.yml内容注意其中19880:9880的端口映射宿主机端口 19880 是后续配置要记住的值version: 3.8 services: gpt-sovits: image: fuqingxu/sovits_gptac_trim:latest container_name: sovits_gptac_container working_dir: /workspace/gpt_sovits_demo environment: - is_halfFalse - is_shareFalse volumes: - ./reference:/reference ports: - 19880:9880 # 19880 为 sovits api 的暴露端口记住它 shm_size: 16G deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] command: bash -c python3 api.py3. 准备克隆素材clone_target_wave.mp3是想要克隆的角色音频clone_target_txt.txt是该音频逐字对应的文本角色语音素材可参考公开的角色语音合集。4. 启动服务在目录内运行docker-compose up等待 SoVITS API 容器启动完成。5. 修改 GPT-Academic 配置端口必须与 docker-compose 中暴露的端口对应TTS_TYPE LOCAL_SOVITS_API GPT_SOVITS_URL http://127.0.0.1:198806. 启动本项目。此后所有朗读请求都会转发到本地 SoVITS 服务音色由容器内reference挂载的参考音频决定。四、实现原理从/vits接口到浏览器播放理解底层链路可以在 TTS 不工作时快速定位问题出在哪一环。4.1 服务端/vits接口的注册与分发TTS 接口注册在 FastAPI 封装层 shared_utils/fastapi_server.py 中。关键点按配置条件注册只有TTS_TYPE ! DISABLE时代码才会执行接口注册逻辑并挂载POST /vits路由fastapi_server.py。因此TTS_TYPE DISABLE时该端点根本不存在。EDGE_TTS 分支收到 JSON 请求体后取出text字段用edge_tts.Communicate(text..., voiceEDGE_TTS_VOICE)合成语音先存为临时 mp3 文件再通过pydub.AudioSegment转成 wav 后作为二进制响应返回。这里有一个显式的前置依赖转换失败会抛出RuntimeError(ffmpeg未安装无法处理EdgeTTS音频。...)fastapi_server.py。也就是说EDGE-TTS 方案实际依赖系统安装了 ffmpeg即使 requirements 里只声明了edge-tts与pydub相关 Python 包。LOCAL_SOVITS_API 分支直接把整个请求体原样POST到GPT_SOVITS_URL超时设为 60 秒并把远端响应内容、状态码与响应头原样回传给浏览器fastapi_server.py。从源码结构看GPT-Academic 在这一模式下充当的是 SoVITS 服务的透明代理音频格式完全由 SoVITS API 决定。错误处理转发过程中的httpx.RequestError会被包装为 400 状态码返回前端会收到非 2xx 响应见下文。仓库中还有对应的独立测试脚本 tests/test_tts.py它复现了 EDGE_TTS 分支的完整流程合成 → 临时文件 → pydub 转 wav → ffmpeg 缺失时抛出相同报错可以直接python tests/test_tts.py运行来单独验证本机 Edge-TTS 与 ffmpeg 环境是否正常与 Web 界面解耦。4.2 前端文本切分、并发请求与顺序播放浏览器侧逻辑位于 themes/tts.js。其工作机制可以概括为三步逐句切分与请求push_text_to_audio函数将待朗读文本按text.split(/[\n。]/)换行或中文句号拆成短句对每个非空句子向${window.location.href}vits发起POST请求体为{ text: ..., text_language: zh }并携带自增序号send_index句子之间还会await delay(3000)做节流tts.js。整个推送过程由自定义的FIFOLock串行锁保护避免乱序触发。乱序到达的处理由于各句的合成耗时不同返回顺序可能乱序。UpdatePlayQueue会比较返回序号cnt与期望的recv_index不一致时先缓存到to_be_processed一致时立即入队播放并顺带把已缓存的前序音频依次取出播放保证朗读顺序与文本顺序一致tts.js。顺序播放与停止AudioPlayer类基于 Web Audio APIAudioContext.decodeAudioDataAudioBufferSourceNode实现播放队列enqueueAudio只在朗读开关allow_auto_read_tts_flag开启时生效stop()方法清空队列并停止当前音源对应界面上的暂停/停止朗读操作tts.js。4.3 端到端调用链小结综合以上源码一次文本被朗读的完整链路为模型流式输出文本 → themes/tts.js 按换行/句号切句带序号 POST 到 /vits → shared_utils/fastapi_server.py 按 TTS_TYPE 分发 EDGE_TTSedge_tts 合成 mp3 → pydub 转 wav需 ffmpeg LOCAL_SOVITS_API透传到 GPT_SOVITS_URL本地 SoVITS API → 二进制音频返回浏览器按序号恢复顺序进入 AudioPlayer 队列 → Web Audio API 顺序播放五、常见问题与排查要点结合文档与源码可以归纳出以下排查路径页面没有朗读按钮 / 点了没反应确认TTS_TYPE不是DISABLE且修改配置后重启了服务——/vits路由在启动时按配置决定是否注册fastapi_server.py。EDGE-TTS 报 ffmpeg 相关错误服务端日志出现ffmpeg未安装提示时说明 mp3→wav 环节失败安装 ffmpeg 后重启即可也可先单独运行 tests/test_tts.py 验证本机环境。SoVITS 模式下无声音依次检查GPT_SOVITS_URL端口与 docker-compose 的19880:9880映射是否一致、docker-compose up容器是否仍在运行、浏览器能否直接访问该 URL服务端转发超时为 60 秒长句合成超过该时长会失败。网络受限环境使用 EDGE-TTSEdge-TTS 走在线接口无外网连通性时建议改用本地 SoVITS 方案。六、小结GPT-Academic 的 TTS 功能通过一个开关TTS_TYPE 一个统一入口POST /vits实现了两种引擎的可插拔切换追求开箱即用选EDGE_TTS记得系统装有 ffmpeg追求音色可控选LOCAL_SOVITS_API需显卡并部署 SoVITS API 容器。本文介绍的配置步骤均来自 docs/use_tts.md 与 config.py实现细节可在 shared_utils/fastapi_server.py、themes/tts.js 与 tests/test_tts.py 中继续深入验证。【免费下载链接】gpt_academic为GPT/GLM等LLM大语言模型提供实用化交互接口特别优化论文阅读/润色/写作体验模块化设计支持自定义快捷按钮函数插件支持Python和C等项目剖析自译解功能PDF/LaTex论文翻译总结功能支持并行问询多种LLM模型支持chatglm3等本地模型。接入通义千问, deepseekcoder, 讯飞星火, 文心一言, llama2, rwkv, claude2, moss等。项目地址: https://gitcode.com/GitHub_Trending/gp/gpt_academic创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考