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 的契约不支持该种条件输入;失败时回退至预设音色朗读,以保证主流程可演示。

术语与注释

  1. Flask:Python WSGI Web 框架,把 URL 映射到视图函数,处理 HTTP 并返回 HTML 或文件流,适合中小型站点与单进程部署。
  2. Jinja2:服务端模板引擎,在服务器上将数据填入 HTML 模板后再发给浏览器,与静态资源分离。
  3. OpenAI TTS:通过 HTTPS 调用云端文本转语音接口,请求中带文本与音色等参数,响应为音频;需 API 密钥与网络。
  4. python-pptx:读写 .pptx 的 Python 库,可遍历幻灯片与形状,抽取文本框内容。
  5. Bootstrap:前端 CSS/JS 组件库,提供栅格与表单样式,加速页面搭建。
  6. localStorage:浏览器提供的同源持久键值存储,用于在无登录时保存用户偏好(如当前音色)。