описание проблемы
Я разработчик .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 при работе с аудиофайлом с разреженной речью? Есть ли метод, с помощью которого я могу программно фильтровать звук до только произнесенных слов, а затем обрабатывать это? Я открыт для предложений, но мои исследования и попытки привели меня только к дальнейшему нарушению моего кода.