pollyrequester = { Properties = { character = {default = "NewCharacter_0", description = "Character Name"} }, } function pollyrequester:OnActivate() self.tickBusHandler = TickBus.Connect(self,self.entityId); self.playbackHandler = TextToSpeechPlaybackNotificationBus.Connect(self, self.entityId); Debug.Log("Activating") end function pollyrequester:initUiCanvas() Debug.Log("Loading Ui Canvas") self.canvasEntityId = UiCanvasManagerBus.Broadcast.LoadCanvas("Levels/TextToSpeechSample/UI/InputUi.uicanvas") self.textInputElement = UiCanvasBus.Event.FindElementByName(self.canvasEntityId, "Message Input") self.characterInputElement = UiCanvasBus.Event.FindElementByName(self.canvasEntityId, "Character Input") self.dropDownEntityId = UiCanvasBus.Event.FindElementByName(self.canvasEntityId, "Voice Dropdown") self.uiNotifications = UiCanvasNotificationBus.Connect(self, self.canvasEntityId) local util = require("scripts.util") util.SetMouseCursorVisible(true) self:PopulateVoiceList() end function pollyrequester:OnTick(deltaTime,timePoint) self:initUiCanvas(); self.tickBusHandler:Disconnect(); end function pollyrequester:AddCharacterSSMLToMessage(language, timbre, tags, ssml, message) if #tags == 0 and language == "" and timbre == 100 then -- Cached files from the CGP will already have start and end 'speak' ssml tags, even if everything else is default if the character has SSML tags enabled if ssml then return "" .. message .. ""; end return message end local findTag = string.find(message, "", 1, true); if findTag == 1 and string.find(message, "", 1, true) == string.len(message) - 7 then Debug.Log("already have ssml in this text"); message = string.sub(message, 8, string.len(message) - 8); end if language ~= "" then ssmlLangTag = "lang=\""..language.."\"" message = ""..message.."" end if timbre ~= 100 then message = ""..message.."" end local finalMessage = ""; if #tags ~= 0 then finalMessage = finalMessage..""; end finalMessage = finalMessage .. message if #tags ~= 0 then finalMessage = finalMessage.."" end finalMessage = finalMessage ..""; return finalMessage end function pollyrequester:OnAction(entityId, actionName) if actionName == "speak" then local text = UiTextInputBus.Event.GetText(self.textInputElement); if string.len(text) > 0 then local dropDownSelection = UiDropdownBus.Event.GetValue(self.dropDownEntityId) if dropDownSelection:IsValid() then local selectedText = UiDropdownBus.Event.GetTextElement(self.dropDownEntityId) local voiceInput = UiTextBus.Event.GetText(selectedText); if voiceInput == '' then voiceInput = self.Properties.character; end -- This optional character input let's the users slect the voice of the Characters for their game without having to -- remember what the name of the Polly voice is. This is useful when getting a package of voices generated in the Cloud Gem Portal local characterInput = UiTextInputBus.Event.GetText(self.characterInputElement); local marks = "VS"; if characterInput == '' then characterInput = self.Properties.character; end local voice = TextToSpeechRequestBus.Event.GetVoiceFromCharacter(self.entityId, characterInput) if voice == '' then voice = voiceInput; else local prosodyTags = TextToSpeechRequestBus.Event.GetProsodyTagsFromCharacter(self.entityId, characterInput); local languageOverride = TextToSpeechRequestBus.Event.GetLanguageOverrideFromCharacter(self.entityId, characterInput); local timbre = TextToSpeechRequestBus.Event.GetTimbreFromCharacter(self.entityId, characterInput); marks = TextToSpeechRequestBus.Event.GetSpeechMarksFromCharacter(self.entityId, characterInput) text = self:AddCharacterSSMLToMessage(languageOverride, timbre, prosodyTags, string.match(marks, "T"), text) end TextToSpeechRequestBus.Event.ConvertTextToSpeechWithMarks(self.entityId, voice, text, marks); UiTextInputBus.Event.SetText(self.textInputElement, ""); end end end end function pollyrequester:OnDeactivate() self.playbackHandler:Disconnect(); self.uiNotifications:Disconnect(); end function pollyrequester:PlaySpeech(voicePath) Debug.Log("Play without lip sync"); end function pollyrequester:PlayWithLipSync(voicePath, speechMarksPath) Debug.Log("Play with lip sync"); end function pollyrequester:PopulateVoiceList() local scrollBoxEntityID = UiElementBus.Event.FindChildByName(self.dropDownEntityId, "ScrollBox") local maskEntityID = UiElementBus.Event.FindChildByName(scrollBoxEntityID, "Mask") local dropDownContentEntityID = UiElementBus.Event.FindChildByName(maskEntityID, "Content") local voiceList = {"Joanna", "Kendra", "Kimberly", "Salli", "Joey", "Justin", "Ivy", "Amy", "Brian", "Emma", "Nicole", "Russell", "Geraint", "Celine", "Chantal", "Mathieu", "Hans", "Marlene", "Vicki", "Dora", "Karl", "Carla", "Giorgio", "Mizuki", "Liv", "Jacek", "Jan", "Ewa", "Maja", "Ricardo", "Vitoria", "Cristiano", "Ines", "Carmen", "Maxim", "Tatyana", "Conchita", "Enrique", "Miguel", "Penelope", "Astrid", "Filiz", "Gwyneth", "Mads", "Naja", "Lotte", "Ruben"} local numVoices = table.getn(voiceList) UiDynamicLayoutBus.Event.SetNumChildElements(dropDownContentEntityID, numVoices) if numVoices > 1 then for voiceCount = 1, numVoices do local optionElement = UiElementBus.Event.GetChild(dropDownContentEntityID, voiceCount-1) local optionText = UiElementBus.Event.FindChildByName(optionElement, "Text") UiTextBus.Event.SetText(optionText, tostring(voiceList[voiceCount])) end local curSelect = UiElementBus.Event.GetChild(dropDownContentEntityID,0) UiDropdownBus.Event.SetValue(self.dropDownEntityId, curSelect) end end return pollyrequester