-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
samples: Infinite Stream recognition (#1297)
* Infinite Stream recognition * Infinite Stream recognition - Updates after review * Infinite Stream recognition - Updates after review * Infinite Stream recognition - Updates after review
- Loading branch information
1 parent
19f7dde
commit 6dd4c26
Showing
1 changed file
with
181 additions
and
0 deletions.
There are no files selected for viewing
181 changes: 181 additions & 0 deletions
181
speech/snippets/src/main/java/com/example/speech/InfiniteStreamRecognize.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
/* | ||
* Copyright 2018 Google LLC | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package com.example.speech; | ||
|
||
// [START speech_transcribe_infinite_streaming] | ||
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.RecognitionConfig; | ||
import com.google.cloud.speech.v1.SpeechClient; | ||
import com.google.cloud.speech.v1.SpeechRecognitionAlternative; | ||
import com.google.cloud.speech.v1.StreamingRecognitionConfig; | ||
import com.google.cloud.speech.v1.StreamingRecognitionResult; | ||
import com.google.cloud.speech.v1.StreamingRecognizeRequest; | ||
import com.google.cloud.speech.v1.StreamingRecognizeResponse; | ||
import com.google.protobuf.ByteString; | ||
import java.util.ArrayList; | ||
import java.util.concurrent.BlockingQueue; | ||
import java.util.concurrent.LinkedBlockingQueue; | ||
import javax.sound.sampled.AudioFormat; | ||
import javax.sound.sampled.AudioSystem; | ||
import javax.sound.sampled.DataLine; | ||
import javax.sound.sampled.DataLine.Info; | ||
import javax.sound.sampled.TargetDataLine; | ||
|
||
public class InfiniteStreamRecognize { | ||
|
||
// Creating shared object | ||
private static volatile BlockingQueue<byte[]> sharedQueue = new LinkedBlockingQueue(); | ||
private static TargetDataLine targetDataLine; | ||
private static int BYTES_PER_BUFFER = 6400; // buffer size in bytes | ||
|
||
public static void main(String... args) { | ||
try { | ||
infiniteStreamingRecognize(); | ||
} catch (Exception e) { | ||
System.out.println("Exception caught: " + e); | ||
} | ||
} | ||
|
||
/** Performs infinite streaming speech recognition */ | ||
public static void infiniteStreamingRecognize() throws Exception { | ||
|
||
// Microphone Input buffering | ||
class MicBuffer implements Runnable { | ||
|
||
@Override | ||
public void run() { | ||
System.out.println("Start speaking...Press Ctrl-C to stop"); | ||
targetDataLine.start(); | ||
byte[] data = new byte[BYTES_PER_BUFFER]; | ||
while (targetDataLine.isOpen()) { | ||
try { | ||
int numBytesRead = targetDataLine.read(data, 0, data.length); | ||
if ((numBytesRead <= 0) && (targetDataLine.isOpen())) { | ||
continue; | ||
} | ||
sharedQueue.put(data.clone()); | ||
} catch (InterruptedException e) { | ||
System.out.println("Microphone input buffering interrupted : " + e.getMessage()); | ||
} | ||
} | ||
} | ||
} | ||
|
||
// Creating microphone input buffer thread | ||
MicBuffer micrunnable = new MicBuffer(); | ||
Thread micThread = new Thread(micrunnable); | ||
ResponseObserver<StreamingRecognizeResponse> responseObserver = null; | ||
try (SpeechClient client = SpeechClient.create()) { | ||
ClientStream<StreamingRecognizeRequest> clientStream; | ||
responseObserver = | ||
new ResponseObserver<StreamingRecognizeResponse>() { | ||
|
||
ArrayList<StreamingRecognizeResponse> responses = new ArrayList<>(); | ||
|
||
public void onStart(StreamController controller) {} | ||
|
||
public void onResponse(StreamingRecognizeResponse response) { | ||
responses.add(response); | ||
StreamingRecognitionResult result = response.getResultsList().get(0); | ||
// There can be several alternative transcripts for a given chunk of speech. Just | ||
// use the first (most likely) one here. | ||
SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0); | ||
System.out.printf("Transcript : %s\n", alternative.getTranscript()); | ||
} | ||
|
||
public void onComplete() { | ||
System.out.println("Done"); | ||
} | ||
|
||
public void onError(Throwable t) { | ||
System.out.println(t); | ||
} | ||
}; | ||
|
||
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 | ||
|
||
clientStream.send(request); | ||
|
||
try { | ||
// SampleRate:16000Hz, SampleSizeInBits: 16, Number of channels: 1, Signed: true, | ||
// bigEndian: false | ||
AudioFormat audioFormat = new AudioFormat(16000, 16, 1, true, false); | ||
DataLine.Info targetInfo = | ||
new Info( | ||
TargetDataLine.class, | ||
audioFormat); // Set the system information to read from the microphone audio | ||
// stream | ||
|
||
if (!AudioSystem.isLineSupported(targetInfo)) { | ||
System.out.println("Microphone not supported"); | ||
System.exit(0); | ||
} | ||
// Target data line captures the audio stream the microphone produces. | ||
targetDataLine = (TargetDataLine) AudioSystem.getLine(targetInfo); | ||
targetDataLine.open(audioFormat); | ||
micThread.start(); | ||
|
||
long startTime = System.currentTimeMillis(); | ||
|
||
while (true) { | ||
|
||
long estimatedTime = System.currentTimeMillis() - startTime; | ||
|
||
if (estimatedTime >= 55000) { | ||
|
||
clientStream.closeSend(); | ||
clientStream = client.streamingRecognizeCallable().splitCall(responseObserver); | ||
|
||
request = | ||
StreamingRecognizeRequest.newBuilder() | ||
.setStreamingConfig(streamingRecognitionConfig) | ||
.build(); | ||
|
||
startTime = System.currentTimeMillis(); | ||
|
||
} else { | ||
request = | ||
StreamingRecognizeRequest.newBuilder() | ||
.setAudioContent(ByteString.copyFrom(sharedQueue.take())) | ||
.build(); | ||
} | ||
|
||
clientStream.send(request); | ||
} | ||
} catch (Exception e) { | ||
System.out.println(e); | ||
} | ||
} | ||
} | ||
} | ||
// [END speech_transcribe_infinite_streaming] |