キャプチャ可能なサウンドウェーブ
概要
キャプチャ可能なサウンドウェーブは、ストリーミングサウンドウェーブから派生しています。マイクなどの入力デバイスからオーディオデータをキャプチャし、再生することをサポートしており、インポートされたサウンドウェーブと同じ機能(巻き戻し、SoundCueでの使用など)を備えています。制限なくオーディオのキャプチャと再生を同時に行うことも可能です。
Voice Activity Detection (VAD)については、このページを参照してください。
キャプチャ可能なサウンドウェーブは、iOSとAndroidでキャプチャが開始されると自動的にマイクの権限を要求します。
基本的な使用方法
キャプチャ可能なサウンドウェーブの作成
まず、キャプチャ可能なサウンドウェーブを作成する必要があります。
- Blueprint
- C++
UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
早期破棄を防ぐために、キャプチャ可能な音波は強参照として扱うべきです(例:Blueprintsで別の変数に割り当てる、または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 は、前のステップで取得した利用可能なデバイスの配列内のデバイスのインデックスです。デフォルトのオーディオ入力デバイスを使用するには、Blueprints では -1
を、C++ では Audio::DefaultDeviceIndex
(これは INDEX_NONE
と等しい) を渡してください。ゼロインデックスがデフォルトデバイスではない場合があるためです。
キャプチャステータスの確認
サウンドウェーブが現在オーディオをキャプチャ中かどうかを確認できます:
- 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
に加えて、プロジェクトの .uproject ファイルにも RuntimeAudioImporter
モジュールを追加していることを確認してください。
#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);
}