Как правильно использовать StreamingRecognizeRequest из http аудио потока - PullRequest
0 голосов
/ 01 декабря 2018

Почему я не получаю никаких ответов (от StreamingRecognizeRequests) в моем методе responseObserver.onResponse () ниже?

Узнайте, как действовать дальше.

Код (упрощенный, чтобы выделить проблему как модификацию примера кода Google)

 <dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-speech</artifactId>
  <version>0.72.0-beta</version>
</dependency>

<dependency>
  <groupId>org.jflac</groupId>
  <artifactId>jflac-codec</artifactId>
  <version>1.5.2</version>
</dependency>

import com.google.api.gax.rpc.ClientStream;
import com.google.api.gax.rpc.ResponseObserver;
import com.google.api.gax.rpc.StreamController;
import com.google.cloud.speech.v1.*;
import com.google.protobuf.ByteString;
import org.jflac.sound.spi.FlacAudioFileReader;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.net.URL;
import java.util.ArrayList;

public static void streamingUrlRecognize(String url) {

ResponseObserver<StreamingRecognizeResponse> responseObserver = null;
try (SpeechClient client = SpeechClient.create()) {

  responseObserver =
      new ResponseObserver<StreamingRecognizeResponse>() {
        ArrayList<StreamingRecognizeResponse> responses = new ArrayList<>();

        public void onStart(StreamController controller) {}

        public void onResponse(StreamingRecognizeResponse response) {

          responses.add(response);
        }

        public void onComplete() {
          for (StreamingRecognizeResponse response : responses) {
            StreamingRecognitionResult result = response.getResultsList().get(0);
            SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
            System.out.printf("Transcript : %s\n", alternative.getTranscript());
          }
        }

        public void onError(Throwable t) {
          System.out.println(t);
        }
      };

  ClientStream<StreamingRecognizeRequest> clientStream =
      client.streamingRecognizeCallable().splitCall(responseObserver);

  RecognitionConfig recognitionConfig =
      RecognitionConfig.newBuilder()
          .setEncoding(RecognitionConfig.AudioEncoding.LINEAR16)
          .setLanguageCode("en-US")
          .setSampleRateHertz(16000)
          .build();

  StreamingRecognitionConfig streamingRecognitionConfig =
      StreamingRecognitionConfig.newBuilder().setConfig(recognitionConfig).build();

  StreamingRecognizeRequest request =
      StreamingRecognizeRequest.newBuilder()
          .setStreamingConfig(streamingRecognitionConfig)
          .build(); // The first request in a streaming call has to be a config

  FlacAudioFileReader mp= new FlacAudioFileReader();
  AudioInputStream in=mp.getAudioInputStream(new URL(url));
  AudioFormat targetFormat = new AudioFormat(16000, 16, 1, true, false);
  AudioInputStream audioInputStream=AudioSystem.getAudioInputStream(targetFormat, in);

  clientStream.send(request);

  long startTime = System.currentTimeMillis();

  while (true) {
    long estimatedTime = System.currentTimeMillis() - startTime;
    byte[] data = new byte[6400];
    audioInputStream.read(data);
    if (estimatedTime > 10000) { // 60 seconds
      break;
    }
    request =
        StreamingRecognizeRequest.newBuilder()
            .setAudioContent(ByteString.copyFrom(data))
            .build();
    clientStream.send(request);
  }
} catch (Exception e) {
  System.out.println(e);
}
responseObserver.onComplete();
}

Я смог подтвердить, что проблема не в аудиоформате.Когда я записываю буферы в ByteArrayOutputStream (baos) в течение установленного периода времени (например, 10 секунд), входные данные распознаются, и я получаю ответы обратно, как и ожидалось.

RecognitionAudio audio = RecognitionAudio.newBuilder()
    .setContent(ByteString.copyFrom(baos.toByteArray()))
    .build();

RecognizeResponse response = client.recognize(recognitionConfig, audio);
List<SpeechRecognitionResult> results = response.getResultsList();

Фон

Целью здесь является написание метода, который будет прослушивать (неограниченный по времени) аудиопоток FLAK http и выполнять потоковое распознавание речи (с использованием StreamingRecognizeRequest запросов).Я использую последний com.google.cloud.speech (0.72.0-бета).

...