Overview
AudioForge loads audio at runtime — from disk, from a byte buffer, from a
downloaded file or from raw PCM — and hands you a USoundWave you can play
immediately. No cooking step, no reimport, no editor round-trip.
It also records from input devices, streams audio in as it arrives, exports back out to
file or buffer, transcodes between formats, and detects speech with a voice-activity
detector.
- Import MP3, WAV, FLAC, OGG Vorbis, OGG Opus, BINK and RAW PCM
- Stream audio in progressively while it plays
- Capture from any available audio input device
- Export to file or buffer in any supported format
- Transcode between formats without going through a sound wave
- Analyse speech boundaries with the built-in VAD
- Everything is exposed to Blueprints and C++, and every long operation is async
Requirements
| Requirement | Details |
|---|
| Unreal Engine | 4.27 and 5.8 (verified clean on both) |
| Modules | AudioForge (Runtime), AudioForgeEditor (Editor) |
| Dependencies | None — self-contained |
| Language | Blueprints and/or C++ |
| Platforms | Win64 — built and verified. The code carries no Win64-only restriction, but other targets have not been verified by us. |
Installation
- Copy the
AudioForge folder into your project's Plugins/ directory
(create it if it does not exist).
- C++ projects: right-click the
.uproject →
Generate Visual Studio project files, then build.
Blueprint-only projects: just launch the editor — you will be
prompted to build the plugin once.
- Open Edit → Plugins, search for AudioForge, and confirm
it is enabled. Restart the editor if prompted.
- To use it from C++, add
"AudioForge" to
PublicDependencyModuleNames in your module's .Build.cs.
Verifying the install
Drop an Import Audio From File node into any Blueprint. If it resolves, the plugin is
loaded and ready.
Quick start
Import a file and play it (Blueprint)
- Call Create AudioForge to get an importer object.
- Bind On Progress and On Result.
- Call Import Audio From File with a path and a format
(leave it on Determine format automatically if unsure).
- In On Result, take the returned sound wave and feed it to a
normal Play Sound 2D / audio component.
The same thing in C++
UAudioForgeLibrary* Importer = UAudioForgeLibrary::CreateAudioForge();
Importer->OnResultNative.AddWeakLambda(this,
[](UAudioForgeLibrary*, UImportedSoundWave* Wave, ERuntimeImportStatus Status)
{
if (Status == ERuntimeImportStatus::SuccessfulImport)
{
UGameplayStatics::PlaySound2D(GWorld, Wave);
}
});
Importer->ImportAudioFromFile(TEXT("C:/Audio/track.mp3"), ERuntimeAudioFormat::Auto);
Keep a reference
The importer and the resulting sound wave are UObjects. Store them in a
UPROPERTY() (or a Blueprint variable) or the garbage collector may reclaim them
mid-playback.
Importing
| Node | Type | Description |
|---|
| Create AudioForge | Callable | Create an importer instance. |
| Import Audio From File | Callable | Import from a path on disk. |
| Import Audio From Buffer | Callable | Import from an in-memory byte array (downloads, pak data). |
| Import Audio From RAW File / Buffer | Callable | Import raw PCM with an explicit layout. |
| Import Audio From Pre Imported Sound | Callable | Import from a PreImportedSoundAsset. |
| On Progress | Event | Percentage callback during a long import. |
| On Result | Event | Fires with the sound wave and an import status. |
| Get Audio Header Info From File / Buffer | Callable | Read duration, channels and sample rate without decoding. |
| Scan Directory For Audio Files | Callable | Enumerate importable audio in a folder. |
| Get Audio Format / Get Audio Formats | Pure | Detect a format, or list everything supported. |
Playback and sound waves
| Node | Type | Description |
|---|
| UImportedSoundWave | Class | The sound wave produced by an import; plays like any other. |
| UStreamingSoundWave | Class | Append audio while it is already playing. |
| UCapturableSoundWave | Class | Records from an audio input device. |
| USynthBasedSoundWave | Class | Procedurally generated audio. |
| Set Looping / Set Volume / Set Pitch | Callable | Standard playback controls. |
| Rewind Playback Time / Stop Playback | Callable | Seek or stop. |
| Get Playback Time / Get Playback Percentage | Pure | Current position, in seconds or percent. |
| Get Duration Const / Get Sample Rate / Get Num Of Channels | Pure | Wave properties. |
| Is Playing / Is Playback Finished | Pure | Playback state. |
| On Audio Playback Finished | Event | Fires when the wave reaches the end. |
| Set Subtitles | Callable | Attach subtitle cues to the wave. |
| Release Memory | Callable | Free the decoded PCM data early. |
Recording and streaming
| Node | Type | Description |
|---|
| Create Capturable Sound Wave | Callable | Make a wave backed by an input device. |
| Get Available Audio Input Devices | Callable | Enumerate microphones and line inputs. |
| Start Capture / Stop Capture | Callable | Begin or end recording. |
| Is Capturing | Pure | Recording state. |
| Create Streaming Sound Wave | Callable | Make a wave you can append to. |
| Append Audio Data From Encoded | Callable | Push encoded bytes as they arrive. |
| Append Audio Data From RAW | Callable | Push raw PCM as it arrives. |
| Pre Allocate Audio Data | Callable | Reserve buffer space up front to avoid reallocation. |
Exporting and transcoding
| Node | Type | Description |
|---|
| Export Sound Wave To File / Buffer | Callable | Write a wave out in any supported format. |
| Export Sound Wave To RAW File / Buffer | Callable | Write raw PCM. |
| Transcode Encoded Data From File / Buffer | Callable | Convert format to format directly. |
| Transcode RAW Data From File / Buffer | Callable | Convert between raw PCM layouts. |
| Resample Sound Wave | Callable | Change sample rate. |
| Mix Sound Wave Channels | Callable | Change channel count. |
| Reverse Audio Buffer | Callable | Reverse PCM data in place. |
| Duplicate Sound Wave | Callable | Deep-copy a wave. |
| Get PCM Buffer Copy | Callable | Take a copy of the decoded samples. |
Voice activity detection
The VAD reports when speech starts and stops in a stream, so you can gate recording,
drive push-to-talk, or trigger transcription only when someone is actually talking.
| Node | Type | Description |
|---|
| Toggle VAD | Callable | Enable or disable detection on a wave. |
| Set VAD Mode | Callable | Aggressiveness: Quality → VeryAggressive. |
| Set Minimum Speech Duration | Callable | Ignore bursts shorter than this. |
| Set Silence Duration | Callable | Silence needed before speech is considered over. |
| Process VAD / Reset VAD | Callable | Run detection manually, or clear its state. |
| On Speech Started / On Speech Ended | Event | Fire at the boundaries of detected speech. |
Configuration
Build-time switches live at the top of
Source/AudioForge/AudioForge.Build.cs. Flip one and rebuild.
| Switch | Default | Effect |
|---|
| bEnableCaptureInputSupport | true | Recording from input devices. Windows and Mac. |
| bEnableVADSupport | true | Voice activity detection. |
| bEnableFileOperationSupport | true | Import/export that touches the filesystem. |
| bEnableMetaSoundSupport | false | MetaSounds nodes. Requires UE 5.3 or newer. |
| bEnableBinkSupport | UE 5+ | BINK audio. Automatically off on 4.27. |
| bUseDrMp3 | false | Use dr_mp3 instead of minimp3 for MP3 decoding. |
Runtime settings
Project-level defaults live in Config/DefaultAudioForge.ini and appear under
Project Settings.
Troubleshooting
| Symptom | Cause and fix |
|---|
| Import returns a failure status | Check the status value in On Result. FailedToReadAudioDataArray means the path or buffer was unreadable; InvalidAudioFormat means the data did not match the format you specified — try Determine format automatically. |
| Sound plays once then goes silent | The sound wave was garbage collected. Hold it in a UPROPERTY() or Blueprint variable. |
| No input devices listed | Capture support is Windows/Mac only, and the OS must grant microphone permission to the editor or packaged app. |
| MetaSounds nodes missing | bEnableMetaSoundSupport is false by default and requires UE 5.3+. Enable it and rebuild. |
| Long import hitches the game thread | Import is already async — make sure you are reacting to On Result rather than blocking on the call. |
Credits
© 2026 Alpha XP — alphaxp.net.
Built and verified for Unreal Engine 4.27 and 5.8.
All licence notices, including third-party components, ship at
Source/ThirdParty/LICENSE-ThirdParty.txt.