From 449f006f3a593504574d95313267690bee3945b4 Mon Sep 17 00:00:00 2001 From: Tillman Staffen Date: Fri, 13 Mar 2026 11:35:10 +0100 Subject: [PATCH] [RECOMPILE] Changed STT Word Replacment to only replace complete words --- .../AvatarCore_STT/Private/STTManagerBase.cpp | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/Unreal/Plugins/AvatarCore_STT/Source/AvatarCore_STT/Private/STTManagerBase.cpp b/Unreal/Plugins/AvatarCore_STT/Source/AvatarCore_STT/Private/STTManagerBase.cpp index d85c28d..b7399eb 100644 --- a/Unreal/Plugins/AvatarCore_STT/Source/AvatarCore_STT/Private/STTManagerBase.cpp +++ b/Unreal/Plugins/AvatarCore_STT/Source/AvatarCore_STT/Private/STTManagerBase.cpp @@ -420,9 +420,41 @@ FString USTTManagerBase::CheckForWordReplacement(const FString& InputText) for(const FSTTWordReplacement& Replacement : ProcessorConfig->BaseSettings.STTReplacements) { - for(const FString TranscribedWord : Replacement.TranscribedWords) + for(const FString& TranscribedWord : Replacement.TranscribedWords) { - ResultString = ResultString.Replace(*TranscribedWord, *Replacement.ReplacementWord, ESearchCase::IgnoreCase); + if (TranscribedWord.IsEmpty()) + continue; + + const int32 MatchLen = TranscribedWord.Len(); + FString Output; + Output.Reserve(ResultString.Len()); + + int32 SearchStart = 0; + while (SearchStart <= ResultString.Len() - MatchLen) + { + const int32 FoundIdx = ResultString.Find(TranscribedWord, ESearchCase::IgnoreCase, ESearchDir::FromStart, SearchStart); + if (FoundIdx == INDEX_NONE) + break; + + // Check word boundaries: reject if immediately preceded or followed by an alpha character + const bool bPrecededByAlpha = (FoundIdx > 0) && FChar::IsAlpha(ResultString[FoundIdx - 1]); + const bool bFollowedByAlpha = (FoundIdx + MatchLen < ResultString.Len()) && FChar::IsAlpha(ResultString[FoundIdx + MatchLen]); + + if (bPrecededByAlpha || bFollowedByAlpha) + { + Output += ResultString.Mid(SearchStart, FoundIdx - SearchStart + 1); + SearchStart = FoundIdx + 1; + } + else + { + Output += ResultString.Mid(SearchStart, FoundIdx - SearchStart); + Output += Replacement.ReplacementWord; + SearchStart = FoundIdx + MatchLen; + } + } + + Output += ResultString.Mid(SearchStart); + ResultString = MoveTemp(Output); } } return ResultString;