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(大多数用户远低于这个数)