Я использую плагин 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 и что я в этом делаю неправильно?