Onda de sonido capturable
Para la Detección de Actividades de Voz (VAD), consulte esta página.
Hay una onda de sonido capturable derivada de la onda de sonido en streaming. Admite la captura de datos de audio desde dispositivos de entrada como un micrófono y su reproducción, con las mismas capacidades que una onda de sonido importada (incluyendo rebobinado, uso en SoundCues, etc). Incluso puedes capturar y reproducir audio simultáneamente sin ninguna limitación.
También solicita automáticamente permisos de micrófono en iOS y Android una vez que comienza la captura.
Primero debes crear una onda de sonido capturable. Ten en cuenta que debes tratarla como una referencia fuerte para evitar la destrucción prematura (por ejemplo, asignándola a una variable separada en Blueprints o usando UPROPERTY()
en C++).
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Para usar esta función, primero necesitas obtener todos los dispositivos de entrada de audio disponibles que se pueden usar para capturar llamando a la función correspondiente.
- Blueprint
- C++
UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Después de eso, puedes comenzar a capturar datos de audio desde el dispositivo de entrada y detenerlo cuando sea necesario. DeviceId es el índice del dispositivo en el arreglo de dispositivos disponibles obtenido del paso anterior.
- 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();
Además, puedes elegir silenciar o activar el sonido capturado para evitar la acumulación de datos de audio sin interrumpir el proceso de captura. Esto es útil cuando cambias la captura con frecuencia, ya que comenzar la grabación a través de StartCapture
puede causar pequeños inconvenientes en el motor. Debes iniciar primero la captura y luego silenciar/activar el sonido.
Si tu objetivo es eliminar un pequeño congelamiento, podrías considerar comenzar la captura durante un momento en que este congelamiento sea insignificante. Por ejemplo, podrías iniciar la captura durante la pantalla de carga de tu juego, silenciar la onda de sonido capturable inmediatamente después de eso y luego activar la onda de sonido capturable cuando sea necesario para capturar datos de audio sin inconvenientes.
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
Finalmente, tu implementación podría lucir así:
- Blueprint
- C++
Este es un ejemplo básico de código para capturar datos de audio desde un dispositivo de entrada (micrófono) utilizando una onda sonora capturable.
El ejemplo utiliza la función CaptureAudioExample
ubicada en la clase UCaptureAudioClassExample
dentro del módulo EXAMPLEMODULE
.
Nota: Para ejecutar el ejemplo exitosamente, asegúrate de agregar el módulo RuntimeAudioImporter
ya sea a PublicDependencyModuleNames
o PrivateDependencyModuleNames
en el archivo .Build.cs, así como al archivo .uproject de tu proyecto.
#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);
}