キャプチャ可能なサウンドウェーブ
概要
キャプチャ可能なサウンドウェーブはストリーミングサウンドウェーブから派生しています。マイクなどの入力デバイスからオーデ ィオデータをキャプチャし、再生することが可能で、インポートされたサウンドウェーブと同じ機能(巻き戻し、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は、前のステップで取得した利用可能なデバイスの配列におけるインデックスです。
高度な機能
キャプチャのミュートとミュート解除
キャプチャプロセスを中断することなく、オーディオデータの蓄積を防ぐために、サウンドキャプチャをミュートまたはミュート解除することを選択できます。
- Blueprint
- C++
// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
StartCapture
を通じて録音を開始すると、エンジン側で軽微なヒッチが発生する可能性があるため、頻繁にキャプチャを切り替える場合に有用です。まずキャプチャ自体を開始し、その後でミュート/ミュート解除を行うべきです。
わずかなフリーズを解消したい場合、そのフリーズが無視できるタイミングでキャプチャを開始することを検討できます。例えば、ゲームのローディング画面中にキャプチャを開始し、その後すぐにキャプチャ可能なサウンドウェーブをミュートし、必要な時にキャプチャ可能なサウンドウェーブのミュートを解除すれば、ヒッチなしでオーディオデータをキャプチャできます。
完全な例
キャプチャ可能なサウンドウェーブを使用した完全な実装例を以下に示します:
- 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);
}