Sóng Âm Có Thể Ghi Lại
Tổng Quan
Sóng âm có thể ghi lại được dẫn xuất từ sóng âm phát trực tuyến. Nó hỗ trợ ghi lại dữ liệu âm thanh từ các thiết bị đầu vào như micro và phát lại, với các khả năng tương tự như sóng âm đã nhập (bao gồm tua lại, sử dụng trong SoundCues, v.v.). Bạn thậm chí có thể ghi và phát âm thanh đồng thời mà không có bất kỳ giới hạn nào.
Để biết về Phát Hiện Hoạt Động Giọng Nói (VAD), hãy tham khảo trang này.
Sóng âm có thể ghi lại sẽ tự động yêu cầu quyền truy cập micro trên iOS và Android khi quá trình ghi được bắt đầu.
Cách Sử Dụng Cơ Bản
Tạo Sóng Âm Có Thể Ghi Lại
Trước tiên, bạn nên tạo một sóng âm có thể ghi lại.
- Blueprint
- C++

UCapturableSoundWave* CapturableSoundWave = UCapturableSoundWave::CreateCapturableSoundWave();
Bạn nên coi sóng âm thanh có thể thu được như một tham chiếu mạnh để ngăn chặn việc hủy sớm (ví dụ: bằng cách gán nó cho một biến riêng biệt trong Blueprints hoặc sử dụng UPROPERTY() trong C++).
Lấy Danh Sách Thiết Bị Đầu Vào Khả Dụng
Để sử dụng tính năng này, trước tiên bạn cần lấy tất cả các thiết bị đầu vào âm thanh khả dụng có thể được sử dụng để thu âm.
- Blueprint
- C++

UCapturableSoundWave::GetAvailableAudioInputDevices(FOnGetAvailableAudioInputDevicesResultNative::CreateWeakLambda(this, [](const TArray<FRuntimeAudioInputDeviceInfo>& AvailableDevices)
{
// Handle the result
}));
Bắt đầu và Dừng Thu Âm
Sau khi lấy được các thiết bị khả dụng, bạn có thể bắt đầu thu âm thanh từ thiết bị đầu vào và dừng lại khi cần.
- 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 là chỉ mục của thiết bị trong mảng các thiết bị khả dụng lấy được từ bước trước. Để sử dụng thiết bị đầu vào âm thanh mặc định, hãy truyền -1 trong Blueprints hoặc Audio::DefaultDeviceIndex trong C++ (tương đương với INDEX_NONE), vì đôi khi chỉ mục số 0 không phải là thiết bị mặc định.
Kiểm tra Trạng thái Ghi âm
Bạn có thể kiểm tra xem sound wave có đang ghi âm hay không:
- Blueprint
- C++

// Assuming CapturableSoundWave is a reference to a UCapturableSoundWave object
bool bIsCapturing = CapturableSoundWave->IsCapturing();
Tính năng Nâng cao
Tắt và Bật Tiếng Thu Âm
Bạn có thể chọn tắt hoặc bật tiếng thu âm để ngăn chặn việc tích lũy dữ liệu âm thanh mà không làm gián đoạn quá trình thu âm.
- Blueprint
- C++

// Assuming CapturableSoundWave is a UE reference to a UCapturableSoundWave object (or its derived type)
CapturableSoundWave->ToggleMute(true);
UE 5.3 trở lên: Việc bắt đầu và dừng ghi âm không còn gây ra hiện tượng giật lag, do đó ToggleMute có hiệu quả tương tự như StartCapture/StopCapture. Bạn có thể không cần sử dụng ToggleMute để tối ưu hiệu suất.
UE 5.2 trở về trước: Việc bắt đầu ghi âm thông qua StartCapture có thể gây ra hiện tượng giật lag nhẹ. Trong các phiên bản này, bạn nên sử dụng ToggleMute để thường xuyên bật/tắt ghi âm. Trước tiên, bạn nên bắt đầu quá trình ghi âm vào thời điểm ít quan trọng (ví dụ: trong màn hình tải), sau đó sử dụng chức năng tắt tiếng/bật tiếng để kiểm soát thời điểm dữ liệu âm thanh thực sự được tích lũy.
Nếu bạn đang sử dụng UE 5.2 trở về trước và muốn loại bỏ hiện tượng đóng băng nhẹ, hãy cân nhắc việc bắt đầu ghi âm vào thời điểm mà hiện tượng đóng băng này có thể không đáng kể. Ví dụ, bạn có thể bắt đầu ghi âm trong màn hình tải của trò chơi, ngay sau đó tắt tiếng sóng âm thanh có thể ghi lại, và sau đó bật tiếng sóng âm thanh đó khi cần ghi lại dữ liệu âm thanh mà không gặp bất kỳ hiện tượng giật lag nào.
Ví dụ Hoàn chỉnh
Dưới đây là một ví dụ triển khai hoàn chỉnh về việc sử dụng sóng âm thanh có thể ghi lại:
- Blueprint
- C++

Đây là một ví dụ mã cơ bản để ghi lại dữ liệu âm thanh từ một thiết bị đầu vào (microphone) bằng cách sử dụng sóng âm thanh có thể ghi lại.
Ví dụ sử dụng hàm CaptureAudioExample nằm trong lớp UCaptureAudioClassExample thuộc module EXAMPLEMODULE.
Để chạy ví dụ thành công, hãy đảm bảo thêm module RuntimeAudioImporter vào PublicDependencyModuleNames hoặc PrivateDependencyModuleNames trong tệp .Build.cs, cũng như vào tệp .uproject của dự án của bạn.
#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);
}