Google Speech Client выдает ошибку: «Процесс не может получить доступ к файлу, поскольку он используется другим процессом» после того, как я прекращаю запись с помощью NAudio - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь записать звук с помощью NAudio и отправить его в Google Speech API для возврата текста (у меня нет потоковой передачи, поскольку языковая поддержка недостаточно хороша), и я не могу соединить запись и отправку под одной кнопкойнажмите (это точка приложения), потому что я получаю сообщение об ошибке, что файл используется, хотя я закрываю файл и затем вызываю функцию Google Speech

Я попытался поместить запись и отправку в две разные кнопки и при нажатии кнопки отправкиВызываю функцию закрытия записи перед отправкой.Я все еще получаю ту же ошибку.Так что мне просто нужно дождаться окончания записи и затем использовать send.

//code from google speach documentations page
public string GoogleSpeach()
        {
            var speech = SpeechClient.Create();
            var text = "";
            var response = speech.Recognize(new RecognitionConfig()
            {
                Encoding = RecognitionConfig.Types.AudioEncoding.Linear16,
                SampleRateHertz = 16000,
                LanguageCode = "ka",
            }, RecognitionAudio.FromFile("C:/Temp/Test0001.wav"));
            foreach (var result in response.Results)
            {
                foreach (var alternative in result.Alternatives)
                {
                    text += (alternative.Transcript).ToString();
                }
            }
            return text;
        }
//recording button click code
Timer timer = new Timer();
timer.Interval = 5000;
            timer.Tick += StopSoundRecording;
            timer.Start();
            waveSource = new WaveIn();
            waveSource.WaveFormat = new WaveFormat(16000, 1);
            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
            waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
            waveFile = new WaveFileWriter("C:/Temp/Test0001.wav", waveSource.WaveFormat);
            waveSource.StartRecording();
//sending button click code
if (recordingStopped == false)
            {
                waveSource.StopRecording();
                waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
                recordingStopped = true;
                timer.Stop();
            }
string text = GoogleSpeach();
void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveFile != null)
            {
                waveFile.Write(e.Buffer, 0, e.BytesRecorded);
                waveFile.Flush();
            }
        }
        void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
        {
            if (waveSource != null)
            {
                waveSource.Dispose();
                waveSource = null;
            }

            if (waveFile != null)
            {
                waveFile.Dispose();
                waveFile = null;
            }
        }
...