Example #1
0
        public void Tick()
        {
            // Schedule all channels
            Channel1.Tick();
            Channel2.Tick();
            Channel3.Tick();
            Channel4.Tick();

            // At a given sample rate read samples from enabled channels
            if (ticks++ == 4057200 / SampleRate)
            {
                if (Enabled)
                {
                    float sample = (Channel1.Enabled ? Channel1.Next(SampleRate) : 0) +
                                   (Channel2.Enabled ? Channel2.Next(SampleRate) : 0) +
                                   (Channel3.Enabled ? Channel3.Next(SampleRate) : 0) +
                                   (Channel4.Enabled ? Channel4.Next(SampleRate) : 0);
                    samplebuffer.Add(sample);
                    if (samples++ == BufferSize)
                    {
                        AudioAvailable?.Invoke(this, new AudioAvailableEventArgs(samplebuffer.ToArray(), SampleRate));
                        samplebuffer.Clear();
                        samples = 0;
                    }
                }
                ticks = 0;
            }
        }
Example #2
0
 void SourceDataAvailable(object sender, DataAvailableEventArgs eventArgs)
 {
     try
     {
         AudioAvailable?.Invoke(this, eventArgs);
     }
     catch (Exception ex)
     {
         ErrorHandler?.Invoke(ex.Message);
     }
 }
        /// <summary>
        /// Sends the specified text to be spoken to the TTS service and saves the response audio to a file.
        /// </summary>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>A Task</returns>
        public Task Speak(CancellationToken cancellationToken)
        {
            var cookieContainer = new CookieContainer();
            var handler         = new HttpClientHandler()
            {
                CookieContainer = cookieContainer
            };
            var client = new HttpClient(handler);

            foreach (var header in this.inputOptions.Headers)
            {
                client.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value);
            }

            var genderValue = "";

            switch (this.inputOptions.VoiceType)
            {
            case Gender.Male:
                genderValue = "Male";
                break;

            case Gender.Female:
            default:
                genderValue = "Female";
                break;
            }

            var request = new HttpRequestMessage(HttpMethod.Post, this.inputOptions.RequestUri)
            {
                Content = new StringContent(GenerateSsml(this.inputOptions.Locale, genderValue, this.inputOptions.VoiceName, this.inputOptions.Text))
            };

            var httpTask = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

            var saveTask = httpTask.ContinueWith(
                async(responseMessage, token) =>
            {
                try
                {
                    if (responseMessage.IsCompleted && responseMessage.Result != null && responseMessage.Result.IsSuccessStatusCode)
                    {
                        var httpStream = await responseMessage.Result.Content.ReadAsByteArrayAsync();
                        AudioAvailable?.Invoke(this, new GenericEventArgs <byte[]>(httpStream));
                    }
                    else
                    {
                        string errorContent = responseMessage.Result.ReasonPhrase;
                        var stringContent   = await responseMessage.Result.Content.ReadAsStringAsync();
                        Error?.Invoke(this, new GenericEventArgs <Exception>(new Exception(String.Format("Service returned {0}", errorContent))));
                        Error?.Invoke(this, new GenericEventArgs <Exception>(new Exception(String.Format("Service returned {0}", stringContent))));
                    }
                }
                catch (Exception e)
                {
                    this.Error?.Invoke(this, new GenericEventArgs <Exception>(e.GetBaseException()));
                }
                finally
                {
                    request.Dispose();
                    client.Dispose();
                    handler.Dispose();
                }
            },
                TaskContinuationOptions.AttachedToParent,
                cancellationToken);

            return(saveTask);
        }