KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UAudioCacheManager.cpp
이 파일의 문서화 페이지로 가기
1// Copyright (c) 2025 Doppleddiggong. All rights reserved.
2// Unauthorized copying, modification, or distribution of this file,
3// via any medium is strictly prohibited. Proprietary and confidential.
4
10
11#include "GameLogging.h"
13#include "Misc/Paths.h"
14#include "Misc/FileHelper.h"
15#include "Misc/SecureHash.h"
16#include "HAL/PlatformFileManager.h"
17
18void UVoiceCacheManager::Initialize(FSubsystemCollectionBase& Collection)
19{
20 Super::Initialize(Collection);
21
22 // 캐시 디렉토리 생성
23 FString CacheDir = GetCacheDirectory();
24 IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
25
26 if (!PlatformFile.DirectoryExists(*CacheDir))
27 {
28 if (PlatformFile.CreateDirectory(*CacheDir))
29 {
30 PRINTLOG(TEXT("[AudioCache] Cache directory created: %s"), *CacheDir);
31 }
32 }
33}
34
36{
37 // 메모리 캐시 정리
38 MemoryCache.Empty();
39 Super::Deinitialize();
40}
41
42bool UVoiceCacheManager::TryGetCachedAudio(const FString& AudioText, TArray<uint8>& OutAudioData)
43{
44 // 메모리 캐시 확인
45 if (TArray<uint8>* Found = MemoryCache.Find(AudioText))
46 {
47 OutAudioData = *Found;
48 return true;
49 }
50
51 // 디스크 캐시 확인
52 if (LoadFromDisk(AudioText, OutAudioData))
53 {
54 // 메모리 캐시에도 저장 (다음번 빠른 접근)
55 if (!MemoryCache.Contains(AudioText))
56 MemoryCache.Add(AudioText, OutAudioData);
57
58 return true;
59 }
60
61 return false;
62}
63
64void UVoiceCacheManager::SaveToCache(const FString& AudioText, const TArray<uint8>& AudioData)
65{
66 if (AudioData.Num() == 0)
67 {
68 PRINTLOG(TEXT("[AudioCache] Cannot save empty audio data: %s"), *AudioText);
69 return;
70 }
71
72 // 메모리 캐시 저장
73 if (MemoryCache.Contains(AudioText))
74 // 기존 항목 제거 후 다시 추가
75 MemoryCache.Remove(AudioText);
76 MemoryCache.Add(AudioText, AudioData);
77
78 // [2] 디스크 캐시 저장
79 SaveToDisk(AudioText, AudioData);
80}
81
83{
84 // [1] 메모리 캐시 초기화
85 MemoryCache.Empty();
86
87 // [2] 디스크 캐시 초기화
88 FString CacheDir = GetCacheDirectory();
89 IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
90
91 TArray<FString> Files;
92 PlatformFile.FindFiles(Files, *CacheDir, TEXT(".wav"));
93
94 int32 DeletedCount = 0;
95 for (const FString& File : Files)
96 {
97 FString FullPath = CacheDir / File;
98 if (PlatformFile.DeleteFile(*FullPath))
99 {
100 DeletedCount++;
101 }
102 }
103}
104
105
106FString UVoiceCacheManager::GenerateCacheFileName(const FString& AudioText)
107{
108 return UCommonFunctionLibrary::GererateMD5(AudioText) + TEXT(".wav");
109}
110
112{
113 return FPaths::ProjectSavedDir() / TEXT("VoiceCache");
114}
115
116bool UVoiceCacheManager::LoadFromDisk(const FString& AudioText, TArray<uint8>& OutAudioData)
117{
118 FString CacheFilePath = GetCacheDirectory() / GenerateCacheFileName(AudioText);
119 return FFileHelper::LoadFileToArray(OutAudioData, *CacheFilePath);
120}
121
122bool UVoiceCacheManager::SaveToDisk(const FString& AudioText, const TArray<uint8>& AudioData)
123{
124 FString CacheDir = GetCacheDirectory();
125 IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
126
127 if (!PlatformFile.DirectoryExists(*CacheDir))
128 {
129 if (!PlatformFile.CreateDirectory(*CacheDir))
130 {
131 return false;
132 }
133 }
134
135 // 파일 저장
136 FString CacheFilePath = CacheDir / GenerateCacheFileName(AudioText);
137 return FFileHelper::SaveArrayToFile(AudioData, *CacheFilePath);
138}
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
TTS 오디오 데이터를 메모리와 디스크에 캐싱하는 서브시스템을 선언합니다.
UCommonFunctionLibrary 클래스를 선언합니다.
static FString GererateMD5(const FString &InText)
bool TryGetCachedAudio(const FString &AudioText, TArray< uint8 > &OutAudioData)
캐시에서 오디오 데이터를 조회합니다.
static FString GenerateCacheFileName(const FString &AudioText)
AudioText를 MD5 해시하여 파일명을 생성합니다.
virtual void Initialize(FSubsystemCollectionBase &Collection) override
서브시스템 초기화 시 캐시 디렉토리를 생성합니다.
void SaveToCache(const FString &AudioText, const TArray< uint8 > &AudioData)
오디오 데이터를 메모리와 디스크 캐시에 저장합니다.
TMap< FString, TArray< uint8 > > MemoryCache
메모리 캐시 (Key: AudioText, Value: 오디오 데이터)
static FString GetCacheDirectory()
캐시 디렉토리 경로를 반환합니다.
void ClearCache()
전체 캐시를 초기화합니다 (메모리 + 디스크).
virtual void Deinitialize() override
서브시스템 종료 시 메모리 캐시를 정리합니다.
static bool SaveToDisk(const FString &AudioText, const TArray< uint8 > &AudioData)
디스크에 오디오 데이터를 저장합니다.
static bool LoadFromDisk(const FString &AudioText, TArray< uint8 > &OutAudioData)
디스크에서 오디오 데이터를 로드합니다.