API Google Speech для потоковой передачи аудио из веб-сокета - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь получить окончательный результат транскрипции / распознавания речи из аудиопотока Fleck websocket. Метод OnOpen выполняет код при первом установлении соединения через веб-сокет, а метод OnBinary выполняет код при получении двоичных данных от клиента. Я проверил веб-сокет, повторив голос в веб-сокет и записав те же двоичные данные обратно в веб-сокет с той же скоростью. Этот тест сработал, поэтому я знаю, что двоичные данные отправляются правильно (640-байтовые сообщения с размером кадра 20 мс).

Поэтому мой код не работает, а не служба. Моя цель - сделать следующее:

  1. Когда соединение с веб-сокетом создано, отправьте начальный запрос аудиоконфигурации в API с помощью SingleUtterance == true
  2. Запустить фоновую задачу, которая прослушивает результаты потоковой передачи, ожидая isFinal == true
  3. Отправлять каждое полученное двоичное сообщение в API для транскрипции
  4. Когда фоновая задача распознает isFinal == true, остановите текущий потоковый запрос и создайте новый запрос - повторите шаги с 1 по 4

Контекст этого проекта транскрибирует все отдельные высказывания в прямом телефонном звонке.

socket.OnOpen = () =>
            {
                firstMessage = true;
            };
socket.OnBinary = async binary =>
            {
                var speech = SpeechClient.Create();
                var streamingCall = speech.StreamingRecognize();
                if (firstMessage == true)
                {
                    await streamingCall.WriteAsync(
                    new StreamingRecognizeRequest()
                    {
                        StreamingConfig = new StreamingRecognitionConfig()
                        {
                            Config = new RecognitionConfig()
                            {
                                Encoding = RecognitionConfig.Types.AudioEncoding.Linear16,
                                SampleRateHertz = 16000,
                                LanguageCode = "en",
                            },
                            SingleUtterance = true,
                        }
                    });
                    Task getUtterance = Task.Run(async () =>
                    {
                        while (await streamingCall.ResponseStream.MoveNext(
                            default(CancellationToken)))
                        {
                            foreach (var result in streamingCall.ResponseStream.Current.Results)
                            {
                                if (result.IsFinal == true)
                                {
                                    Console.WriteLine("This test finally worked");
                                }
                            }
                        }
                    });
                    firstMessage = false;
                }
                else if (firstMessage == false)
                {
                    streamingCall.WriteAsync(new StreamingRecognizeRequest()
                    {
                        AudioContent = Google.Protobuf.ByteString.CopyFrom(binary, 0, 640)
                    }).Wait();
                }
            };

1 Ответ

0 голосов
/ 09 сентября 2018

.Wait() - блокирующий вызов, вызываемый в асинхронном режиме / ожидании. Они плохо смешиваются и могут привести к тупикам.

Просто сохраняйте код асинхронным до конца

//...omitted for brevity

else if (firstMessage == false) {
    await streamingCall.WriteAsync(new StreamingRecognizeRequest() {
        AudioContent = Google.Protobuf.ByteString.CopyFrom(binary, 0, 640)
    });
}
...