private async void InitializeAudioClip() { if (Application.isPlaying == false) { return; } if (Text == null) { Debug.LogWarning("No text provided"); return; } if (string.IsNullOrEmpty(Text.Value)) { Debug.LogWarning($"No text provided for key '{Text.Key}'"); return; } isLoading = true; try { TextToSpeechConfiguration ttsConfiguration = RuntimeConfigurator.Configuration.GetTextToSpeechConfiguration(); ITextToSpeechProvider provider = TextToSpeechProviderFactory.Instance.CreateProvider(ttsConfiguration); AudioClip = await provider.ConvertTextToSpeech(Text.Value); } catch (Exception exception) { Debug.LogWarning(exception.Message); } isLoading = false; }
public async Task SetProvider(ITextToSpeechProvider item) { SelectedProvider = item; SelectedVoice = await DefaultVoice(); Settings.Default.LastProvider = item.Name; Settings.Default.LastVoice = SelectedVoice.Name; Settings.Default.Save(); OnPropertyChanged(nameof(SelectedProvider)); OnPropertyChanged(nameof(SelectedVoice)); OnPropertyChanged(nameof(VoiceList)); }
/// <summary> /// Creates an provider with given config. /// </summary> public ITextToSpeechProvider CreateProvider(TextToSpeechConfiguration configuration) { if (string.IsNullOrEmpty(configuration.Provider)) { throw new NoConfigurationFoundException($"There is not a valid provider set in '{configuration.GetType().Name}'!"); } if (!registeredProvider.ContainsKey(configuration.Provider)) { throw new NoMatchingProviderFoundException($"No matching provider with name '{configuration.Provider}' found!"); } ITextToSpeechProvider provider = registeredProvider[configuration.Provider].Create(configuration); if (configuration.UseStreamingAssetFolder) { provider = new FileTextToSpeechProvider(provider, configuration); } return(provider); }
public FileTextToSpeechProvider(ITextToSpeechProvider fallbackProvider, IAudioConverter audioConverter, TextToSpeechConfiguration configuration) { Configuration = configuration; AudioConverter = audioConverter; FallbackProvider = fallbackProvider; }
public FileTextToSpeechProvider(ITextToSpeechProvider fallbackProvider, TextToSpeechConfiguration configuration) { Configuration = configuration; FallbackProvider = fallbackProvider; }
public void GenerateWAVs(string fragFilePath, string csvFilePath, string outputFolder, ITextToSpeechProvider textToSpeechProvider, int maxDegreeOfParallelism = -1) { var startTime = DateTime.Now; EnsureOutputFolderExists(outputFolder); var fragFile = LoadFragFile(fragFilePath); var csvLines = ATCVoiceFileReader.ReadBMSVoiceStringCSVFile(csvFilePath); var expectedNumWavsToGenerate = fragFile.headers.Sum(x => x.totalSpeakers); Log.Info($"Generating {expectedNumWavsToGenerate} WAVs..."); var numWavFilesGenerated = 0; var numWavFilesSkipped = 0; Parallel.ForEach(fragFile.headers, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism }, header => { var fragNum = header.fragHdrNbr; Parallel.ForEach(header.data, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism }, data => { var fileName = Path.Combine(outputFolder, $"{data.fileNbr}.WAV"); var voice = data.speaker; var text = csvLines.Where(x => x.FragNum == fragNum).First().SpeakerText[voice]; var itemsProcessed = numWavFilesGenerated + numWavFilesSkipped; var pctComplete = Math.Round(((float)(itemsProcessed) / (float)expectedNumWavsToGenerate) * 100, 2); var timeElapsed = DateTime.Now.Subtract(startTime); var timePerItem = timeElapsed.Ticks / (numWavFilesGenerated + 1); var itemsRemaining = expectedNumWavsToGenerate - itemsProcessed; var timeRemaining = TimeSpan.FromTicks(itemsRemaining * timePerItem); if (!File.Exists(fileName)) { Log.Info($"[{itemsProcessed} / {expectedNumWavsToGenerate} ({pctComplete:0.00}%), Time Remaining: {timeRemaining:hh\\:mm\\:ss}] Generating WAV file for Frag #:{fragNum:00000}; Speaker #:{voice:00}; Text=\"{text.Replace("\"", "\\\"")}\" | File:\"{fileName}\" ..."); try { ConvertTextToSpeech(text, voice, textToSpeechProvider, fileName); Interlocked.Add(ref numWavFilesGenerated, 1); } catch (Exception e) { Log.Error(e.Message, e); } } else { Log.Info($"[{itemsProcessed} / {expectedNumWavsToGenerate} ({pctComplete:0.00}%), Time Remaining: {timeRemaining:hh\\:mm\\:ss}] Skippping WAV file for Frag #:{fragNum:00000}; Speaker #:{voice:00}; Text=\"{text.Replace("\"", "\\\"")}\" | File:\"{fileName}\" already exists."); Interlocked.Add(ref numWavFilesSkipped, 1); } });