diff --git a/Unreal/PS_AI_Agent/PS_AI_Agent.uproject b/Unreal/PS_AI_Agent/PS_AI_Agent.uproject index 6bbd5ee..c8aac34 100644 --- a/Unreal/PS_AI_Agent/PS_AI_Agent.uproject +++ b/Unreal/PS_AI_Agent/PS_AI_Agent.uproject @@ -21,10 +21,6 @@ { "Name": "PS_AI_Agent_ElevenLabs", "Enabled": true - }, - { - "Name": "WebSockets", - "Enabled": true } ] } \ No newline at end of file diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/PS_AI_Agent_ElevenLabs.uplugin b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/PS_AI_Agent_ElevenLabs.uplugin index 096b69b..019faf5 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/PS_AI_Agent_ElevenLabs.uplugin +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/PS_AI_Agent_ElevenLabs.uplugin @@ -28,7 +28,7 @@ ], "Plugins": [ { - "Name": "WebSockets", + "Name": "AudioCapture", "Enabled": true } ] diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp index 182e999..3148608 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsConversationalAgentComponent.cpp @@ -262,7 +262,7 @@ void UElevenLabsConversationalAgentComponent::OnProceduralUnderflow( const int32 BytesToPush = FMath::Min(AudioQueue.Num(), BytesRequired); InProceduralWave->QueueAudio(AudioQueue.GetData(), BytesToPush); - AudioQueue.RemoveAt(0, BytesToPush, false); + AudioQueue.RemoveAt(0, BytesToPush, EAllowShrinking::No); } void UElevenLabsConversationalAgentComponent::EnqueueAgentAudio(const TArray& PCMData) diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsMicrophoneCaptureComponent.cpp b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsMicrophoneCaptureComponent.cpp index d226e13..ebce037 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsMicrophoneCaptureComponent.cpp +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Private/ElevenLabsMicrophoneCaptureComponent.cpp @@ -37,15 +37,15 @@ void UElevenLabsMicrophoneCaptureComponent::StartCapture() } // Open the default audio capture stream. - // FAudioCapture discovers the default device and its sample rate automatically. + // FOnAudioCaptureFunction uses const void* per UE 5.3+ API (cast to float* inside). Audio::FOnAudioCaptureFunction CaptureCallback = - [this](const float* InAudio, int32 NumSamples, int32 InNumChannels, + [this](const void* InAudio, int32 NumFrames, int32 InNumChannels, int32 InSampleRate, double StreamTime, bool bOverflow) { - OnAudioGenerate(InAudio, NumSamples, InNumChannels, InSampleRate, StreamTime, bOverflow); + OnAudioGenerate(InAudio, NumFrames, InNumChannels, InSampleRate, StreamTime, bOverflow); }; - if (!AudioCapture.OpenDefaultCaptureStream(DeviceParams, MoveTemp(CaptureCallback), 1024)) + if (!AudioCapture.OpenAudioCaptureStream(DeviceParams, MoveTemp(CaptureCallback), 1024)) { UE_LOG(LogElevenLabsMic, Error, TEXT("Failed to open default audio capture stream.")); return; @@ -80,7 +80,7 @@ void UElevenLabsMicrophoneCaptureComponent::StopCapture() // Audio callback (background thread) // ───────────────────────────────────────────────────────────────────────────── void UElevenLabsMicrophoneCaptureComponent::OnAudioGenerate( - const float* InAudio, int32 NumSamples, + const void* InAudio, int32 NumFrames, int32 InNumChannels, int32 InSampleRate, double StreamTime, bool bOverflow) { @@ -89,8 +89,11 @@ void UElevenLabsMicrophoneCaptureComponent::OnAudioGenerate( UE_LOG(LogElevenLabsMic, Verbose, TEXT("Audio capture buffer overflow.")); } + // Device sends float32 interleaved samples; cast from the void* API. + const float* FloatAudio = static_cast(InAudio); + // Resample + downmix to 16000 Hz mono. - TArray Resampled = ResampleTo16000(InAudio, NumSamples, InNumChannels, InSampleRate); + TArray Resampled = ResampleTo16000(FloatAudio, NumFrames, InNumChannels, InSampleRate); // Apply volume multiplier. if (!FMath::IsNearlyEqual(VolumeMultiplier, 1.0f)) diff --git a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsMicrophoneCaptureComponent.h b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsMicrophoneCaptureComponent.h index 3f2d6f2..175c57d 100644 --- a/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsMicrophoneCaptureComponent.h +++ b/Unreal/PS_AI_Agent/Plugins/PS_AI_Agent_ElevenLabs/Source/PS_AI_Agent_ElevenLabs/Public/ElevenLabsMicrophoneCaptureComponent.h @@ -55,12 +55,12 @@ public: virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; private: - /** Called by the audio capture callback on a background thread. */ - void OnAudioGenerate(const float* InAudio, int32 NumSamples, + /** Called by the audio capture callback on a background thread. Raw void* per UE 5.3+ API. */ + void OnAudioGenerate(const void* InAudio, int32 NumFrames, int32 InNumChannels, int32 InSampleRate, double StreamTime, bool bOverflow); - /** Simple linear resample from InSampleRate to 16000 Hz. */ - static TArray ResampleTo16000(const float* InAudio, int32 NumSamples, + /** Simple linear resample from InSampleRate to 16000 Hz. Input is float32 frames. */ + static TArray ResampleTo16000(const float* InAudio, int32 NumFrames, int32 InChannels, int32 InSampleRate); Audio::FAudioCapture AudioCapture;