Browse Source

修改夺宝奇兵大模型语音,完成同步。

master^2
宋杰 2 days ago
parent
commit
3552f23886
  1. 221
      src/views/AIchat.vue

221
src/views/AIchat.vue

@ -612,13 +612,127 @@ watch(
four: { completed: false, result: null, error: null },
};
//
const audioPreloadStatus = {
one: { loaded: false, url: null },
two: { loaded: false, url: null },
three: { loaded: false, url: null },
four: { loaded: false, url: null }
};
//
const audioQueue = ref([]);
const isPlayingAudio = ref(false);
//
const playNextAudio = () => {
if (audioQueue.value.length === 0 || isPlayingAudio.value) {
return;
}
isPlayingAudio.value = true;
const audioInfo = audioQueue.value.shift();
console.log(`开始播放${audioInfo.name}音频`);
if (audioStore.nowSound) {
audioStore.nowSound.stop();
}
const audio = new Howl({
src: [audioInfo.url],
html5: true,
format: ["mp3", "acc"],
rate: 1.2,
onplay: () => {
audioStore.isPlaying = true;
audioStore.isPaused = false;
console.log(`${audioInfo.name}音频开始播放`);
},
onend: () => {
audioStore.isPlaying = false;
audioStore.isPaused = false;
isPlayingAudio.value = false;
console.log(`${audioInfo.name}音频播放完成`);
//
setTimeout(() => {
playNextAudio();
}, 100);
},
onloaderror: (id, err) => {
console.error(`${audioInfo.name}音频播放失败:`, err);
isPlayingAudio.value = false;
//
setTimeout(() => {
playNextAudio();
}, 100);
}
});
audioStore.nowSound = audio;
audioStore.setAudioInstance(audio);
audio.play();
};
//
const addToAudioQueue = (url, name) => {
if (url && audioStore.isVoiceEnabled) {
audioQueue.value.push({ url, name });
console.log(`音频${name}已添加到播放队列`);
//
if (!isPlayingAudio.value) {
playNextAudio();
}
}
};
//
const preloadAudio = (url, apiKey) => {
if (!url || !audioStore.isVoiceEnabled) {
audioPreloadStatus[apiKey].loaded = true;
return Promise.resolve();
}
return new Promise((resolve) => {
const audio = new Howl({
src: [url],
html5: true,
format: ["mp3", "acc"],
rate: 1.2,
preload: true,
onload: () => {
console.log(`音频${apiKey}预加载完成:`, url);
audioPreloadStatus[apiKey].loaded = true;
audioPreloadStatus[apiKey].url = url;
resolve();
},
onloaderror: (id, err) => {
console.error(`音频${apiKey}预加载失败:`, err);
audioPreloadStatus[apiKey].loaded = true; //
resolve();
}
});
});
};
//
const canStartFirstOutput = () => {
return apiStatus.one.completed && audioPreloadStatus.one.loaded;
};
//
const checkAndExecuteInOrder = () => {
// OneAPI
if (apiStatus.one.completed && !apiStatus.one.executed) {
// OneAPI -
if (canStartFirstOutput() && !apiStatus.one.executed) {
apiStatus.one.executed = true;
if (apiStatus.one.result) {
console.log("执行OneAPI代码:", apiStatus.one.result);
console.log("执行OneAPI代码(文本和音频同步开始):", apiStatus.one.result);
//
if (audioPreloadStatus.one.url) {
addToAudioQueue(audioPreloadStatus.one.url, "第一个");
}
// OneAPI
//
chatStore.messages.pop();
@ -858,6 +972,12 @@ watch(
apiStatus.two.executed = true;
if (apiStatus.two.result) {
console.log("执行TwoAPI代码:", apiStatus.two.result);
//
if (audioPreloadStatus.two.url) {
addToAudioQueue(audioPreloadStatus.two.url, "第二个");
}
// TwoAPI
// 2
addTypingTask(
@ -930,6 +1050,12 @@ watch(
apiStatus.three.executed = true;
if (apiStatus.three.result) {
console.log("执行ThreeAPI代码:", apiStatus.three.result);
//
if (audioPreloadStatus.three.url) {
addToAudioQueue(audioPreloadStatus.three.url, "第三个");
}
// ThreeAPI
// 3-2
addTypingTask(
@ -1073,6 +1199,12 @@ watch(
apiStatus.four.executed = true;
if (apiStatus.four.result) {
console.log("执行FourAPI代码:", apiStatus.four.result);
//
if (audioPreloadStatus.four.url) {
addToAudioQueue(audioPreloadStatus.four.url, "第四个");
}
// FourAPI
// 3-4
addTypingTask(
@ -1177,47 +1309,34 @@ watch(
apiStatus.four.completed &&
apiStatus.four.executed
) {
console.log("所有API已完成,开始收集音频URL");
// URL
console.log("所有API已完成,开始收集预加载的音频URL");
// URL
const audioUrls = [];
console.log("API返回结果检查:");
console.log("result21:", result21);
console.log("result22:", result22);
console.log("result23:", result23);
console.log("result24:", result24);
console.log("预加载音频状态检查:");
console.log("audioPreloadStatus:", audioPreloadStatus);
if (result21?.data?.url) {
console.log("添加result21音频URL:", result21.data.url);
audioUrls.push(result21.data.url.trim());
if (audioPreloadStatus.one.url) {
console.log("添加预加载音频URL one:", audioPreloadStatus.one.url);
audioUrls.push(audioPreloadStatus.one.url);
}
if (result22?.data?.url) {
console.log("添加result22音频URL:", result22.data.url);
audioUrls.push(result22.data.url.trim());
if (audioPreloadStatus.two.url) {
console.log("添加预加载音频URL two:", audioPreloadStatus.two.url);
audioUrls.push(audioPreloadStatus.two.url);
}
if (result23?.data?.url) {
console.log("添加result23音频URL:", result23.data.url);
audioUrls.push(result23.data.url.trim());
if (audioPreloadStatus.three.url) {
console.log("添加预加载音频URL three:", audioPreloadStatus.three.url);
audioUrls.push(audioPreloadStatus.three.url);
}
if (result24?.data?.url) {
console.log("添加result24音频URL:", result24.data.url);
audioUrls.push(result24.data.url.trim());
if (audioPreloadStatus.four.url) {
console.log("添加预加载音频URL four:", audioPreloadStatus.four.url);
audioUrls.push(audioPreloadStatus.four.url);
}
console.log("收集到的音频URLs:", audioUrls);
console.log("收集到的预加载音频URLs:", audioUrls);
console.log("语音是否启用:", audioStore.isVoiceEnabled);
//
if (audioUrls.length > 0 && audioStore.isVoiceEnabled) {
console.log("开始播放音频序列");
playAudioSequence(audioUrls);
} else {
console.log(
"跳过音频播放 - audioUrls长度:",
audioUrls.length,
"语音启用状态:",
audioStore.isVoiceEnabled
);
}
//
console.log("所有接口执行完成,音频已在各接口中单独播放");
}
};
@ -1229,12 +1348,20 @@ watch(
apiStatus.one.completed = true;
apiStatus.one.result = result21;
//
if (result21?.data?.url) {
await preloadAudio(result21.data.url.trim(), 'one');
} else {
audioPreloadStatus.one.loaded = true;
}
//
checkAndExecuteInOrder();
} catch (error) {
console.error("OneAPI失败:", error);
apiStatus.one.completed = true;
apiStatus.one.error = error;
audioPreloadStatus.one.loaded = true; //
// 使
checkAndExecuteInOrder();
}
@ -1248,12 +1375,20 @@ watch(
apiStatus.two.completed = true;
apiStatus.two.result = result22;
//
if (result22?.data?.url) {
await preloadAudio(result22.data.url.trim(), 'two');
} else {
audioPreloadStatus.two.loaded = true;
}
//
checkAndExecuteInOrder();
} catch (error) {
console.error("TwoAPI失败:", error);
apiStatus.two.completed = true;
apiStatus.two.error = error;
audioPreloadStatus.two.loaded = true;
checkAndExecuteInOrder();
}
};
@ -1266,12 +1401,20 @@ watch(
apiStatus.three.completed = true;
apiStatus.three.result = result23;
//
if (result23?.data?.url) {
await preloadAudio(result23.data.url.trim(), 'three');
} else {
audioPreloadStatus.three.loaded = true;
}
//
checkAndExecuteInOrder();
} catch (error) {
console.error("ThreeAPI失败:", error);
apiStatus.three.completed = true;
apiStatus.three.error = error;
audioPreloadStatus.three.loaded = true;
checkAndExecuteInOrder();
}
};
@ -1284,12 +1427,20 @@ watch(
apiStatus.four.completed = true;
apiStatus.four.result = result24;
//
if (result24?.data?.url) {
await preloadAudio(result24.data.url.trim(), 'four');
} else {
audioPreloadStatus.four.loaded = true;
}
//
checkAndExecuteInOrder();
} catch (error) {
console.error("FourAPI失败:", error);
apiStatus.four.completed = true;
apiStatus.four.error = error;
audioPreloadStatus.four.loaded = true;
checkAndExecuteInOrder();
}
};

Loading…
Cancel
Save