Teachtone
做什么
本页先说明产品功能,再按 Flask¹ 服务端、Jinja2² 模板、用户操作与接口、语音合成、课件解析、前端的顺序展开。
Teachtone 面向教学:文稿合成语音、管理声音样本、从 PowerPoint 取可读文本并按页配音,将课件与音频打成 zip 下载,形成「有声课件」。
成果
第十六届中国大学生服务外包创新创业大赛全国赛三等奖;并就本作品申请软件著作权一项。
后端:Flask
Flask 将 URL 路由到视图函数,处理 HTTP 请求(GET 展示、POST 表单与上传),返回 HTML 或文件流。轻量、适合单进程内同时渲染页面与业务逻辑;本项目将朗读、上传、打包放在同一应用上下文。
页面怎么生成:Jinja2
Jinja2 在服务端把上下文数据填入模板占位符与逻辑标签,渲染完整 HTML 返回;静态资源与模板解耦。
用户操作和后台在干什么
功能路径包括:提交文本触发 TTS、上传或浏览器录制音频样本、上传整份 PPT 触发按页合成与打包。服务端对上传体积设限,防止单次请求占用过多内存与磁盘;生成物通过可下载 URL 返回,由浏览器播放或保存。
朗读:OpenAI 云端语音
语音合成走 OpenAI TTS³:HTTPS 请求体中带文本与模型、音色、语速等参数,响应为音频;依赖网络与按量计费。需代理时可配 SDK 代理端点,契约不变。
课件:读 PPT、按页配音
课件用 python-pptx⁴ 按页读文本框,拼脚本后逐页调 TTS;页数与调用次数线性相关。最终 pptx 与音频写入 zip。 限制:主要识别标准文本框;文字在图里或备注区需另处理。
页面上怎么用:Bootstrap 与浏览器能力
前端用 Bootstrap⁵ 搭布局与表单。录音用 MediaRecorder / getUserMedia,multipart 上传。选中音色存 localStorage⁶,无账号时维持偏好。
「像我的声音」与失败时的退路
曾尝试基于用户上传样本做声线引导,但当时公开语音 API 的契约不支持该种条件输入;失败时回退至预设音色朗读,以保证主流程可演示。
术语与注释
- Flask:Python WSGI Web 框架,把 URL 映射到视图函数,处理 HTTP 并返回 HTML 或文件流,适合中小型站点与单进程部署。
- Jinja2:服务端模板引擎,在服务器上将数据填入 HTML 模板后再发给浏览器,与静态资源分离。
- OpenAI TTS:通过 HTTPS 调用云端文本转语音接口,请求中带文本与音色等参数,响应为音频;需 API 密钥与网络。
- python-pptx:读写 .pptx 的 Python 库,可遍历幻灯片与形状,抽取文本框内容。
- Bootstrap:前端 CSS/JS 组件库,提供栅格与表单样式,加速页面搭建。
- localStorage:浏览器提供的同源持久键值存储,用于在无登录时保存用户偏好(如当前音色)。