Почему я не получаю никаких ответов (от 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-бета).