如何在speech_event_type后持续发送请求:END_OF_SINGLE_UTTERANCE谷歌语音云Java



我知道谷歌云语音API(识别(限制为65秒,但我假设这是每个请求,并且只有当您的演讲实际上比这更长时才受到限制。

因此,假设我只想从麦克风翻译一些命令并请求谷歌语音。我添加模型command_and_search并将setSingleUtterance(true(设置为配置。

下面的代码发送一个请求并打印结果,但我不明白如何为下一个命令生成新请求。像"帮助"...."对"...等

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.v1p1beta1.*;
import com.google.protobuf.ByteString;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.TargetDataLine;

public class App {

public static void AskGoogle (ClientStream<StreamingRecognizeRequest> c,byte[]  b ) {
StreamingRecognizeRequest request =
StreamingRecognizeRequest.newBuilder()
.setAudioContent(ByteString.copyFrom(b))
.build();
c.send(request);
return;
}

public static void main(String[] args) {
// Target data line
TargetDataLine line = null;
AudioInputStream audio = null;
// Capture Microphone Audio Data
try {
// Signed PCM AudioFormat with 16kHz, 16 bit sample size, mono
int sampleRate = 16000;
AudioFormat format = new AudioFormat(sampleRate, 16, 1, true, false);
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
// Check if Microphone is Supported
if (!AudioSystem.isLineSupported(info)) {
System.out.println("Line not supported");
System.exit(0);
}
// Get the target data line
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
line.start();
// Audio Input Stream
audio = new AudioInputStream(line);
} catch (Exception ex) {
ex.printStackTrace();
}

// Send audio from Microphone to Google Servers and return Text
try (SpeechClient client = SpeechClient.create()) {
ResponseObserver<StreamingRecognizeResponse> responseObserver =
new ResponseObserver<StreamingRecognizeResponse>() {
public void onStart(StreamController controller) {
// do nothing
}
public void onResponse(StreamingRecognizeResponse response) {
System.out.println(response);

}
public void onComplete() {
}
public void onError(Throwable t) {
System.out.println(t);
}
};
ClientStream<StreamingRecognizeRequest> clientStream =
client.streamingRecognizeCallable().splitCall(responseObserver);
RecognitionConfig recConfig =
RecognitionConfig.newBuilder()
.setEncoding(RecognitionConfig.AudioEncoding.LINEAR16)
.setLanguageCode("sv-SE")
.setSampleRateHertz(16000)
.setModel("command_and_search")
.build();
StreamingRecognitionConfig config =
StreamingRecognitionConfig.newBuilder().setConfig(recConfig).setSingleUtterance(true).build();
StreamingRecognizeRequest request =
StreamingRecognizeRequest.newBuilder()
.setStreamingConfig(config)
.build(); // The first request in a streaming call has to be a config
clientStream.send(request);
while (true) {
byte[] data = new byte[100];
try {
audio.read(data);
} catch (IOException e) {
System.out.println(e);
}
AskGoogle(clientStream,data);

}
} catch (Exception e) {
System.out.println(e);
}
}
}

无论出于何种原因,这个问题被否决了,我实际上找到了解决问题的方法,在 OnResponse 方法(上面的代码(中返回第一次转录后继续向语音 api 发送更多请求。只需将尝试捕获麦克风块以请求使用语音客户端进行新配置的所有内容包装到上述 AskGoogle(( 中,并在 OnResponse 中的 StreamingRecognizeResponse 中的 endpointerType "END_OF_UTTERANCE" 出现时再次调用它。

相关内容

最新更新