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); }
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, }); } } } }
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; } }