Ver código fonte

修改语音对话播放一半跳转下一条对话

丸子 1 mês atrás
pai
commit
cd7c81c019

+ 7 - 1
src/api/tts/useAudioPlayer.js

@@ -119,9 +119,15 @@ export function useAudioPlayer() {
         onPlaybackComplete = callback;
     };
 
+    // 检查是否正在播放
+    const getIsPlaying = () => {
+        return isPlaying;
+    };
+
     return {
         playAudioChunk,
         stopPlayback,
-        setOnPlaybackComplete
+        setOnPlaybackComplete,
+        getIsPlaying
     };
 }

+ 1 - 1
src/views/AIPage/AIGeneralCourse.vue

@@ -131,7 +131,6 @@
           class="small-box"
           v-for="(outlineData, index) in currentCourseData"
           :key="index"
-          @click="goToAIExperience(outlineData)"
         >
           <div
             class="nested-box"
@@ -139,6 +138,7 @@
               backgroundImage: `url(${outlineData.ctTypeImage})`,
               backgroundSize: 'cover'
             }"
+            @click="goToAIExperience(outlineData)"
           ></div>
           <div class="additional-text">
             {{ outlineData.ctTypeSort }} {{ outlineData.ctType }}

+ 13 - 6
src/views/AIPage/aiGenerate/DialogContent.vue

@@ -379,8 +379,11 @@ const togglePlay = () => {
   if (isPlaying.value) {
     // 播放背景音
     playBackgroundAudio()
-    // 开始播放序列
-    playSequence()
+
+    if(!getIsPlaying() || !conversationInProgress.value){
+      // 开始播放序列
+      playSequence()
+    }
   } else {
     // 暂停所有音频
     stopAllAudio()
@@ -790,14 +793,18 @@ const stopStream = async () => {
 // 处理音频播放完成
 const handleAudioPlaybackComplete = () => {
   console.log('智能问答音频播放完成');
-  // AI回答完成后,如果之前是播放状态,继续播放
+
+  // 先清除回调,防止 playNext 内部调用 stopPlayback(false) 时
+  // 关闭 audioContext 触发 source.onended → processAudioQueue → 再次触发回调,造成二次跳转
+  setOnPlaybackComplete(null);
 
   stopAllAudio();
   // 如果处于自动播放状态,继续播放下一条对话
   if (isPlaying.value) {
-    if (playNext()) {
-      // 继续自动播放序列
-      playSequence();
+    // 恢复回调,供下一条 AI 对话使用
+    setOnPlaybackComplete(handleAudioPlaybackComplete);
+    if (playNext(true)) {
+      // playNext 内部已调用 playDialogueAudio(true),无需再调 playSequence
     } else {
       // 播放完毕
       isPlaying.value = false;