【API】調用微軟語音服務

自定義語音合成 可 參考:https://mp.weixin.qq.com/s/THFmz4uNpb0lNYWshaZ2qQ

合成微軟語音曉曉 可 參考:https://www.cnblogs.com/viter/p/10685402.html

 

圖靈聊天機器人API:

    public class TulingHelper
    {
        private const string HOST = "http://openapi.tuling123.com/openapi/api/v2";
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();

        public static async Task<string> RequestTuling(string text)
        {
            try
            {
                using (var httpClient = new HttpClient())
                {
                    var body = "{'reqType':0,'perception': {'inputText': {'text': '" + text + "'}},'userInfo': {'apiKey': '*****','userId': '267842'}}";
                    var request = new HttpRequestMessage()
                    {
                        Method = HttpMethod.Post,
                        RequestUri = new Uri(HOST),
                        Content = new StringContent(body, Encoding.UTF8)
                    };

                    var response = await httpClient.SendAsync(request);
                    if (response.StatusCode != System.Net.HttpStatusCode.OK)
                    {
                        Console.WriteLine("The Response {0}", response.StatusCode);
                        return null;
                    }
                    var responseString = await response.Content.ReadAsStringAsync();
                    var obj = JObject.Parse(responseString);
                    return (string)obj["results"][0]["values"]["text"];
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex, ex.Message);
                return "出錯了";
            }
        }
    }

微軟語音合成API:

    public class VoicesHelper
    {
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();

        private const string TOKEN_URI = "https://southeastasia.api.cognitive.microsoft.com/sts/v1.0/issuetoken";
        private const string SUB_KEY = "*****";
        private const string HOST = "https://southeastasia.voice.speech.microsoft.com/cognitiveservices/v1?deploymentId=***";
        private const string RESOURCE_NAME = "SpeechSerivce";

        public static async Task<string> GetTokenAsync()
        {
            try
            {
                using (var httpClient = new HttpClient())
                {
                    httpClient.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", SUB_KEY);
                    var builder = new UriBuilder(TOKEN_URI);
                    var result = await httpClient.PostAsync(builder.Uri.AbsoluteUri, null);
                    return await result.Content.ReadAsStringAsync();
                }

            }
            catch (Exception ex)
            {
                logger.Error(ex, ex.Message);
                return "出錯了";
            }
        }

        public static async Task RequestSSML(string authToken, string text, string fileName)
        {
            try
            {
                using (var httpClient = new HttpClient())
                {
                    var body = "<speak xmlns=\"http://www.w3.org/2001/10/synthesis\" xmlns:mstts=\"http://www.w3.org/2001/mstts\" version=\"1.0\" xml:lang=\"zh-CN\"><voice name=\"xixi\">" + text + "</voice></speak>";
                    var request = new HttpRequestMessage()
                    {
                        Method = HttpMethod.Post,
                        RequestUri = new Uri(HOST),
                        Content = new StringContent(body, Encoding.UTF8, "application/ssml+xml")
                    };
                    request.Headers.Add("Authorization", "Bearer " + authToken);
                    request.Headers.Add("Connection", "Keep-Alive");
                    request.Headers.Add("User-Agent", RESOURCE_NAME);
                    request.Headers.Add("X-Microsoft-OutputFormat", "riff-24khz-16bit-mono-pcm");

                    var response = await httpClient.SendAsync(request);
                    if (response.StatusCode != System.Net.HttpStatusCode.OK)
                    {
                        Console.WriteLine("The Response {0}", response.StatusCode);
                        return;
                    }
                    using (var stream = await response.Content.ReadAsStreamAsync())
                    {
                        stream.Position = 0;
                        using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
                        {
                            await stream.CopyToAsync(fs);
                            fs.Close();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex, ex.Message);
            }
        }
    }

調用這兩個API:

[HttpPost]
public IActionResult Voices(Context context)
{
    logger.LogError(520, $"問:{ context.body}");
    var text = TulingHelper.RequestTuling(context.body).ConfigureAwait(false).GetAwaiter().GetResult();
    logger.LogError(521, $"答:{text}");

    var result = VoicesHelper.GetTokenAsync().ConfigureAwait(false).GetAwaiter();
    string token = result.GetResult();

    string fileName = $"/voiceswav/{Guid.NewGuid().ToString()}.wav";
    var task1 = VoicesHelper.RequestSSML(token, text, $"./wwwroot{fileName}");
    task1.ConfigureAwait(false).GetAwaiter().GetResult();
    return Ok(fileName);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章