有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在语音事件后持续发送请求类型:单次语音结束谷歌语音云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) 个答案

  1. # 1 楼答案

    无论出于什么原因,这个问题被否决了,我实际上找到了一个解决方案,在OnResponse方法(上面的代码)中返回第一次转录后,继续向语音api发送更多请求。只需将从try capture the mic块到请求语音客户端的新配置的所有内容封装到一个类似于上述AskGoogle()的方法中,并在传入StreamingRecognitizeResponse in OnResponse中的endpointerType“END_OF_utrance”时再次调用它