feat(conversation): TTS 投递与 WebSocket 管线;客户端播放门禁与会话页联动;COS 键与迁移脚本调整
This commit is contained in:
28
api/app/features/conversation/tts_delivery.py
Normal file
28
api/app/features/conversation/tts_delivery.py
Normal file
@@ -0,0 +1,28 @@
|
||||
"""
|
||||
对话 TTS 音频 URL 下发到客户端。
|
||||
|
||||
与回忆录章节图片一致:私有桶下不能把「直链」当公开可读 URL 使用,应对 COS object key
|
||||
生成预签名下载地址后再交给 App(参见 `normalize_image_assets_for_api` 中的 `get_download_url`)。
|
||||
|
||||
持久化(DB / Redis)仍保存 upload 返回的 canonical URL,仅在 API 响应与 WS 实时下发时做 presign。
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from app.core.cos_url_keys import presign_tts_urls_for_playback
|
||||
from app.ports.storage import ObjectStorage
|
||||
|
||||
|
||||
def apply_presigned_tts_urls_to_messages(
|
||||
messages: list[dict],
|
||||
storage: ObjectStorage | None,
|
||||
) -> None:
|
||||
"""就地改写助手消息的 `ttsAudioUrls` 为预签名 URL;无 storage 时不变。"""
|
||||
if not storage:
|
||||
return
|
||||
for m in messages:
|
||||
tts = m.get("ttsAudioUrls")
|
||||
if not isinstance(tts, list) or not tts:
|
||||
continue
|
||||
str_urls = [x for x in tts if isinstance(x, str)]
|
||||
m["ttsAudioUrls"] = presign_tts_urls_for_playback(str_urls, storage)
|
||||
Reference in New Issue
Block a user