Xamarin Формирует потоковое аудио с использованием Plugin.AudioRecorder и отправки в Google Cloud Speech V1 - PullRequest
0 голосов
/ 08 мая 2019

Я использую плагин AudioRecorder в проекте Xamarin Forms и пытаюсь передать аудио в Google Cloud Speech V1. Если я использую подход на основе событий API и отправляю объект RecognitionAudio, сгенерированный RecognitionAudio.FromFile(), он работает.

Но когда я пытаюсь использовать метод RecognitionAudio.FromStream(), передав ему recorder.GetAudioFileStream(), он ловит следующее исключение:

{System.NullReferenceException: Object reference not set to an instance of an object.
  at Plugin.AudioRecorder.AudioRecorderService.GetAudioFileStream () [0x00000] in C:\Repos\libs\Plugin.AudioRecorder\Plugin.AudioRecorder.Shared\AudioRecorderService.cs:135 
  at MyProject.Droid.GoogleSpeechToTextRecorder+<StreamingMicRecognizeAsync>d__1.MoveNext () [0x00053] in C:\Users\admin\Desktop\My Project\MyProject.Droid\GoogleSpeechToTextRecorder.cs:30 }

Где 30-я строка в GoogleSpeechToTextRecorder.cs равна

AudioFunctions.WriteWavHeader(recorder.GetAudioFileStream(), 0, 48000, 24);

Сначала я создаю рекордер, а затем добавляю WAV-заголовок в поток.

recorder = new AudioRecorderService
{
    StopRecordingOnSilence = false,
    StopRecordingAfterTimeout = true,
    TotalAudioTimeout = TimeSpan.FromSeconds(59)
};

AudioFunctions.WriteWavHeader(recorder.GetAudioFileStream(), 0, 48000, 24);

await recorder.StartRecording();

// Credentials for Google

var channel = new Channel(SpeechClient.DefaultEndpoint.Host,
                          SpeechClient.DefaultEndpoint.Port,
                          credential.ToChannelCredentials());

var speech = SpeechClient.Create(channel, new SpeechSettings());

var responseThis = speech.Recognize(new RecognitionConfig()
                    {
                        Encoding = RecognitionConfig.Types.AudioEncoding.Linear16,
                        SampleRateHertz = 48000,
                        LanguageCode = "en",
                    }, RecognitionAudio.FromStream(recorder.GetAudioFileStream()));
foreach (var result in responseThis.Results)
{
    foreach (var alternative in result.Alternatives)
        Console.WriteLine(alternative.Transcript);
}

Является ли это правильным подходом к двусторонней речи в текст через Google Cloud API и что я в этом делаю неправильно?

...