Example #1
0
        public void run(string text)
        {
            iSpeechSynthesis iSpeech = new iSpeechSynthesis(_api, _production);

            iSpeech.setVoice("usenglishfemale");
            iSpeech.setOptionalCommands("format", "mp3");

            TTSResult result = iSpeech.speak(text);

            byte [] audioData = new byte[result.getAudioFileLength()];

            int read      = 0;
            int totalRead = 0;

            while (totalRead < audioData.Length)
            {
                read       = result.getStream().Read(audioData, totalRead, audioData.Length - totalRead);
                totalRead += read;
            }


            FileStream   fs = new FileStream("audio.mp3", FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);

            bw.Write(audioData, 0, audioData.Length);
        }
Example #2
0
        private async void StartReceiving(ClientWebSocket client)
        {
            if (_result != null)
            {
                _result.Clear();
            }
            while (true)
            {
                try
                {
                    if (client.CloseStatus == WebSocketCloseStatus.EndpointUnavailable ||
                        client.CloseStatus == WebSocketCloseStatus.InternalServerError ||
                        client.CloseStatus == WebSocketCloseStatus.EndpointUnavailable)
                    {
                        Status = ServiceStatus.Stopped;
                        return;
                    }
                    //唔,足够大的缓冲区
                    var array   = new byte[100000];
                    var receive = await client.ReceiveAsync(new ArraySegment <byte>(array), CancellationToken.None);

                    if (receive.MessageType == WebSocketMessageType.Text)
                    {
                        if (receive.Count <= 0)
                        {
                            continue;
                        }

                        string msg = Encoding.UTF8.GetString(array, 0, receive.Count);
                        //TTSResult result = JsonSerializer.Deserialize<TTSResult>(msg, new JsonSerializerOptions()
                        //{
                        //    PropertyNameCaseInsensitive = true
                        //});
                        TTSResult result = JsonConvert.DeserializeObject <TTSResult>(msg);
                        if (result.Code != 0)
                        {
                            throw new Exception($"Result error: {result.Message}");
                        }
                        if (result.Data == null)
                        {
                            //空帧,不用管
                            continue;
                        }
                        byte[] audiaBuffer = System.Convert.FromBase64String(result.Data.Audio);
                        _result.AddRange(audiaBuffer);

                        OnMessage?.Invoke(this, result.Data.Audio);

                        if (result.Data.Status == 2)
                        {
                            Status = ServiceStatus.Stopped;
                        }
                    }
                }
                catch (WebSocketException)
                {
                    Status = ServiceStatus.Stopped;
                    return;
                }
                catch (Exception ex)
                {
                    Status = ServiceStatus.Stopped;
                    if (!ex.Message.ToLower().Contains("unable to read data from the transport connection"))
                    {
                        OnError?.Invoke(this, new ErrorEventArgs()
                        {
                            Code      = ResultCode.Error,
                            Message   = ex.Message,
                            Exception = ex,
                        });
                    }
                }
            }
        }
Example #3
0
        private async Task <MemoryStream> MainMethod(string input)
        {
            MemoryStream outstream = null;

            try
            {
                // 对要合成语音的文字先用utf-8然后进行URL加密
                byte[] textData = Encoding.UTF8.GetBytes(input);
                input = HttpUtility.UrlEncode(textData);

                string param = JsonHelper.SerializeObject(_data);
                // 获取十位的时间戳
                TimeSpan ts      = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                string   curTime = System.Convert.ToInt64(ts.TotalSeconds).ToString();
                // 对参数先utf-8然后用base64编码
                byte[] paramData  = Encoding.UTF8.GetBytes(param);
                string paraBase64 = System.Convert.ToBase64String(paramData);
                // 形成签名
                string checkSum = Md5(_settings.ApiKey + curTime + paraBase64);

                // 组装http请求头
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckCertificate);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_settings.TTSUrl);
                request.Method            = "POST";
                request.ContentType       = "application/x-www-form-urlencoded";
                request.AllowAutoRedirect = true;
                request.Proxy             = null;
                request.Headers.Add("X-Param", paraBase64);
                request.Headers.Add("X-CurTime", curTime);
                request.Headers.Add("X-Appid", _settings.AppID);
                request.Headers.Add("X-CheckSum", checkSum);

                //.Net Core必须添加,不然会报异常
                Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                Stream requestStream = await request.GetRequestStreamAsync();

                StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.GetEncoding("gb2312"));
                streamWriter.Write(string.Format("text={0}", input));
                streamWriter.Close();

                string          htmlStr  = string.Empty;
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("UTF-8")))
                    {
                        string header_type = response.Headers["Content-Type"];
                        if (header_type.ToLower() == "audio/mpeg")
                        {
                            Stream st = response.GetResponseStream();
                            outstream = new MemoryStream();
                            const int bufferLen = 4096;
                            byte[]    buffer    = new byte[bufferLen];
                            int       count     = 0;
                            while ((count = st.Read(buffer, 0, bufferLen)) > 0)
                            {
                                outstream.Write(buffer, 0, count);
                            }
                        }
                        else if (header_type.ToLower() == "text/plain")
                        {
                            htmlStr = reader.ReadToEnd();
                            TTSResult result = JsonHelper.DeserializeJsonToObject <TTSResult>(htmlStr);
                            throw new Exception($"{result.Code}|{result.Sid}|{result.Desc}");
                        }
                        else
                        {
                            htmlStr = reader.ReadToEnd();
                            throw new Exception(htmlStr);
                        }
                    }
                    responseStream.Close();
                }
                return(outstream);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }