// Iterate phrases private static void IteratePhrases(TTSService service, TTSPreloadData preloadData, TTSPreloadIterateDelegate onIterate, Action <float> onProgress, Action <string> onComplete) { // No service if (service == null) { onComplete?.Invoke("\nNo TTSService found in current scene"); return; } // No preload data if (preloadData == null) { onComplete?.Invoke("\nTTS Preload Data Not Found"); return; } // Ignore if running if (Application.isPlaying) { onComplete?.Invoke("Cannot preload while running"); return; } // Unload previous coroutine performer if (_performer != null) { MonoBehaviour.DestroyImmediate(_performer.gameObject); _performer = null; } // Run new coroutine _performer = CoroutineUtility.StartCoroutine(PerformIteratePhrases(service, preloadData, onIterate, onProgress, onComplete)); }
// Perform iterate private static IEnumerator PerformIteratePhrases(TTSService service, TTSPreloadData preloadData, TTSPreloadIterateDelegate onIterate, Action <float> onProgress, Action <string> onComplete) { // Get cache settings TTSDiskCacheSettings cacheSettings = new TTSDiskCacheSettings() { DiskCacheLocation = TTSDiskCacheLocation.Preload }; // Get total phrases int phraseTotal = 0; foreach (var voice in preloadData.voices) { if (voice.phrases == null) { continue; } foreach (var phrase in voice.phrases) { phraseTotal++; } } // Begin onProgress?.Invoke(0f); // Iterate int phraseCount = 0; float phraseInc = 1f / (float)phraseTotal; string log = string.Empty; for (int v = 0; v < preloadData.voices.Length; v++) { // Get voice data TTSPreloadVoiceData voiceData = preloadData.voices[v]; // Get voice TTSVoiceSettings voiceSettings = service.GetPresetVoiceSettings(voiceData.presetVoiceID); if (voiceSettings == null) { log += "\n-Missing Voice Setting: " + voiceData.presetVoiceID; phraseCount += voiceData.phrases.Length; continue; } // Iterate phrases for (int p = 0; p < voiceData.phrases.Length; p++) { // Iterate progress float progress = (float)phraseCount / (float)phraseTotal; onProgress?.Invoke(progress); phraseCount++; // Iterate yield return(onIterate(service, cacheSettings, voiceSettings, voiceData.phrases[p], (p2) => onProgress?.Invoke(progress + p2 * phraseInc), (l) => log += l)); } } // Complete onProgress?.Invoke(1f); onComplete?.Invoke(log); }