Асинхронные проблемы с Google Cloud Speech API - 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 голосов
/ 14 сентября 2018

Проблема мэра заключается в выделении части потоковой передачи для отправки речевого запроса. Я нашел код Google-Cloud-Speech-Node-Socket-Playground , который может помочь вам с веб-сокетами и интеграцией речи, взгляните на функцию, которая управляет запросом Google Speech:

function startRecognitionStream(client, data) {
    recognizeStream = speechClient.streamingRecognize(request)
        .on('error', console.error)
        .on('data', (data) => {
            process.stdout.write(
                (data.results[0] && data.results[0].alternatives[0])
                    ? `Transcription: ${data.results[0].alternatives[0].transcript}\n`
                    : `\n\nReached transcription time limit, press Ctrl+C\n`);
            client.emit('speechData', data);

            // if end of utterance, let's restart stream
            // this is a small hack. After 65 seconds of silence, the stream will still throw an error for speech length limit
            if (data.results[0] && data.results[0].isFinal) {
                stopRecognitionStream();
                startRecognitionStream(client);
                // console.log('restarted stream serverside');
            }
        });
}

Имейте в виду, что плохое качество звука приведет к плохим результатам. Попробуйте следовать рекомендациям относительно звука.

Мне следует узнать разработчика (Винзенц Обри), потому что его программа работает отлично!

...