Как обрабатывать длительные текстовые звонки Microsoft Cognitive Services в Twilio Flow - PullRequest
0 голосов
/ 20 июня 2019

Вызов webapi на основе ядра .net из потока Twilio завершается неудачно из-за того, что основной вызов webapi к когнитивной службе Microsoft длится более 5 секунд.Любая идея о том, как сделать вызов быстрее?

Я создал контроллер WebAPI на основе ядра .net, который генерирует mp3-файл, создаваемый службой преобразования речи в текст в Microsoft Cognitive.работает отлично.Однако при вызове его из потока Twilio поток завершается сбоем из-за того, что для завершения работы службы tts требуется более 5 секунд.Первый этап - получение токена доступа от MS занимает около 2,5 секунд, а затем сам tts - около 3 секунд.5 секунд - это максимум, которое Twilio допускает для возврата вызова, поэтому он терпит неудачу.

любая идея о том, как управлять токеном доступа к службе Cognitive (действителен в течение 10 минут Microsoft), поэтому он будет регенерирован впараллельно, поэтому мне не придется тратить 2,5 секунды на каждый вызов?

Я не могу использовать службу преобразования текста в речь Twilio, поскольку Twilio не поддерживает иврит (они поддерживают иврит только для преобразования речи в текст)).

public class AzureSSAuthentication
    {
        public string subscriptionKey;
        private string tokenFetchUri;

        public AzureSSAuthentication(string tokenFetchUri, string subscriptionKey)
        {
            if (string.IsNullOrWhiteSpace(tokenFetchUri))
            {
                throw new ArgumentNullException(nameof(tokenFetchUri));
            }
            if (string.IsNullOrWhiteSpace(subscriptionKey))
            {
                throw new ArgumentNullException(nameof(subscriptionKey));
            }
            this.tokenFetchUri = tokenFetchUri;
            this.subscriptionKey = subscriptionKey;
         }

        public async Task<string> FetchTokenAsync()
        {
            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", this.subscriptionKey);
                UriBuilder uriBuilder = new UriBuilder(this.tokenFetchUri);

                var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, null).ConfigureAwait(false);
                return await result.Content.ReadAsStringAsync().ConfigureAwait(false);
            }
        }
    }
/////////////// Controller    

[Route("api/[controller]")]
public class TTSController : Controller
    {
        // GET api/values/SomethingToSay
        [HttpGet("{text}")]
        [Route("Say")]
        public async Task<FileContentResult> Get(string text)
        {
            string accessToken;
            AzureSSAuthentication auth = new AzureSSAuthentication("https://westeurope.api.cognitive.microsoft.com/sts/v1.0/issuetoken", "<MyToken>");
            //try
            //{

            accessToken = await auth.FetchTokenAsync().ConfigureAwait(false);
                string host = "https://westeurope.tts.speech.microsoft.com/cognitiveservices/v1";
                string body = @"<speak version='1.0' xmlns='https://www.w3.org/2001/10/synthesis' xml:lang='he-IL'>" +
                                "<voice name='Microsoft Server Speech Text to Speech Voice (he-IL, Asaf)'>" +
                                text + "</voice></speak>";
                using (var client = new HttpClient())
                {
                    using (var request = new HttpRequestMessage())
                    {
                        // Set the HTTP method
                        request.Method = HttpMethod.Post;

                        request.RequestUri = new Uri(host);

                        request.Content = new StringContent(body, Encoding.UTF8, "application/ssml+xml");

                        request.Headers.Add("Authorization", "Bearer " + accessToken);
                        request.Headers.Add("Connection", "Keep-Alive");
                        request.Headers.Add("User-Agent", "sayWhat");
                        request.Headers.Add("X-Microsoft-OutputFormat", "riff-24khz-16bit-mono-pcm");
                        using (var response = await client.SendAsync(request).ConfigureAwait(false))
                        {
                            response.EnsureSuccessStatusCode();
                            // Asynchronously read the response
                            using (var dataStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
                            {
                                byte[] dataByteArray = new byte[dataStream.Length];
                                dataStream.Read(dataByteArray, 0, (int)dataStream.Length);
                                return File(dataByteArray, "audio/mpeg", "audio.mp3");
                            }
                        }
                    }
                }

            //}
            //catch (Exception ex)
            //{
            //    return BadRequest(ex.Message);
            //}
        }
    }

Это займет слишком много времени.

1 Ответ

0 голосов
/ 03 июля 2019

Я собираюсь сделать что-то очень похожее, и меня беспокоит время для служб MS. Я также имею дело с текстом в речь. Поток, который я рассматривал, состоял в том, чтобы позвонить в MS Cognitive services до вызова и временно сохранить MP3. После завершения вызова удалите файл MP3. Таким образом, у вас уже есть файл MP3 до того, как вы совершите звонок.

...