Захватываемая звуковая волна
Для обнаружения активности голоса (VAD) обратитесь к этой странице.
Существует захватываемая звуковая волна, полученная из потоковой звуковой волны. Она поддерживает захват аудиоданных с таких устройств ввода, как микрофон, и их воспроизведение с теми же возможностями, что и у импортированной звуковой волны (включая перемотку, использование в SoundCues и т. д.). Вы даже можете одновременно захватывать и воспроизводить аудио без каких-либо ограничений.
Она также автоматически запрашивает разрешения на использование микрофона в iOS и Android после начала захвата.
Сначала следует создать захватываемую звуковую волну. Обратите внимание, что вам следует рассматривать ее как сильную ссылку, чтобы предотвратить преждевременное уничтожение (например, присвоив ее отдельной переменной в Blueprints или используя UPROPERTY()
в C++).
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Чтобы использовать эту функцию, сначала нужно получить все доступные устройства ввода звука, которые можно использовать для захвата, вызвав соответствующую функцию.
- Blueprint
- C++
UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
После этого вы можете начать захват аудиоданных с входного устройства и остановить его при необходимости. DeviceId — это индекс устройства в массиве доступных устройств, полученном на предыдущем шаге.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
// Start capturing audio data from the input device with the specified device ID (0 in this case)
CapturableSoundWave->StartCapture(0);
// Stop capturing audio data
CapturableSoundWave->StopCapture();
Кроме того, вы можете выбрать, заглушать или не заглушать захват звука, чтобы предотвратить накопление аудиоданных без прерывания процесса захвата. Это полезно при частой смене захвата, так как начало записи через StartCapture
может вызвать небольшие зависания на стороне движка. Сначала вы должны начать сам захват, и только потом заглушить/разглушить его.
Если ваша цель — устранить небольшое зависание, вы можете рассмотреть возможность начала захвата в момент, когда это зависание может быть незначительным. Например, вы можете начать захват во время загрузочного экрана вашей игры, сразу после этого заглушить звук, который можно захватывать, а затем разглушить звук, который можно захватывать, когда потребуется для захвата аудиоданных без каких-либо сбоев.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
Наконец, ваша реализация может выглядеть следующим образом:
- Blueprint
- C++
Это базовый пример кода для захвата аудиоданных с входного устройства (микрофона) с использованием захватываемой звуковой волны.
Пример использует функцию CaptureAudioExample
, находящуюся в классе UCaptureAudioClassExample
внутри модуля EXAMPLEMODULE
.
Примечание: Чтобы успешно запустить пример, убедитесь, что вы добавили модуль RuntimeAudioImporter
в PublicDependencyModuleNames
или PrivateDependencyModuleNames
в файле .Build.cs, а также в файл .uproject вашего проекта.
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "CaptureAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UCaptureAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void CaptureAudioExample();
private:
// Please pay attention to making the StreamingSoundWave a hard reference, such as using UPROPERTY(), to prevent it from being prematurely garbage collected
UPROPERTY()
class UCapturableSoundWave* CapturableSoundWave;
};
#include "CaptureAudioClassExample.h"
#include "Sound/StreamingSoundWave.h"
void UCaptureAudioClassExample::CaptureAudioExample()
{
// Create a capturable sound wave
CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
// Capture audio data from the input device with the specified device ID (0 in this case)
CapturableSoundWave->StartCapture(0);
// Delay for 5 seconds, just for demonstration purposes
FTimerHandle TimerHandle;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [this]()
{
// Stop capturing audio data
CapturableSoundWave->StopCapture();
// Play the sound wave
UGameplayStatics::PlaySound2D(GetWorld(), CapturableSoundWave);
}, 5, false);
}