diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp index 67e9541..356de64 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsWebSocketProxy.cpp @@ -237,9 +237,26 @@ void UElevenLabsWebSocketProxy::OnWsMessage(const FString& Message) void UElevenLabsWebSocketProxy::OnWsBinaryMessage(const void* Data, SIZE_T Size, SIZE_T BytesRemaining) { - // ElevenLabs Conversational AI uses text (JSON) frames only. - // If binary frames arrive in future API versions, handle here. - UE_LOG(LogElevenLabsWS, Warning, TEXT("Received unexpected binary WebSocket frame (%llu bytes)."), (uint64)Size); + // ElevenLabs sends its JSON messages as binary WebSocket frames (not text frames). + // Accumulate fragments until BytesRemaining == 0, then parse the complete message. + + const uint8* Bytes = static_cast(Data); + BinaryFrameBuffer.Append(Bytes, Size); + + if (BytesRemaining > 0) + { + // More fragments coming — wait for the rest + return; + } + + // Full message received — interpret as UTF-8 JSON + const FString JsonString = FString(UTF8_TO_TCHAR( + reinterpret_cast(BinaryFrameBuffer.GetData()))); + + BinaryFrameBuffer.Reset(); + + // Route through the existing text message handler + OnWsMessage(JsonString); } // ───────────────────────────────────────────────────────────────────────────── diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsWebSocketProxy.h b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsWebSocketProxy.h index f03a54d..50dec68 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsWebSocketProxy.h +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsWebSocketProxy.h @@ -179,4 +179,8 @@ private: TSharedPtr WebSocket; EElevenLabsConnectionState ConnectionState = EElevenLabsConnectionState::Disconnected; FElevenLabsConversationInfo ConversationInfo; + + // Accumulation buffer for multi-fragment binary WebSocket frames. + // ElevenLabs sends JSON as binary frames; large messages arrive in fragments. + TArray BinaryFrameBuffer; };