



























@@ -62,52 +62,62 @@ async function main() {
6262},
6363};
646465-const blockText = "WebChat block replies should synthesize audio for auto TTS.";
65+const accumulatedBlockText =
66+"WebChat streams block text; dispatch synthesizes one TTS tail with kind final.";
6667const blockResult = await maybeApplyTtsToPayload({
67-payload: { text: blockText },
68+payload: { text: accumulatedBlockText },
6869 cfg,
6970channel: "webchat",
7071kind: "block",
7172});
7273console.log("maybeApplyTtsToPayload(kind=block).mediaUrl =", blockResult.mediaUrl ?? "(none)");
73-console.log(
74-"maybeApplyTtsToPayload(kind=block).trustedLocalMedia =",
75-blockResult.trustedLocalMedia ?? false,
76-);
777478-const toolResult = await maybeApplyTtsToPayload({
79-payload: { text: "Intermediate tool output should not be spoken." },
75+const tailResult = await maybeApplyTtsToPayload({
76+payload: { text: accumulatedBlockText },
8077 cfg,
8178channel: "webchat",
82-kind: "tool",
79+kind: "final",
8380});
84-console.log("maybeApplyTtsToPayload(kind=tool).mediaUrl =", toolResult.mediaUrl ?? "(none)");
81+console.log("maybeApplyTtsToPayload(kind=final).mediaUrl =", tailResult.mediaUrl ?? "(none)");
82+console.log(
83+"maybeApplyTtsToPayload(kind=final).trustedLocalMedia =",
84+tailResult.trustedLocalMedia ?? false,
85+);
858686-const mediaPath = blockResult.mediaUrl;
87+const mediaPath = tailResult.mediaUrl;
8788if (!mediaPath || !fs.existsSync(mediaPath)) {
88-throw new Error("expected block TTS to write a local media file");
89+throw new Error("expected final-mode tail TTS to write a local media file");
8990}
90-const localRoots = [path.dirname(mediaPath)];
91-const trustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads(
92-[{ mediaUrl: mediaPath, trustedLocalMedia: true }],
93-{ localRoots },
91+92+const ttsOnlyPayload = {
93+mediaUrl: tailResult.mediaUrl,
94+audioAsVoice: tailResult.audioAsVoice,
95+spokenText: accumulatedBlockText,
96+trustedLocalMedia: tailResult.trustedLocalMedia,
97+};
98+console.log(
99+"dispatch ttsOnlyPayload.trustedLocalMedia =",
100+ttsOnlyPayload.trustedLocalMedia ?? false,
94101);
102+103+const localRoots = [path.dirname(mediaPath)];
104+const trustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads([ttsOnlyPayload], {
105+ localRoots,
106+});
95107const untrustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads(
96108[{ mediaUrl: mediaPath }],
97109{ localRoots },
98110);
99111console.log(
100-"buildWebchatAudioContentBlocksFromReplyPayloads(trustedLocalMedia=true).length =",
112+"buildWebchatAudioContentBlocksFromReplyPayloads(ttsOnlyPayload).length =",
101113trustedBlocks.length,
102114);
103115console.log(
104-"buildWebchatAudioContentBlocksFromReplyPayloads(trustedLocalMedia missing).length =",
116+"buildWebchatAudioContentBlocksFromReplyPayloads(untrusted).length =",
105117untrustedBlocks.length,
106118);
107119108-if (blockResult.mediaUrl) {
109-fs.rmSync(path.dirname(blockResult.mediaUrl), { recursive: true, force: true });
110-}
120+fs.rmSync(path.dirname(mediaPath), { recursive: true, force: true });
111121try {
112122fs.unlinkSync(prefsPath);
113123} catch {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。