Exemple #1
0
        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;
 }
Exemple #6
0
        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);
                    }
                });