private bool SpeakToFile(string[] splitData, string filePath)
        {
            if (!tmpVoicesAllocations.ContainsKey(splitData[1]))
            {
                // get random voice from selected voices by gender
                Voice[] voices    = GetSelectedVoices();
                Gender  gender    = (splitData[0] == "f") ? Gender.Female : Gender.Male;                      // get gender
                Voice[] genVoices = Array.FindAll(voices, delegate(Voice v) { return(v.Gender == gender); }); // find voices by gender
                genVoices = genVoices.Length == 0 ? voices : genVoices;                                       // if no voice for gender selected select ay
                tmpVoicesAllocations.Add(splitData[1], genVoices[new Random().Next(genVoices.Length)]);       // allocate voice to npcid
            }

            Voice voice = tmpVoicesAllocations[splitData[1]];

            string err = null;

            switch (voice.Module)
            {
            case Module.Windows:
                err = WindowsTTS.Speak(splitData[2], voice, filePath);
                break;

            case Module.Azure:
                err = AzureTTS.Speak(splitData[2], voice, filePath, config.AzureAPI);
                break;

            case Module.Google:
                err = GoogleTTS.Speak(splitData[2], voice, filePath);
                break;

            case Module.AWS:
                err = AwsTTS.Speak(splitData[2], voice, filePath, config.AwsAPI);
                break;
            }

            if (err != null)
            {
                OnError(err);
                return(false);
            }

            OnSpeechPrepare(voice);

            return(true);
        }
        private void VoiceTestSpeak(string txt, QuestToSpeech.Voice voice)
        {
            string err   = null;
            string fPath = Path.Combine(QuestToSpeech.TempDirectory, string.Format("test-{0}.wav", Util.MD5Hash(testString + voice.Name + voice.Module)));

            if (!File.Exists(fPath))
            {
                if (voice.Module == QuestToSpeech.Module.Windows)
                {
                    err = WindowsTTS.Speak(testString, voice, fPath);
                }
                else if (voice.Module == QuestToSpeech.Module.Azure)
                {
                    err = AzureTTS.Speak(testString, voice, fPath, azureAPIConfig);
                }
                else if (voice.Module == QuestToSpeech.Module.Google)
                {
                    err = GoogleTTS.Speak(testString, voice, fPath);
                }
                else if (voice.Module == QuestToSpeech.Module.AWS)
                {
                    err = AwsTTS.Speak(testString, voice, fPath, awsAPIConfig);
                }
            }

            if (err != null)
            {
                MessageBox.Show(err);
                return;
            }

            if (File.Exists(fPath))
            {
                if (player != null)
                {
                    player.Stop();
                    player.Dispose();
                }

                player = new SoundPlayer(fPath);
                player.Play();
            }
        }
        public Voice[] GetAvailableVoices()
        {
            if (cachedAvailableVoices != null)
            {
                return(cachedAvailableVoices);
            }

            List <Voice> voices = new List <Voice>();

            if (config.EnabledModules.Contains(Module.Windows))
            {
                Voice[] arr = new Voice[0];

                string err = WindowsTTS.GetVoices(ref arr);

                if (err != null)
                {
                    OnError(err);
                    return(null);
                }
                else
                {
                    voices.AddRange(arr);
                }
            }

            if (config.EnabledModules.Contains(Module.Azure))
            {
                Voice[] arr = new Voice[0];

                string err = AzureTTS.GetVoices(ref arr, config.AzureAPI);

                if (err != null)
                {
                    OnError(err);
                    return(null);
                }
                else
                {
                    voices.AddRange(arr);
                }
            }

            if (config.EnabledModules.Contains(Module.Google))
            {
                Voice[] arr = new Voice[0];

                string err = GoogleTTS.GetVoices(ref arr);

                if (err != null)
                {
                    OnError(err);
                    return(null);
                }
                else
                {
                    voices.AddRange(arr);
                }
            }

            if (config.EnabledModules.Contains(Module.AWS))
            {
                Voice[] arr = new Voice[0];

                string err = AwsTTS.GetVoices(ref arr, config.AwsAPI);

                if (err != null)
                {
                    OnError(err);
                    return(null);
                }
                else
                {
                    voices.AddRange(arr);
                }
            }

            cachedAvailableVoices = voices.ToArray();             // cache list

            return(cachedAvailableVoices);
        }