From 0bf6303a17228f7cedcc3223d83c5038ad5e13b5 Mon Sep 17 00:00:00 2001 From: Jay Zen Date: Thu, 11 Jun 2026 17:31:23 +0800 Subject: [PATCH 1/2] feat(webchat): add voice reply (TTS) support to ChatUI Add a per-client "Voice Reply" toggle to ChatUI. When enabled, the chat route persists the preference as the session's TTS state, disables streaming so the result-decorate stage can synthesize audio, and emits a tts_notice SSE event when TTS was requested but cannot run so the client can show a localized hint. Backend: - Pass the Record component's text caption through the webchat queue so the UI can render a transcript under the audio bubble. - Mirror the result-decorate stage's trigger_probability in the route's TTS gate: probability 0 keeps streaming instead of waiting for audio that will never be synthesized. - Resolve TTS (and emit tts_notice) for non-streaming requests too, not only when streaming was requested. - Attach trailing agent_stats/refs to the previously saved record instead of inserting an empty bubble; fall back to a metadata-only record when there is nothing to attach to. - Return the built content from _save_bot_message so flush no longer rebuilds it; skip the session TTS state write when unchanged. - Reuse _build_webchat_umo for thread UMOs. Frontend: - New AudioMessagePart player with waveform, seek (pointer + keyboard), caption, and autoplay for freshly streamed voice replies. Waveform decoding is lazy (first playback) and shares a single AudioContext so loading a history full of voice messages does not fetch every clip. - Map all tts_notice codes to localized toasts with a generic fallback (en-US / zh-CN / ru-RU). Co-Authored-By: Claude Fable 5 --- .../platform/sources/webchat/webchat_event.py | 1 + astrbot/core/star/session_llm_manager.py | 2 + astrbot/dashboard/routes/chat.py | 124 +++++- astrbot/dashboard/routes/open_api.py | 2 +- .../mdi-subset/materialdesignicons-subset.css | 6 +- .../materialdesignicons-webfont-subset.woff | Bin 19304 -> 19392 bytes .../materialdesignicons-webfont-subset.woff2 | Bin 15560 -> 15584 bytes dashboard/src/components/chat/Chat.vue | 39 ++ .../src/components/chat/ChatMessageList.vue | 8 +- dashboard/src/components/chat/MessageList.vue | 8 +- .../src/components/chat/StandaloneChat.vue | 8 +- .../message_list_comps/AudioMessagePart.vue | 396 ++++++++++++++++++ dashboard/src/composables/useMessages.ts | 22 + .../src/i18n/locales/en-US/features/chat.json | 7 + .../src/i18n/locales/ru-RU/features/chat.json | 7 + .../src/i18n/locales/zh-CN/features/chat.json | 7 + tests/test_webchat_tts_replies.py | 140 +++++++ 17 files changed, 757 insertions(+), 20 deletions(-) create mode 100644 dashboard/src/components/chat/message_list_comps/AudioMessagePart.vue create mode 100644 tests/test_webchat_tts_replies.py diff --git a/astrbot/core/platform/sources/webchat/webchat_event.py b/astrbot/core/platform/sources/webchat/webchat_event.py index bc1e1a6bcd..0a458c4a23 100644 --- a/astrbot/core/platform/sources/webchat/webchat_event.py +++ b/astrbot/core/platform/sources/webchat/webchat_event.py @@ -104,6 +104,7 @@ async def _send( { "type": "record", "data": data, + "text": comp.text, "streaming": streaming, "message_id": message_id, }, diff --git a/astrbot/core/star/session_llm_manager.py b/astrbot/core/star/session_llm_manager.py index ad4a473b47..b16c99ab73 100644 --- a/astrbot/core/star/session_llm_manager.py +++ b/astrbot/core/star/session_llm_manager.py @@ -127,6 +127,8 @@ async def set_tts_status_for_session(session_id: str, enabled: bool) -> None: ) or {} ) + if session_config.get("tts_enabled") is enabled: + return session_config["tts_enabled"] = enabled await sp.put_async( scope="umo", diff --git a/astrbot/dashboard/routes/chat.py b/astrbot/dashboard/routes/chat.py index 5ff1913b9e..dc34eb36b7 100644 --- a/astrbot/dashboard/routes/chat.py +++ b/astrbot/dashboard/routes/chat.py @@ -23,6 +23,8 @@ webchat_message_parts_have_content, ) from astrbot.core.platform.sources.webchat.webchat_queue_mgr import webchat_queue_mgr +from astrbot.core.provider.entities import ProviderType +from astrbot.core.star.session_llm_manager import SessionServiceManager from astrbot.core.utils.active_event_registry import active_event_registry from astrbot.core.utils.astrbot_path import get_astrbot_data_path from astrbot.core.utils.datetime_utils import to_utc_isoformat @@ -514,9 +516,7 @@ def _build_webchat_unified_msg_origin(self, session) -> str: ) def _build_thread_unified_msg_origin(self, creator: str, thread_id: str) -> str: - return ( - f"webchat:{MessageType.FRIEND_MESSAGE.value}:webchat!{creator}!{thread_id}" - ) + return self._build_webchat_umo(creator, thread_id) def _serialize_thread(self, thread) -> dict: return { @@ -713,7 +713,7 @@ async def _save_bot_message( llm_checkpoint_id: str | None = None, platform_history_id: str = "webchat", ): - """保存 bot 消息到历史记录,返回保存的记录""" + """保存 bot 消息到历史记录,返回保存的记录及其 content""" new_his = build_bot_history_content( message_parts, agent_stats=agent_stats, @@ -728,7 +728,54 @@ async def _save_bot_message( sender_name="bot", llm_checkpoint_id=llm_checkpoint_id, ) - return record + return record, new_his + + def _build_webchat_umo(self, username: str, webchat_conv_id: str) -> str: + return ( + f"webchat:{MessageType.FRIEND_MESSAGE.value}:" + f"webchat!{username}!{webchat_conv_id}" + ) + + async def _resolve_webchat_tts( + self, + username: str, + webchat_conv_id: str, + ) -> tuple[bool, str | None]: + """Return whether TTS can run for this webchat session. + + Returns ``(enabled, reason)`` where ``reason`` is a stable code the + frontend can localize when TTS was requested but cannot be fulfilled. + """ + tts_settings = self.core_lifecycle.astrbot_config.get( + "provider_tts_settings", {} + ) + if not tts_settings.get("enable"): + return False, "globally_disabled" + + # Mirror the result-decorate stage's probabilistic trigger: a zero + # probability means TTS never fires, so treat it as disabled instead of + # giving up streaming for audio that will never be synthesized. (With + # 0 < p < 1 the stage may still skip TTS on a per-message dice roll; + # that randomness is inherent to the setting.) + try: + trigger_probability = float(tts_settings.get("trigger_probability", 1)) + except (TypeError, ValueError): + trigger_probability = 1.0 + if trigger_probability <= 0: + return False, "globally_disabled" + + umo = self._build_webchat_umo(username, webchat_conv_id) + if not await SessionServiceManager.is_tts_enabled_for_session(umo): + return False, "session_disabled" + + tts_provider = self.core_lifecycle.provider_manager.get_using_provider( + ProviderType.TEXT_TO_SPEECH, + umo=umo, + ) + if tts_provider is None: + return False, "no_provider" + + return True, None async def chat(self, post_data: dict | None = None): username = g.get("username", "guest") @@ -758,6 +805,33 @@ async def chat(self, post_data: dict | None = None): webchat_conv_id = session_id + # The ChatUI client carries a per-client "voice reply" preference. When + # provided, persist it as this session's TTS state so both the + # streaming-disable check below and the result-decoration stage honor it. + enable_tts = post_data.get("enable_tts") + if enable_tts is not None: + await SessionServiceManager.set_tts_status_for_session( + self._build_webchat_umo(username, webchat_conv_id), + bool(enable_tts), + ) + + tts_notice_code: str | None = None + if enable_streaming or enable_tts: + tts_ok, tts_reason = await self._resolve_webchat_tts( + username, + webchat_conv_id, + ) + if tts_ok and enable_streaming: + logger.info( + "[WebChat] TTS is enabled for this session; disabling streaming " + "so the result decoration stage can synthesize audio.", + ) + enable_streaming = False + elif not tts_ok and enable_tts: + # The client explicitly asked for a voice reply but TTS cannot run + # (e.g. no TTS provider enabled). Tell the client so it can hint. + tts_notice_code = tts_reason + # 构建用户消息段(包含 path 用于传递给 adapter) message_parts = await self._build_user_message_parts(message) if not webchat_message_parts_have_content(message_parts): @@ -781,15 +855,42 @@ async def stream(): message_accumulator = BotMessageAccumulator() agent_stats = {} refs = {} + last_saved_record = None + last_saved_content: dict | None = None async def flush_pending_bot_message(): nonlocal message_accumulator, agent_stats, refs + nonlocal last_saved_record, last_saved_content if not (message_accumulator.has_content() or refs or agent_stats): return None message_parts_to_save = message_accumulator.build_message_parts( include_pending_tool_calls=True ) + + # A turn can end with only trailing metadata (agent_stats / refs) + # and no new message content — e.g. non-streaming TTS replies whose + # audio was already persisted as its own record. Attach that metadata + # to the previously saved record instead of inserting an empty bubble. + # With no prior record to attach to, fall through and persist a + # metadata-only record so stats/refs are not silently dropped. + if not message_parts_to_save and last_saved_record is not None: + if agent_stats or refs: + merged_content = build_bot_history_content( + last_saved_content.get("message", []), + agent_stats=agent_stats + or last_saved_content.get("agent_stats"), + refs=refs or last_saved_content.get("refs"), + ) + await self.platform_history_mgr.update( + last_saved_record.id, content=merged_content + ) + last_saved_content = merged_content + message_accumulator = BotMessageAccumulator() + agent_stats = {} + refs = {} + return None + plain_text = collect_plain_text_from_message_parts( message_parts_to_save ) @@ -806,7 +907,7 @@ async def flush_pending_bot_message(): ) extracted_refs = refs - saved_record = await self._save_bot_message( + saved_record, saved_content = await self._save_bot_message( webchat_conv_id, message_parts_to_save, agent_stats, @@ -814,6 +915,8 @@ async def flush_pending_bot_message(): llm_checkpoint_id, platform_history_id, ) + last_saved_record = saved_record + last_saved_content = saved_content message_accumulator = BotMessageAccumulator() agent_stats = {} refs = {} @@ -840,6 +943,12 @@ def build_attachment_saved_event(part: dict | None) -> str | None: "session_id": webchat_conv_id, } yield f"data: {json.dumps(session_info, ensure_ascii=False)}\n\n" + if tts_notice_code and not client_disconnected: + tts_notice = { + "type": "tts_notice", + "data": {"code": tts_notice_code}, + } + yield f"data: {json.dumps(tts_notice, ensure_ascii=False)}\n\n" if saved_user_record and not client_disconnected: user_saved_info = { "type": "user_message_saved", @@ -930,6 +1039,9 @@ def build_attachment_saved_event(part: dict | None) -> str | None: part = await self._create_attachment_from_file( filename, "record" ) + caption = result.get("text") + if part and caption: + part["text"] = caption message_accumulator.add_attachment(part) if attachment_saved_event := build_attachment_saved_event( part diff --git a/astrbot/dashboard/routes/open_api.py b/astrbot/dashboard/routes/open_api.py index 52b412b2b5..4a7a8369bb 100644 --- a/astrbot/dashboard/routes/open_api.py +++ b/astrbot/dashboard/routes/open_api.py @@ -460,7 +460,7 @@ async def _handle_chat_ws_send(self, post_data: dict) -> None: exc_info=True, ) - saved_record = await self.chat_route._save_bot_message( + saved_record, _ = await self.chat_route._save_bot_message( session_id, message_parts_to_save, agent_stats, diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css index be565ba238..ac62de05ad 100644 --- a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css +++ b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css @@ -1,4 +1,4 @@ -/* Auto-generated MDI subset – 272 icons */ +/* Auto-generated MDI subset – 273 icons */ /* Do not edit manually. Run: pnpm run subset-icons */ @font-face { @@ -1080,6 +1080,10 @@ content: "\F057E"; } +.mdi-volume-off::before { + content: "\F0581"; +} + .mdi-weather-night::before { content: "\F0594"; } diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff index 8e57a70b4f2bc99ab8b875480a4435c560e08fea..fb93b229ee0c8d43d57c1bdb7f2806620b247f28 100644 GIT binary patch delta 18233 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 delta 18160 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 literal 15560 zcmV;(JU7F4Pew8T0RR9106fS53jhEB0EzSf06cd90RR9100000000000000000000 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 WapXqJpcKlN`SNAJ4c^|m4FCYy)ao1n diff --git a/dashboard/src/components/chat/Chat.vue b/dashboard/src/components/chat/Chat.vue index 3179e59f02..b4b59ed21f 100644 --- a/dashboard/src/components/chat/Chat.vue +++ b/dashboard/src/components/chat/Chat.vue @@ -263,6 +263,32 @@ + + + {{ + tm("voiceReply.title") + }} + + + { + const noticeKeys: Record = { + globally_disabled: "voiceReply.globallyDisabled", + session_disabled: "voiceReply.sessionDisabled", + no_provider: "voiceReply.noProvider", + }; + toast.warning(tm(noticeKeys[code] ?? "voiceReply.unavailable")); + }, }); const transportMode = ref( @@ -715,6 +749,11 @@ watch(transportMode, (mode) => { localStorage.setItem("chat.transportMode", mode); }); +const voiceReply = ref(localStorage.getItem("chat.voiceReply") === "true"); +watch(voiceReply, (enabled) => { + localStorage.setItem("chat.voiceReply", enabled ? "true" : "false"); +}); + const isDark = computed(() => customizer.uiTheme === "PurpleThemeDark"); const canSend = computed( () => diff --git a/dashboard/src/components/chat/ChatMessageList.vue b/dashboard/src/components/chat/ChatMessageList.vue index e5f5a8cb11..dbfe2085a6 100644 --- a/dashboard/src/components/chat/ChatMessageList.vue +++ b/dashboard/src/components/chat/ChatMessageList.vue @@ -191,11 +191,11 @@ -