Capturable Sound Wave
概要
キャプチャ可能なサウンドウェーブは、ストリーミングサウンドウェーブから派生しています。マイクなどの入力デバイスからオーディオデータをキャプチャし、再生することをサポートしており、インポートされたサウンドウェーブと同じ機能(巻き戻し、SoundCueでの使用など)を持っています。制限なく、オーディオのキャプチャと再生を同時に行うことも可能です。
音声活動検出 (VAD) については、このページを参照してください。
キャプチャ可能なサウンドウェーブは、iOSおよびAndroidでキャプチャを開始すると、自動的にマイクの権限を要求します。
基本的な使い方
キャプチャ可能なサウンドウェーブの作成
まず、キャプチャ可能なサウンドウェーブを作成する必要があります。
- Blueprint
- C++

UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
キャプチャ可能なサウンドウェーブを、早期に破棄されないように強参照として扱う必要があります(例えば、ブループリントで別の変数に割り当てるか、C++で UPROPERTY() を使用するなど)。
利用可能な入力デバイスの取得
この機能を使用するには、まずキャプチャに使用できるすべての利用可能なオーディオ入力デバイスを取得する必要があります。
- Blueprint
- C++

UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
キャプチャの開始と停止
利用可能なデバイスを取得した後、入力デバイスからのオーディオデータのキャプチャを開始し、必要に応じて停止することができます。
- 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();
DeviceIdは、前のステップで取得した利用可能なデバイスの配列内のデバイスのインデックスです。デフォルトのオーディオ入力デバイスを使用するには、Blueprintでは -1 を、C++では Audio::DefaultDeviceIndex (これは INDEX_NONE と等しい)を渡してください。なぜなら、インデックス0がデフォルトデバイスとは限らないためです。
キャプチャ状態の確認
サウンドウェーブが現在オーディオをキャプチャしているかどうかを確認できます:
- Blueprint
- C++

// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
高度な機能
キャプチャのミュートとミュート解除
キャプチャプロセスを中断することなく、音声データの蓄積を防ぐために、サウンドキャプチャをミュートまたはミュート解除することを選択できます。
- Blueprint
- C++

// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
UE 5.3 以降: キャプチャの開始と停止によるヒッチは発生しなくなったため、ToggleMute は StartCapture/StopCapture と同じ効果になります。パフォーマンス最適化のために ToggleMute を使用する必要はないかもしれません。
UE 5.2 以前: StartCapture によるキャプチャ開始は、わずかなヒッチを引き起こす可能性があります。これらのバージョンでは、キャプチャのオン/オフを頻繁に切り替える場合、ToggleMute の使用が推奨されます。まず、キャプチャ自体は(ローディング画面など)重要度の低いタイミングで開始し、その後、ミュート/ミュート解除を使用して、実際にオーディオデータが蓄積されるタイミングを制御する必要があります。
UE 5.2 以前を使用していて、わずかなフリーズを排除したい場合は、そのフリーズが無視できる可能性のあるタイミングでキャプチャを開始することを検討してください。例えば、ゲームのローディング画面中にキャプチャを開始し、その直後にキャプチャ可能なサウンドウェーブをミュートし、その後、ヒッチなしでオーディオデータをキャプチャする必要があるときにキャプチャ可能なサウンドウェーブのミュートを解除することができます。
完全な例
キャプチャ可能なサウンドウェーブを使用する完全な実装例を以下に示します:
- 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"
#include "AudioCaptureDeviceInterface.h"
void UCaptureAudioClassExample::CaptureAudioExample()
{
// Create a capturable sound wave
CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
// Capture audio data from the default input device
CapturableSoundWave->StartCapture(Audio::DefaultDeviceIndex);
// 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);
}