如何在语音事件后持续发送请求类型:单次语音结束谷歌语音云Java
我知道google cloud语音API(Recognite)限制为65秒,但我假设这是每个请求的一个限制,并且只有在您的语音实际长度超过65秒时才有限制
所以,假设我只想从麦克风中获得一些命令翻译,然后向google speech发出请求。我添加了model命令_和_search,并将setSingleUtterance(true)设置为config
下面的代码发送一个请求并打印结果,但我无法理解如何生成下一个命令的新请求。。比如“帮助”。。。。“对”。。。等等
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);
}
}
}
# 1 楼答案
无论出于什么原因,这个问题被否决了,我实际上找到了一个解决方案,在OnResponse方法(上面的代码)中返回第一次转录后,继续向语音api发送更多请求。只需将从try capture the mic块到请求语音客户端的新配置的所有内容封装到一个类似于上述AskGoogle()的方法中,并在传入StreamingRecognitizeResponse in OnResponse中的endpointerType“END_OF_utrance”时再次调用它