.Audio Timeout Error: NET Core Google Speech to Text Code вызывает тайм-аут.

описание проблемы

Я разработчик .NET Core, и меня недавно попросили расшифровать аудиофайлы в формате mp3 продолжительностью около 20 минут в текст. Таким образом, размер файла составляет около 30,5 МБ. Проблема в том, что речь в этом файле скудна: от 2 минут между произносимым предложением до 4 минут по длине.

Я написал небольшую службу на основе документации Google Speech, которая отправляет 32 КБ потоковых данных для обработки из файла за раз. Все шло хорошо, пока я не столкнулся с этой ошибкой, о которой рассказываю ниже:

введите описание изображения здесь

Я искал через google-fu, форумы google и другие источники и не обнаружил документации по этой ошибке. Достаточно сказать, я думаю, это связано с редкостью произнесенных слов в моем файле? Мне интересно, есть ли программно-ориентированный обходной путь?

Код

Я использовал код, который представляет собой небольшую модификацию образца google .net для потоковой передачи 32 КБ. Вы можете найти это здесь.

 public async void Run()
 {

            var speech = SpeechClient.Create();
            var streamingCall = speech.StreamingRecognize();
            // Write the initial request with the config.
            await streamingCall.WriteAsync(
                new StreamingRecognizeRequest()
                {
                    StreamingConfig = new StreamingRecognitionConfig()
                    {
                        Config = new RecognitionConfig()
                        {
                            Encoding =
                            RecognitionConfig.Types.AudioEncoding.Flac,
                            SampleRateHertz = 22050,
                            LanguageCode = "en",
                        },
                        InterimResults = true,
                    }
                });



            // Helper Function: Print responses as they arrive.
            Task printResponses = Task.Run(async () =>
            {
                while (await streamingCall.ResponseStream.MoveNext(
                    default(CancellationToken)))
                {
                    foreach (var result in streamingCall.ResponseStream.Current.Results)
                    {

                        //foreach (var alternative in result.Alternatives)
                        //{
                        //    Console.WriteLine(alternative.Transcript);
                        //}
                        if(result.IsFinal)
                        {
                            Console.WriteLine(result.Alternatives.ToString());
                        }
                    }
                }

            });

            string filePath = "mono_1.flac";
            using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
            {
                //var buffer = new byte[32 * 1024];
                var buffer = new byte[64 * 1024]; //Trying 64kb buffer 
                int bytesRead;
                while ((bytesRead = await fileStream.ReadAsync(
                    buffer, 0, buffer.Length)) > 0)
                {
                    await streamingCall.WriteAsync(
                        new StreamingRecognizeRequest()
                        {
                            AudioContent = Google.Protobuf.ByteString
                            .CopyFrom(buffer, 0, bytesRead),
                        });
                    await Task.Delay(500);
                };
            }
            await streamingCall.WriteCompleteAsync();
            await printResponses;


        }//End of Run 

Попытки

Я увеличил поток до 64 КБ потоковых данных для обработки, а затем получил следующую ошибку, как показано ниже:

введите описание изображения здесь

Что, я считаю, означает, что истекло время ожидания API. Что, безусловно, является шагом в неправильном направлении. Кто-нибудь сталкивался с такой проблемой, как моя, с Google Speech Api при работе с аудиофайлом с разреженной речью? Есть ли метод, с помощью которого я могу программно фильтровать звук до только произнесенных слов, а затем обрабатывать это? Я открыт для предложений, но мои исследования и попытки привели меня только к дальнейшему нарушению моего кода.


person hlyates    schedule 17.01.2018    source источник
comment
cloud.google.com/appengine/articles/deadlineexceedederrors   -  person DaImTo    schedule 17.01.2018
comment
@DalmTo Спасибо за ответ. Я прочту это подробно. Документы кажутся ориентированными на python / go / java, но наверняка есть аналогичные хуки в .NET api?   -  person hlyates    schedule 17.01.2018
comment
API такой же, как и используемая вами библиотека. Какой именно пакет nuget вы используете   -  person DaImTo    schedule 19.01.2018


Ответы (1)


Есть способ распознавания звука в Google Speech API:

  • нормально признать
  • давно работающий признать

В вашем образце используется обычное распознавание, которое ограничено 15 минутами. Попробуйте использовать метод длительного распознавания:

    {
        var speech = SpeechClient.Create();
        var longOperation = speech.LongRunningRecognize( new RecognitionConfig()
        {
            Encoding = RecognitionConfig.Types.AudioEncoding.Linear16,
            SampleRateHertz = 16000,
            LanguageCode = "hu",
        }, RecognitionAudio.FromFile( filePath ) );
        longOperation = longOperation.PollUntilCompleted();
        var response = longOperation.Result;
        foreach ( var result in response.Results )
        {
            foreach ( var alternative in result.Alternatives )
            {
                Console.WriteLine( alternative.Transcript );
            }
        }
        return 0;
    }

Надеюсь, это поможет вам.

person György Gulyás    schedule 07.03.2018