diff --git a/src/app.tsx b/src/app.tsx index 6bbd67e..63a93d5 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -14,6 +14,7 @@ export interface ChatStoreMessage extends Message { hide: boolean; token: number; example: boolean; + audio: Blob | null; } export interface TemplateAPI { diff --git a/src/chatbox.tsx b/src/chatbox.tsx index 55328d8..9aa107d 100644 --- a/src/chatbox.tsx +++ b/src/chatbox.tsx @@ -151,6 +151,7 @@ export default function ChatBOX(props: { hide: false, token: responseTokenCount, example: false, + audio: null, }; if (allChunkTool.length > 0) newMsg.tool_calls = allChunkTool; @@ -205,6 +206,7 @@ export default function ChatBOX(props: { token: data.usage.completion_tokens ?? calculate_token_length(msg.content), example: false, + audio: null, }); setShowGenerating(false); }; @@ -300,6 +302,7 @@ export default function ChatBOX(props: { hide: false, token: calculate_token_length(inputMsg.trim()), example: false, + audio: null, }); // manually calculate token length @@ -975,6 +978,7 @@ export default function ChatBOX(props: { calculate_token_length(images), hide: false, example: false, + audio: null, }); update_total_tokens(); setInputMsg(""); @@ -1068,6 +1072,7 @@ export default function ChatBOX(props: { token: calculate_token_length(newToolContent), hide: false, example: false, + audio: null, }); update_total_tokens(); setChatStore({ ...chatStore }); diff --git a/src/message.tsx b/src/message.tsx index a592fd8..681482d 100644 --- a/src/message.tsx +++ b/src/message.tsx @@ -3,7 +3,7 @@ import { useState, useEffect, StateUpdater } from "preact/hooks"; import { ChatStore, ChatStoreMessage } from "./app"; import { calculate_token_length, getMessageText } from "./chatgpt"; import Markdown from "preact-markdown"; -import TTSButton from "./tts"; +import TTSButton, { TTSPlay } from "./tts"; import { MessageHide } from "./messageHide"; import { MessageDetail } from "./messageDetail"; import { MessageToolCall } from "./messageToolCall"; @@ -130,13 +130,18 @@ export default function Message(props: Props) { )}
+
{chatStore.tts_api && chatStore.tts_key && ( )} diff --git a/src/tts.tsx b/src/tts.tsx index ae11fb5..7b6d9b4 100644 --- a/src/tts.tsx +++ b/src/tts.tsx @@ -1,10 +1,18 @@ import { useState } from "preact/hooks"; -import { ChatStore, addTotalCost } from "./app"; +import { ChatStore, ChatStoreMessage, addTotalCost } from "./app"; +import { Message, getMessageText } from "./chatgpt"; interface TTSProps { chatStore: ChatStore; + chat: ChatStoreMessage; setChatStore: (cs: ChatStore) => void; - text: string; +} +export function TTSPlay(props: TTSProps) { + if (props.chat.audio instanceof Blob) { + const url = URL.createObjectURL(props.chat.audio); + return