Dev Spec v2 · ← 返回文档首页
05 口语关卡与记忆
1. 通用流程
前端录音(MediaRecorder,使用浏览器默认格式,通常为 48kHz 的 Opus / AAC,**不要求前端指定采样率**;前端用音量检测,静音 1.2 秒自动结束;最长 20 秒)
→ 服务器端统一转码为 16kHz 单声道 PCM,再交给识别和评分
→ 上传(直接 POST 小文件,不走对象存储预签名)
→ 网关.stt(词级时间戳,语言 = 目标语言)
→ 按关卡类型处理(下文)
→ 返回结果 + 下一个节点
延迟预算(P95 ≤ 2.5 秒):上传 0.3 秒 + 识别 0.8 秒 + 判断 0.8 秒 + 回复配音 0.5 秒。自由回答的回复配音采用流式合成,首个音频块到达就开始播放。
2. 跟读 repeat
发音评分依赖
网关.pron_score。第 11 周前确认可用的日语(海外)和英语(国内,已备案)供应商;没有合适供应商时启用底座网关文档中的备选算法,此时界面只显示"很好 / 还不错 / 再试一次"三档,不显示具体分数和问题音素。
| 步骤 | 说明 |
|---|---|
| 发音评分 | 网关.pron_score(audio, target_text):整句分、逐词分、问题音素 |
| 判定 | 整句分 ≥ 60 通过;否则可以再试(最多 3 次),第 3 次无论如何都放行(不卡剧情) |
| 反馈 | 标出分数最低的 1~2 个词,并可以点击播放标准发音 |
3. 选择说出 choice
| 步骤 | 说明 |
|---|---|
| 匹配 | 识别结果分别与每个选项计算相似度(按读音而不是字面:日语转成假名后比较,英语用音素或模糊匹配) |
| 判定 | 最高相似度 ≥ 0.6 且比第二名高 0.15 → 选中该项;否则让用户再说一次,第 2 次仍不明确时显示按钮让用户点选 |
| 成本 | 不调用大模型 |
4. 自由回答 free
一次小模型调用,要求结构化输出:
{
"understood": true,
"on_topic": true,
"used_pattern": false,
"correction": {"original": "週末は映画を見る", "better": "週末は映画を見ます", "why_en": "polite form"},
"reply": "映画いいね!何を見るの?",
"memory": [{"key": "hobby", "value": "movies", "confidence": 0.9}],
"safety_flag": null
}
| 字段 | 用法 |
|---|---|
understood=false |
角色用预设的话请用户再说一次,并提供提示按钮 |
reply |
角色的回应(1~2 句,受难度约束),流式配音后播放 |
correction |
以小卡片形式显示,不打断剧情 |
memory |
置信度 ≥ 0.8 时写入记忆 |
safety_flag |
非空时进入危机处理(第 8 节),剧情暂停 |
提示词结构:固定的系统提示(角色卡 + 边界 + 难度 + 输出格式,放在最前面以利用提示词缓存)+ 当前场景摘要 + 用户记忆(≤ 10 条)+ 本题要求 + 用户的话。
成本约 $0.003~0.005 / 次(小模型 + 短配音)。
5. 提示
| 级别 | 内容 |
|---|---|
| 1 | 关键词(2~3 个) |
| 2 | 完整示范句(可以播放) |
使用提示会记录在 attempts.hint_level 中,用于判断关卡难度是否合适。
6. 记忆
| 项 | 规则 |
|---|---|
| 来源 | 只从自由回答的结构化输出中抽取;不从其他地方推断 |
| 允许的键 | name、hobby、goal(学习目的)、job_or_school、favorite_food、pet、hometown_region(只到地区一级)等白名单字段 |
| 禁止 | 健康、宗教、政治、性取向、精确住址、联系方式等敏感信息不存储(大模型输出了也丢弃) |
| 使用 | 下一集开场白、角色消息、自由回答时的上下文 |
| 可见 | 用户在设置里可以查看和删除全部记忆 |
| 正确性 | 引用前检查置信度;同一个键有新值时覆盖 |
7. 角色消息(P2)
- 看完一集后生成 1~2 条,安排在第二天用户通常活跃的时间发送(网页推送或邮件)
- 内容:与剧情相关("明天店里有新品")或引用记忆("你说周末去看电影,看了什么?")
- 用户可以用语音回复 → 按自由回答处理 → 回复会在下一集开场时被提到
- 约束:不制造焦虑(不说"你不来我会难过"这类话);每周总数有上限;可以关闭
8. 安全与合规
| 场景 | 处理 |
|---|---|
| 年龄 | 首次进入时询问出生年份;< 13 岁不可用;13~17 岁不开放自由对话和角色消息的语音回复,内容过滤更严格 |
| AI 提示 | 播放器顶部始终显示"AI 角色"标识;首次进入时明确告知 |
| 休息提醒 | 连续使用 3 小时(国内 2 小时)→ 弹窗提醒,角色也会说一句"休息一下吧" |
| 危机处理 | 识别到自伤、自杀相关表达(关键词 + 大模型判断双重检测)→ 暂停剧情 → 显示用户所在地区的求助热线 → 记录(脱敏)→ 之后的剧情不会提起这件事。学习者情绪激动时往往说母语:每段录音先做语种识别,识别为非目标语言时,再用界面语言重新转写,并对两种转写结果都做危机检测 |
| 内容安全 | 用户的话和模型的回复都要检查;回复不通过时改用 fallback_line |
| 国内 | 生成式 AI 登记;遵守拟人化互动服务的规定:未成年人模式、2 小时提醒、不诱导沉迷 |
9. 自由对话(Pro,P2)
- 与剧情中的某个角色进行开放对话,话题由用户决定(系统提示仍然限定角色边界)
- 级联方式:录音 → 语音识别 → 大模型(带记忆,限制回复长度)→ 流式配音
- 公平使用:每天 30 分钟(
talktale.usage.freetalk_seconds);达到上限后角色自然地结束对话 - 成本约 $0.005/分钟,Pro 用户每月最多约 $4.5(大多数用户远低于这个数)