feat(conversation): TTS 投递与 WebSocket 管线;客户端播放门禁与会话页联动;COS 键与迁移脚本调整

This commit is contained in:
Kevin
2026-03-26 15:51:24 +08:00
parent c23931ec91
commit d990399112
22 changed files with 630 additions and 74 deletions

View File

@@ -117,6 +117,8 @@ interface UseRealtimeSessionOptions {
conversationId: string;
enabled?: boolean;
onTtsSegment?: (payload: TtsSegmentPayload) => void;
/** 用户发出下一条文本/语音成功后调用,用于恢复接受 TTS 片段(打断后丢弃迟到片段) */
onTtsPlaybackResume?: () => void;
}
const MIN_RECORDING_DURATION_SEC = 1;
@@ -136,12 +138,14 @@ interface RealtimeSessionState {
sendText: (text: string) => void;
sendVoiceMessage: (uri: string, durationMs: number) => Promise<boolean>;
sendEndConversation: () => void;
sendTtsCancel: () => void;
}
export function useRealtimeSession({
conversationId,
enabled = true,
onTtsSegment,
onTtsPlaybackResume,
}: UseRealtimeSessionOptions): RealtimeSessionState {
const queryClient = useQueryClient();
const sessionRef = useRef<RealtimeSession | null>(null);
@@ -207,6 +211,8 @@ export function useRealtimeSession({
return;
}
onTtsPlaybackResume?.();
const localId = `pending_${Date.now()}`;
queryClient.setQueryData<MessageItem[]>(
@@ -224,7 +230,7 @@ export function useRealtimeSession({
},
);
},
[conversationId, queryClient],
[conversationId, queryClient, onTtsPlaybackResume],
);
const sendVoiceMessage = useCallback(
@@ -276,19 +282,24 @@ export function useRealtimeSession({
return [...(old ?? []), msg];
},
);
onTtsPlaybackResume?.();
return true;
} catch {
setError('语音文件读取失败');
return false;
}
},
[conversationId, queryClient],
[conversationId, queryClient, onTtsPlaybackResume],
);
const sendEndConversation = useCallback(() => {
sessionRef.current?.sendEndConversation();
}, []);
const sendTtsCancel = useCallback(() => {
sessionRef.current?.sendTtsCancel();
}, []);
return {
connectionState,
streamingMessage,
@@ -296,5 +307,6 @@ export function useRealtimeSession({
sendText,
sendVoiceMessage,
sendEndConversation,
sendTtsCancel,
};
}