Skip to content

Commit

Permalink
v1.2.3 (#46)
Browse files Browse the repository at this point in the history
* #45 Adjust tasks parent + Improve logs adding task name and id

* Update version
  • Loading branch information
lucoiso committed Nov 22, 2022
1 parent d811256 commit 692b087
Show file tree
Hide file tree
Showing 28 changed files with 233 additions and 89 deletions.
2 changes: 1 addition & 1 deletion AzSpeech.uplugin
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"FileVersion": 3,
"Version": 6,
"VersionName": "1.2.2",
"VersionName": "1.2.3",
"FriendlyName": "AzSpeech - Voice and Text",
"Description": "Integrates Azure Speech Cognitive Services to the Engine by adding functions to perform recognition and synthesis via asynchronous tasks.",
"Category": "Game Features",
Expand Down
2 changes: 1 addition & 1 deletion Source/AzSpeech/Private/AzSpeech/AzSpeechInternalFuncs.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ namespace AzSpeech::Internal
const auto AzSpeechParams = GetAzSpeechKeys();
if (AzSpeechParams.empty())
{
UE_LOG(LogAzSpeech, Error, TEXT("%s: Invalid settings. Aborting."), *FString(__func__));
UE_LOG(LogAzSpeech, Error, TEXT("%s: Invalid settings. Check your AzSpeech settings on Project Settings -> AzSpeech Settings."), *FString(__func__));
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@
#include "AzSpeech/AzSpeechHelper.h"
#include "AzSpeech/AzSpeechInternalFuncs.h"

void UAzSpeechAudioDataSynthesisBase::Activate()
{
Super::Activate();
}

void UAzSpeechAudioDataSynthesisBase::StopAzSpeechTask()
{
Super::StopAzSpeechTask();
}

bool UAzSpeechAudioDataSynthesisBase::StartAzureTaskWork_Internal()
{
if (!Super::StartAzureTaskWork_Internal())
Expand All @@ -29,6 +39,11 @@ bool UAzSpeechAudioDataSynthesisBase::StartAzureTaskWork_Internal()
return true;
}

void UAzSpeechAudioDataSynthesisBase::BroadcastFinalResult()
{
Super::BroadcastFinalResult();
}

void UAzSpeechAudioDataSynthesisBase::OnSynthesisUpdate(const Microsoft::CognitiveServices::Speech::SpeechSynthesisEventArgs& SynthesisEventArgs)
{
Super::OnSynthesisUpdate(SynthesisEventArgs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ void UAzSpeechRecognizerTaskBase::StopAzSpeechTask()

if (bContinuousRecognition)
{
if (!bAlreadyBroadcastFinal)
{
BroadcastFinalResult();
}

AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [=]
{
if (!Mutex.TryLock())
Expand All @@ -38,13 +43,13 @@ void UAzSpeechRecognizerTaskBase::EnableContinuousRecognition()
{
if (!RecognizerObject)
{
UE_LOG(LogAzSpeech, Error, TEXT("%s: Trying to enable continuos recognition with invalid recognizer"), *FString(__func__));
UE_LOG(LogAzSpeech, Error, TEXT("%s: AzSpeech Task: %s (%s); Trying to enable continuos recognition with invalid recognizer"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));

StopAzSpeechTask();
return;
}

UE_LOG(LogAzSpeech, Display, TEXT("%s: Enabling continuous recognition"), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Enabling continuous recognition"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
if (RecognizerObject->IsEnabled())
{
return;
Expand All @@ -57,13 +62,13 @@ void UAzSpeechRecognizerTaskBase::DisableContinuousRecognition()
{
if (!RecognizerObject)
{
UE_LOG(LogAzSpeech, Error, TEXT("%s: Trying to disable continuos recognition with invalid recognizer"), *FString(__func__));
UE_LOG(LogAzSpeech, Error, TEXT("%s: AzSpeech Task: %s (%s); Trying to disable continuos recognition with invalid recognizer"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));

StopAzSpeechTask();
return;
}

UE_LOG(LogAzSpeech, Display, TEXT("%s: Disabling continuous recognition"), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Disabling continuous recognition"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
if (!RecognizerObject->IsEnabled())
{
return;
Expand All @@ -74,6 +79,11 @@ void UAzSpeechRecognizerTaskBase::DisableContinuousRecognition()

const FString UAzSpeechRecognizerTaskBase::GetLastRecognizedString() const
{
if (LastRecognizedString.empty())
{
return FString();
}

return UTF8_TO_TCHAR(LastRecognizedString.c_str());
}

Expand Down Expand Up @@ -112,7 +122,7 @@ void UAzSpeechRecognizerTaskBase::ApplyExtraSettings()
return;
}

UE_LOG(LogAzSpeech, Display, TEXT("%s: Adding extra settings to existing recognizer object."), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Adding extra settings to existing recognizer object"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));

const auto RecognitionUpdate_Lambda = [this](const Microsoft::CognitiveServices::Speech::SpeechRecognitionEventArgs& RecognitionEventArgs)
{
Expand All @@ -127,6 +137,13 @@ void UAzSpeechRecognizerTaskBase::ApplyExtraSettings()
}
}

void UAzSpeechRecognizerTaskBase::BroadcastFinalResult()
{
Super::BroadcastFinalResult();

AsyncTask(ENamedThreads::GameThread, [=] { RecognitionCompleted.Broadcast(GetLastRecognizedString()); });
}

void UAzSpeechRecognizerTaskBase::ApplySDKSettings(const std::shared_ptr<Microsoft::CognitiveServices::Speech::SpeechConfig>& InConfig)
{
Super::ApplySDKSettings(InConfig);
Expand All @@ -136,7 +153,7 @@ void UAzSpeechRecognizerTaskBase::ApplySDKSettings(const std::shared_ptr<Microso
return;
}

UE_LOG(LogAzSpeech, Display, TEXT("%s: Using language: %s"), *FString(__func__), *LanguageId);
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Using language: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *LanguageId);

const std::string UsedLang = TCHAR_TO_UTF8(*LanguageId);
InConfig->SetSpeechRecognitionLanguage(UsedLang);
Expand All @@ -155,22 +172,23 @@ void UAzSpeechRecognizerTaskBase::OnRecognitionUpdated(const Microsoft::Cognitiv

if (AzSpeech::Internal::GetPluginSettings()->bEnableRuntimeDebug)
{
UE_LOG(LogAzSpeech, Display, TEXT("%s: Current recognized text: %s"), *FString(__func__), *GetLastRecognizedString());
UE_LOG(LogAzSpeech, Display, TEXT("%s: Current duration: %s"), *FString(__func__), *FString::FromInt(RecognitionEventArgs.Result->Duration()));
UE_LOG(LogAzSpeech, Display, TEXT("%s: Current offset: %s"), *FString(__func__), *FString::FromInt(RecognitionEventArgs.Result->Offset()));
UE_LOG(LogAzSpeech, Display, TEXT("%s: Current reason code: %s"), *FString(__func__), *FString::FromInt(static_cast<int32>(RecognitionEventArgs.Result->Reason)));
UE_LOG(LogAzSpeech, Display, TEXT("%s: Current result id: %s"), *FString(__func__), *FString(UTF8_TO_TCHAR(RecognitionEventArgs.Result->ResultId.c_str())));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Current recognized text: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *GetLastRecognizedString());
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Current duration: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *FString::FromInt(RecognitionEventArgs.Result->Duration()));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Current offset: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *FString::FromInt(RecognitionEventArgs.Result->Offset()));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Current reason code: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *FString::FromInt(static_cast<int32>(RecognitionEventArgs.Result->Reason)));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Current result id: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *FString(UTF8_TO_TCHAR(RecognitionEventArgs.Result->ResultId.c_str())));
}

switch (RecognitionEventArgs.Result->Reason)
{
case Microsoft::CognitiveServices::Speech::ResultReason::RecognizedSpeech:
UE_LOG(LogAzSpeech, Display, TEXT("%s: Task finished with result: %s"), *FString(__func__), *GetLastRecognizedString());
RecognitionCompleted.Broadcast(GetLastRecognizedString());
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Task completed with result: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *GetLastRecognizedString());
BroadcastFinalResult();

break;

case Microsoft::CognitiveServices::Speech::ResultReason::RecognizingSpeech:
RecognitionUpdated.Broadcast(GetLastRecognizedString());
AsyncTask(ENamedThreads::GameThread, [=] { RecognitionUpdated.Broadcast(GetLastRecognizedString()); });
break;
}
}
Expand All @@ -182,7 +200,7 @@ bool UAzSpeechRecognizerTaskBase::InitializeRecognizer(const std::shared_ptr<Mic
return false;
}

UE_LOG(LogAzSpeech, Display, TEXT("%s: Initializing recognizer object."), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Initializing recognizer object"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));

const auto SpeechConfig = UAzSpeechTaskBase::CreateSpeechConfig();

Expand All @@ -198,14 +216,14 @@ bool UAzSpeechRecognizerTaskBase::InitializeRecognizer(const std::shared_ptr<Mic
const std::vector<std::string> Candidates = AzSpeech::Internal::GetCandidateLanguages();
if (Candidates.empty())
{
UE_LOG(LogAzSpeech, Error, TEXT("%s: Task failed. Result: Invalid candidate languages"), *FString(__func__));
UE_LOG(LogAzSpeech, Error, TEXT("%s: AzSpeech Task: %s (%s); Task failed. Result: Invalid candidate languages"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
return false;
}

UE_LOG(LogAzSpeech, Display, TEXT("%s: Initializing language auto detection"), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Initializing auto language detection"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
for (const std::string& Iterator : Candidates)
{
UE_LOG(LogAzSpeech, Display, TEXT("%s: Candidate: %s"), *FString(__func__), *FString(UTF8_TO_TCHAR(Iterator.c_str())));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Using language candidate: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *FString(UTF8_TO_TCHAR(Iterator.c_str())));
}

RecognizerObject = Microsoft::CognitiveServices::Speech::SpeechRecognizer::FromConfig(SpeechConfig, Microsoft::CognitiveServices::Speech::AutoDetectSourceLanguageConfig::FromLanguages(Candidates), InAudioConfig);
Expand All @@ -227,7 +245,7 @@ void UAzSpeechRecognizerTaskBase::StartRecognitionWork()
return;
}

UE_LOG(LogAzSpeech, Display, TEXT("%s: Starting recognition."), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Starting recognition"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));

AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [=]
{
Expand All @@ -247,15 +265,15 @@ const bool UAzSpeechRecognizerTaskBase::ProcessRecognitionResult(const std::shar
switch (Result->Reason)
{
case Microsoft::CognitiveServices::Speech::ResultReason::RecognizedSpeech:
UE_LOG(LogAzSpeech, Display, TEXT("%s: Task completed. Reason: RecognizedSpeech"), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Task completed. Reason: RecognizedSpeech"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
return true;

case Microsoft::CognitiveServices::Speech::ResultReason::RecognizingSpeech:
UE_LOG(LogAzSpeech, Display, TEXT("%s: Task running. Reason: RecognizingSpeech"), *FString(__func__));
UE_LOG(LogAzSpeech, Display, TEXT("%s: AzSpeech Task: %s (%s); Task running. Reason: RecognizingSpeech"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
return true;

case Microsoft::CognitiveServices::Speech::ResultReason::NoMatch:
UE_LOG(LogAzSpeech, Error, TEXT("%s: Task Failed. Reason: NoMatch"), *FString(__func__));
UE_LOG(LogAzSpeech, Error, TEXT("%s: AzSpeech Task: %s (%s); Task failed. Reason: NoMatch"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
return false;

default:
Expand All @@ -264,10 +282,10 @@ const bool UAzSpeechRecognizerTaskBase::ProcessRecognitionResult(const std::shar

if (Result->Reason == Microsoft::CognitiveServices::Speech::ResultReason::Canceled)
{
UE_LOG(LogAzSpeech, Error, TEXT("%s: Task failed. Reason: Canceled"), *FString(__func__));
UE_LOG(LogAzSpeech, Error, TEXT("%s: AzSpeech Task: %s (%s); Task failed. Reason: Canceled"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
const auto CancellationDetails = Microsoft::CognitiveServices::Speech::CancellationDetails::FromResult(Result);

UE_LOG(LogAzSpeech, Error, TEXT("%s: Cancellation Reason: %s"), *FString(__func__), *CancellationReasonToString(CancellationDetails->Reason));
UE_LOG(LogAzSpeech, Error, TEXT("%s: AzSpeech Task: %s (%s); Cancellation Reason: %s"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()), *CancellationReasonToString(CancellationDetails->Reason));

if (CancellationDetails->Reason == Microsoft::CognitiveServices::Speech::CancellationReason::Error)
{
Expand All @@ -277,6 +295,6 @@ const bool UAzSpeechRecognizerTaskBase::ProcessRecognitionResult(const std::shar
return false;
}

UE_LOG(LogAzSpeech, Warning, TEXT("%s: Undefined reason"), *FString(__func__));
UE_LOG(LogAzSpeech, Warning, TEXT("%s: AzSpeech Task: %s (%s); Ended with undefined reason"), *FString(__func__), *TaskName.ToString(), *FString::FromInt(GetUniqueID()));
return false;
}

0 comments on commit 692b087

Please sign in to comment.