ストリーミング音波
Voice Activity Detection (VAD) については、このページを参照してください。
ストリーミング音波は、再生中でも動的に音声データを追加できるインポートされた音波の一種です。インポートされた音波と同じ機能(例:巻き戻し)を提供し、SoundCuesなどで使用できます。
ストリーミング音波の作成
最初にストリーミング音波を作成する必要があります。注意点として、早期破棄を防ぐために強参照として扱 う必要があります(例:Blueprintsで別の変数に割り当てたり、C++で UPROPERTY()
を使用したりする)。
- Blueprint
- C++
UStreamingSoundWave* StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
音波を再生する
その音波を再生することができます。しかし、今すぐにこれをする必要はありません。音波の再生は後で開始することができます。
オーディオデータの事前割り当て
必要に応じて、オーディオデータ(バイト)を事前に割り当てて、新しいオーディオデータが追加されるたびにPCMバッファ全体を再割り当てするのを避けることができます。
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->PreAllocateAudioData(12582912, FOnPreAllocateAudioDataResultNative::CreateWeakLambda(this, [StreamingSoundWave](bool bSucceeded)
{
// Handle the result
}));
オーディオデータの追加
既存のバッファーの末尾にオーディオデータを追加するには、オーディオデータを動的に追加するための適切な関数を使用します。再生はこれらの追加の順番に従います。
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
// Example of appending encoded audio data
TArray<uint8> AudioData = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(AudioData, ERuntimeAudioFormat::Auto);
// Or, if you have raw audio data
TArray<uint8> RawAudioData = ...; // Fill with raw audio data
StreamingSoundWave->AppendAudioDataFromRAW(RawAudioData, ERuntimeRAWAudioFormat::Float32, 44100, 2);
加速されたオーディオ再生の回避
しばしば、オーディオデータをストリームしながら同時に再生する必要がある場合、バッファが速く溜まりすぎてオーディオが加速してしまうのを避けるために、再生前に少し遅延を加えるべきです。一般的に約半秒の遅延が推奨されます。
使用例
最終的に、あなたの実装は次のようになるかもしれません:
- Blueprint
- C++
これはストリーミング音波にオーディオデ ータを追加するための基本的なコード例です。
この例は EXAMPLEMODULE
モジュール内の UAppendAudioClassExample
クラスにある AppendAudioExample
関数を使用しています。
注意: 例を成功裏に実行するには、RuntimeAudioImporter
モジュールを .Build.cs ファイルの PublicDependencyModuleNames
または PrivateDependencyModuleNames
に追加し、さらにプロジェクトの .uproject ファイルにも追加することを確認してください。
#pragma once
#include "CoreMinimal.h"
#include "UObject/Object.h"
#include "AppendAudioClassExample.generated.h"
UCLASS(BlueprintType)
class EXAMPLEMODULE_API UAppendAudioClassExample : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable)
void AppendAudioExample();
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 UStreamingSoundWave* StreamingSoundWave;
};
#include "AppendAudioClassExample.h"
#include "Sound/StreamingSoundWave.h"
void UAppendAudioClassExample::AppendAudioExample()
{
// Create a streaming sound wave
StreamingSoundWave = UStreamingSoundWave::CreateStreamingSoundWave();
// Append audio data
TArray<uint8> StreamedAudioDataToAdd = ...; // Fill with audio data
StreamingSoundWave->AppendAudioDataFromEncoded(StreamedAudioDataToAdd, ERuntimeAudioFormat::Auto);
// Play the sound wave
UGameplayStatics::PlaySound2D(GetWorld(), StreamingSoundWave);
}
On Populate Audio State
OnPopulateAudioState デリゲートは、ポピュレートされたオーディオデータを放送しない点を除き、OnPopulateAudioData と同様に機能します。これは、ポピュレートされたオーディオデータの配列を渡すことなく、オーディオデータがポピュレートされた時点を追跡したい場合に役立ち、パフォーマンス向上に寄与することがあります。
- Blueprint
- C++
// Assuming StreamingSoundWave is a UE reference to a UStreamingSoundWave object (or its derived type, such as UCapturableSoundWave)
StreamingSoundWave->OnPopulateAudioStateNative.AddWeakLambda(this, [this]()
{
// Handle the result
});
PCMデータの操作
再生中にPCMデータにリアルタイムでアクセスするには、PCM Data Handlingを参照してください。