admin
|
ab3af277c1
|
fix(speech): convert base64 TTS data URI before playback per platform
后端 TTS 以 data: URI 返回 base64 mp3(生产实证为合法 LAME mp3),但
App-Plus 的 InnerAudioContext 不支持 data: URI,iOS Safari/微信 webview
也常静默失败,统一报"语音播放失败"。播放前按平台转换:H5 转 Blob URL,
App 端经 plus.io 落 _doc/ 临时文件后播放 file:// 路径,播完清理;Blob 不可
用时退回原始 data: URI。竞态守卫与缓存语义保持不变,158 单测全绿。
|
2026-07-25 20:37:30 +08:00 |
|
admin
|
474d46e728
|
feat(speech): add qwen tts voice preferences
|
2026-07-24 01:54:37 +08:00 |
|
admin
|
067cc30d80
|
feat(aihr): complete M3 protected practice replay
|
2026-07-23 22:21:43 +08:00 |
|
admin
|
927458b9e0
|
feat(aihr): harden M0-M2 mobile training flows
|
2026-07-23 21:18:13 +08:00 |
|
admin
|
0f5c2e8667
|
feat(mobile-app): prepare native app packaging
|
2026-07-23 14:40:23 +08:00 |
|
admin
|
9210b7dde6
|
feat(speech): switch mentor voice to anna and slow warm speed to 0.88
diana auditioned too bright for the mentor persona; anna measures
steadier (median F0 220Hz, lowest variance) in production auditions.
|
2026-07-19 03:01:48 +08:00 |
|
admin
|
4c2b5deb00
|
feat(mobile): redesign today home and switch mentor persona to female
- today: immersive community hero + hold-to-talk voice card, numbered
schedule rows, common-functions grid (learning/report/question-board)
- login: female mentor bust; sop: female mentor chat avatars
- speech: raise browser-fallback mentor pitch to match female voice
|
2026-07-19 02:38:18 +08:00 |
|
admin
|
68d5600534
|
feat(speech): add role-aware emotional TTS profiles
|
2026-07-18 18:27:14 +08:00 |
|
 adminandClaude Fable 5
|
f7eff14342
|
feat(mobile): voice-first master replies with WeChat-style unread dot and 转文字
客户 2026-07-18 追加要求:师傅回复先以语音消息呈现(微信式),
未读带红点,点击播放,可选「转文字」展开全文;同时优化长文刷屏布局。
speech.ts:
- 播放控制器新增 preload(text):预合成 TTS 并写入源缓存(不播放),
供语音气泡在首次点击前显示时长;失败返回 null
- 新增 measureAudioDuration(source):经 metadata 探测音频秒长(8s 超时兜底)
sop/index.vue:
- MasterMsg 增加 voiceStatus(preparing/ready/unavailable)/voiceDuration/
unread/transcriptOpen
- 答案到达即后台预合成语音(说话内容=直接答案 answer 字段),
就绪后气泡显示「🔊 N"」+未读红点;点击播放(再点停止,播放态变色),
播放即清红点;「转文字」灰 chip 展开完整结构化内容
(要点/提醒/引用/总结卡/反馈),微信同款交互
- TTS 不可用或答案为空时自动回退为纯文本气泡(播报按钮保留),
训练概况等数据型回复直接文本呈现
- 布局优化:头部压缩,长文默认收进「转文字」,线程不再整段刷屏
验证:
- 本地:时长 13" 真实测得、红点播放后消失、转文字展开全文,3 张截图目检
- 生产冒烟:语音气泡+时长+红点+转文字 chip 全部就位
- H5 已发布(备份 h5-before-20260718045801)
说明:每条答案一次 TTS 合成调用(有缓存),试点量级成本可忽略;
练页会话化(批次二)将复用同一套语音气泡形态。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-18 04:59:11 +08:00 |
|
 adminandClaude Fable 5
|
a4bbfc2222
|
fix: stop snowflake ossId precision loss and daily-drill audio identity mismatch
线上现象:对练页录音转写后提交回应,报「录音不属于当前账号,请重新录音后提交」。
根因A(前端,截图直接原因):OSS 编号是雪花 ID(如 2078204068457525249),
超出 JS Number 安全整数范围,后端按 RuoYi 规范序列化为字符串,但前端 4 处
用 Number() 强转(对练 ASR、每日题 ASR、每日题恢复列表、候选人面试 ASR),
精度丢失成 …5200,后端按错误 oss_id 查归属 COUNT=0 → 误报。
生产铁证:同一暂存行,正确 id 查得 1 行,JS 强转后的 id 查得 0 行;
用损坏 id 提交 turn 复现原报错,用字符串正确 id 提交成功。
修复A:speech.ts 新增 normalizeOssId(纯字符串校验透传,禁止 Number 强转),
4 处调用点改为字符串保存,practice/candidate 服务签名与状态类型放宽为
number|string(types/api.ts 本就是 number|string,Jackson 字符串转 Long 无损)。
根因B(后端,潜伏):answerDailyDrill 用组织 extPartyId(如 1003)做录音
归属身份校验,而暂存写入的是登录手机号——每日题语音提交必失败。
修复B:新增 validateAudioOwnershipByUser,按服务端登录 owner_user_id
(与暂存同源、不可伪造)校验,对练路径(身份一致)保持原校验不变。
发布与验证:
- H5 已发布(备份 /opt/wygj/backups/h5-before-20260718035416)
- 后端 jar 已发布重启(备份 /opt/wygj/app/ruoyi-admin.jar.bak-20260718035552),
15s 恢复,重启后对练 turn+字符串 ossId 生产复核通过
- 每日题语音路径为逻辑级+数据级验证(该账号今日无待训练每日题,
业务级复验待下一次每日题窗口)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
2026-07-18 03:57:47 +08:00 |
|
admin
|
6bdc86e3fc
|
feat: restore learning feedback and knowledge capabilities
|
2026-07-18 00:50:11 +08:00 |
|
admin
|
4ef388873b
|
feat(mobile): add voice transcription to practice
|
2026-07-09 13:41:48 +08:00 |
|