雅思口语陪练 App(IELTS Speaking Coach)
一款专注于「地道表达 + 智能纠错」的雅思口语备考应用,基于 Tauri 2 跨平台开发,可运行在 Android / iOS / 桌面。
区别于传统背单词软件,它的核心目标不是记忆孤立词汇,而是帮你掌握口语中常用、地道、且自身容易出错的短语和完整句子——通过「实战练习 + AI 纠错 + 素材沉淀」形成闭环,持续提升表达准确度与流利度。
功能特性
1. 题库浏览与选题

内置 980 道雅思口语真题(Part 1:432 题 / Part 2:201 题 / Part 3:347 题),覆盖 16 个高频话题(Hometown、Education、Work or Studies、Food、Travel、Technology、Environment 等),并带「旧题 / 新题 / 必考 / 高频」标签与难度档位,方便按需选题进入练习。
2. 录音与语音转写(支持手动干预)

- 录音:WebView 内
getUserMedia+ PCM→WAV,无需原生录音插件。 - 转写:调用 Stepfun
stepaudio-2.5-asr(SSE 流式),实时返回识别结果。 - 可任意编辑转写结果,也可跳过录音、直接手动输入英文回答。
3. AI 智能纠错与优化


调用推理模型(默认 Stepfun step-3.7-flash,可切换任意 OpenAI 兼容厂商)完成:
- 四维评分:流利度 FC / 语法 GA / 词汇 LR / 发音 PR,含预估总分与主要短板;
- 语法纠错 + 表达优化:逐条指出错误 / 给出更地道的替换,并自动生成复习卡片;
- 高分润色:温和升级你的回答为高分范文;
- 诊断与建议:中式英语问题、跑题检测、Part 2 要点覆盖检查、改进建议。
4. 卡片式错题收藏

纠错点自动生成复习卡片,支持按话题 / 类型 / Part / 掌握度筛选、标记掌握程度、离线复习、导出 Markdown 笔记。
5. 素材库(地道表达沉淀)

一句话 / 一段话的地道表达统一入库管理,支持五种类型:句子 sentence、段落 passage、短语 phrase、词汇 vocab、观点 idea。录入方式有四种:
| 方式 | 说明 |
|---|---|
| 手动录入 | 表单填写 topic / type / 英文 / 中文 / 亮点 / 贴士 |
| 规范 MD 导入 | 按《素材记录规范》写的 Markdown,本地确定性解析,免费零误差 |
| AI 智能提取 | 粘贴任意自由文本,AI 自动提取成结构化素材 |
| 纠错自动沉淀 | 练习纠错产出的「表达优化」自动作为素材候选入库 |
素材格式规范见 素材记录规范.md。
6. 快捷翻译

输入一句英语(或中文),AI 自动改写为地道的雅思口语表达,附带中文释义、话题归类、关键表达与用法贴士,并直接收入素材库。
7. 历史记录

每次完成 AI 点评后,回答与完整点评结果自动保存,支持按题目关键词检索、回看自己过往表现、追踪每道题的练习次数。
8. 数据备份 / 恢复

素材库、复习卡片、历史记录可整体导出为 JSON 文本(复制后跨设备粘贴导入)或 .json 文件,实现手机与电脑之间的数据同步。
9. 双语界面

内置中文 / English 双语,支持「跟随系统」自动切换,界面与 AI 回复语言可分别配置。
10. 自动检查更新
Android 端启动时静默检测 GitHub 发布的最新版本,有新版本则弹出横幅提示下载(基于 Netlify 公开分发 + latest.json)。
技术栈
| 层 | 技术 |
|---|---|
| 跨平台框架 | Tauri 2(Android / iOS / 桌面) |
| 前端 | React 18 + TypeScript + Vite |
| 后端 | Rust(reqwest + rusqlite) |
| 本地存储 | SQLite(卡片 / 素材 / 历史记录离线可用) |
| 语音识别 | Stepfun stepaudio-2.5-asr(POST /step_plan/v1/audio/asr/sse,SSE 流式) |
| 推理纠错 | 默认 Stepfun step-3.7-flash(OpenAI 兼容,可切换 DeepSeek / Kimi / OpenAI 等) |
| 应用插件 | tauri-plugin-dialog / fs / opener |
| 自动更新 | Netlify 公开分发 + latest.json 版本检测 |
目录结构
ielts-speaking-app/
├── src/ # 前端源码
│ ├── data/questionBank.ts # 内置题库(980 题,Part 1/2/3)
│ ├── lib/audio.ts # 录音 + PCM→WAV + 波形
│ ├── lib/api.ts # Tauri invoke 封装
│ ├── lib/updater.ts # Android 自动更新检测(Netlify latest.json)
│ ├── i18n/ # 中英文双语字典
│ ├── components/ # 界面组件(题库/练习/纠错/素材/翻译/复习/历史/设置)
│ └── App.tsx
├── src-tauri/
│ ├── src/commands/ # Rust 命令:asr / correct / translate / cards / materials / history / backup / config
│ ├── src/config.rs # API 密钥安全读取
│ ├── src/db.rs # SQLite 初始化
│ ├── tauri.conf.json
│ └── icons/ # 应用图标
├── scripts/
│ ├── gen_icon.py # 图标生成脚本(Pillow)
│ ├── import_materials_data.py # 素材数据批量导入脚本
│ ├── patch-android-manifest.mjs # Android 补丁:麦克风权限 + 软键盘 adjustResize
│ ├── patch-android-signing.mjs # Android 签名配置补丁
│ └── patch-ios-info-plist.mjs # iOS 麦克风权限补丁
├── 素材记录规范.md # 素材库 Markdown 格式规范
└── .github/workflows/ # CI:build-android / build-ios / release / keystore
环境准备
- Node.js ≥ 20
- Rust 工具链(stable)
- Tauri 系统依赖(见 Tauri 官方前置要求)
- Android:JDK 17 + Android SDK(
tauri android会引导) - iOS(仅 macOS):Xcode
本地开发
npm install
# 生成完整图标集(含 Android / iOS)
npx tauri icon src-tauri/app-icon.png
# 桌面端调试
npm run tauri dev
# 移动端调试(需先初始化对应平台)
npm run tauri android init
npm run tauri android dev
npm run tauri ios init
npm run tauri ios dev
API 密钥配置(重要)
密钥绝不硬编码在源代码中,按以下优先级加载:
- App「设置」页手动填入(推荐移动端使用,写入本地应用配置目录,仅本机可读)
- 运行期环境变量
STEPFUN_API_KEY(桌面端开发) - 构建期环境变量
STEPFUN_API_KEY(CI 构建时注入,通过option_env!编译进二进制)
# 桌面端本地调试
export STEPFUN_API_KEY="你的密钥"
npm run tauri dev
也可参考
.env.example。不要把真实密钥提交到仓库。
打包构建
本地
# 桌面
npm run tauri build
# Android APK
node scripts/patch-android-manifest.mjs # 若为首次 init
npm run tauri android build
# iOS
npm run tauri ios build
GitHub Actions(自动构建)
- Android release(
.github/workflows/release.yml):打v*tag 触发,构建 arm64 release APK 并部署到 Netlify 公开站点,同时生成latest.json供 App 端检测更新。 - Android CI(
.github/workflows/build-android.yml):推送代码触发,产出已签名 release APK 作为 Artifact。 - iOS(
.github/workflows/build-ios.yml):在 macOS runner 上编译(simulator 目标,无需签名)。
配置 Secret
打开仓库 Settings → Secrets and variables → Actions,按需添加:
| Secret | 用途 |
|---|---|
STEPFUN_API_KEY | 构建期注入(可选,不注入则用户在 App 设置页手动填写) |
ANDROID_RELEASE_KEYSTORE_BASE64 / _PASSWORD / KEY_ALIAS / KEY_PASSWORD | 正式 release 签名 |
ANDROID_DEBUG_KEYSTORE_BASE64 | 降级签名兜底 |
NETLIFY_AUTH_TOKEN / NETLIFY_SITE_ID / NETLIFY_SITE_URL | 自动更新分发 |
Android 签名(release keystore)
Android 构建默认产出 release APK(配合 Cargo.toml 的 [profile.release] 体积优化,从约 170MB 降到约 30MB)。签名方式:
- 推荐(正式签名):手动触发
Generate Android release keystore工作流,一次性生成固定 release keystore,把日志打印的 4 个值存为 Secrets。 - 降级(未配置时):自动回退用固定的 debug keystore 签名,同样可安装、可覆盖升级,只是不适合上架商店。
⚠️ release keystore 务必妥善保存,丢失后无法对已发布包做升级签名。
iOS 签名(正式 IPA)
iOS 可分发安装包必须使用 Apple Developer 证书与描述文件签名,无法在无账号的情况下自动化。建议使用 fastlane match 或在工作流中配置 APPLE_CERTIFICATE、APPLE_PROVISION_PROFILE 等 Secrets 完成签名。
Stepfun API 说明
- 语音识别:
POST {base}/step_plan/v1/audio/asr/sse,Content-Type: application/json、Accept: text/event-stream,音频 base64 + WAV 格式,服务端流式返回transcript.text.delta/transcript.text.done/error事件。 - 推理模型:
POST {base}/step_plan/v1/chat/completions,OpenAI 兼容,支持reasoning_effort(low/medium/high)。 base默认https://api.stepfun.com,可用环境变量STEPFUN_BASE_URL覆盖(海外https://api.stepfun.ai)。
可调环境变量:
| 变量 | 默认值 | 说明 |
|---|---|---|
STEPFUN_API_KEY | - | API 密钥 |
STEPFUN_BASE_URL | https://api.stepfun.com | API 基础地址 |
STEPFUN_ASR_MODEL | stepaudio-2.5-asr | 语音识别模型 |
STEPFUN_LLM_MODEL | step-3.7-flash | 推理模型 |
STEPFUN_REASONING_EFFORT | medium | 推理强度 |
说明与注意事项
- 录音采用 WebView 内
getUserMedia+ PCM→WAV,无需原生录音插件,兼容 Android WebView / iOS WKWebView。 - 纠错提示词内置了个人偏好:流利度优先、避免中式英语,以及内容黑名单(不用 teacher / 猫狗熊猫 / 春节等示例)。
- 语音识别语言默认
en(雅思口语为英文作答),如需中文可在PracticeView.tsx中修改ASR_LANGUAGE。 - 界面与 AI 回复语言可在「设置 → 语言」切换(中文 / English / 跟随系统)。
