キャプチャ可能なサウンドウェーブ
Voice Activity Detection (VAD) に関しては、このページを参照してください。
Streaming Sound Waveから派生したキャプチャ可能なサウンドウェーブがあります。このサウンドウェーブは、マイクなどの入力デバイスからオーディオデータをキャプチャし、再生することが可能です。また、インポートされたサウンドウェーブと同じ機能(巻き戻し、SoundCuesでの使用など)を備えています。さらに、音声のキャプチャと再生を同時に行うことが、制限なしに可能です。
キャプチャを開始すると、iOSおよびAndroid上で自動的にマイクの権限をリクエストします。
まず、キャプチャ可能なサウンドウェーブを作成する必要があります。このサウンドウェーブは、強参照として扱い、早期破壊を防ぐようにしてください(例: Blueprintsで別の変数に割り当てる、またはC++でUPROPERTY()
を使用するなど)。
- 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++
これは、キャプチャ可能なサウンドウェーブを使用して入力デバイス(マイク)からオーディオデータをキャプチャする基本的なコード例です。
この例では、EXAMPLEMODULE
モジュール内の UCaptureAudioClassExample
クラスにある CaptureAudioExample
関数を使用します。
注意: この例を正常に実行するには、.Build.cs ファイルの PublicDependencyModuleNames
または PrivateDependencyModuleNames
に、RuntimeAudioImporter
モジュールを追加し、併せてプロジェクトの .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);
}