Преглед изворни кода

feat: auto-play AI replies via useAudioPlayer

Watch engine.messages for AI messages reaching status='done'
and dispatch them to player.play once each. A per-component
Set<string> deduplicates so unrelated reactive churn does not
re-trigger playback.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
jimmylee пре 2 недеља
родитељ
комит
ba1192a0d7
1 измењених фајлова са 20 додато и 0 уклоњено
  1. 20 0
      src/views/Editor/EnglishSpeaking/preview/DialogueChatView.vue

+ 20 - 0
src/views/Editor/EnglishSpeaking/preview/DialogueChatView.vue

@@ -815,6 +815,26 @@ watch(
   },
 )
 
+// 自动播放:AI 消息流式 done 后,合成并播一次。
+// 用 Set 去重防止 watcher 因为不相关重渲染重复触发。
+const autoPlayedIds = new Set<string>()
+watch(
+  () => engine.messages.value.map(m => `${m.id}:${m.status}`).join('|'),
+  () => {
+    for (const m of engine.messages.value) {
+      if (
+        m.role === 'ai' &&
+        m.status === 'done' &&
+        m.content &&
+        !autoPlayedIds.has(m.id)
+      ) {
+        autoPlayedIds.add(m.id)
+        player.play(m.id, { kind: 'tts', text: m.content })
+      }
+    }
+  },
+)
+
 // AI 消息 done 后,延迟 600ms 显示 "在等你的回答..."
 watch(
   () => {