@@ -255,14 +255,20 @@ private void streamAudio(ClientStream<StreamingRecognizeRequest> clientStream, A
255
255
long startTime = System .currentTimeMillis ();
256
256
long maxTranscriptionMillis = (config .maxTranscriptionSeconds * 1000L );
257
257
long maxSilenceMillis = (config .maxSilenceSeconds * 1000L );
258
- int readBytes = 6400 ;
259
- while (!aborted .get ()) {
260
- byte [] data = new byte [readBytes ];
261
- int dataN = audioStream .read (data );
258
+ final int bufferSize = 6400 ;
259
+ int numBytesRead ;
260
+ int remaining = bufferSize ;
261
+ byte [] audioBuffer = new byte [bufferSize ];
262
+ while (!aborted .get () && !responseObserver .isDone ()) {
263
+ numBytesRead = audioStream .read (audioBuffer , bufferSize - remaining , remaining );
262
264
if (aborted .get ()) {
263
265
logger .debug ("Stops listening, aborted" );
264
266
break ;
265
267
}
268
+ if (numBytesRead == -1 ) {
269
+ logger .debug ("End of stream" );
270
+ break ;
271
+ }
266
272
if (isExpiredInterval (maxTranscriptionMillis , startTime )) {
267
273
logger .debug ("Stops listening, max transcription time reached" );
268
274
break ;
@@ -272,18 +278,17 @@ && isExpiredInterval(maxSilenceMillis, responseObserver.getLastInputTime())) {
272
278
logger .debug ("Stops listening, max silence time reached" );
273
279
break ;
274
280
}
275
- if (dataN != readBytes ) {
276
- try {
277
- Thread .sleep (100 );
278
- } catch (InterruptedException e ) {
279
- }
281
+ if (numBytesRead != remaining ) {
282
+ remaining = remaining - numBytesRead ;
280
283
continue ;
281
284
}
285
+ remaining = bufferSize ;
282
286
StreamingRecognizeRequest dataRequest = StreamingRecognizeRequest .newBuilder ()
283
- .setAudioContent (ByteString .copyFrom (data )).build ();
284
- logger .debug ("Sending audio data {}" , dataN );
287
+ .setAudioContent (ByteString .copyFrom (audioBuffer )).build ();
288
+ logger .debug ("Sending audio data {}" , bufferSize );
285
289
clientStream .send (dataRequest );
286
290
}
291
+ audioStream .close ();
287
292
}
288
293
289
294
private void sendStreamConfig (ClientStream <StreamingRecognizeRequest > clientStream ,
@@ -335,6 +340,7 @@ private static class TranscriptionListener implements ResponseObserver<Streaming
335
340
private float confidenceSum = 0 ;
336
341
private int responseCount = 0 ;
337
342
private long lastInputTime = 0 ;
343
+ private boolean done = false ;
338
344
339
345
public TranscriptionListener (STTListener sttListener , GoogleSTTConfiguration config , AtomicBoolean aborted ) {
340
346
this .sttListener = sttListener ;
@@ -374,7 +380,7 @@ public void onResponse(StreamingRecognizeResponse response) {
374
380
responseCount ++;
375
381
// when in single utterance mode we can just get one final result so complete
376
382
if (config .singleUtteranceMode ) {
377
- onComplete () ;
383
+ done = true ;
378
384
}
379
385
}
380
386
});
@@ -411,6 +417,10 @@ public void onError(@Nullable Throwable t) {
411
417
}
412
418
}
413
419
420
+ public boolean isDone () {
421
+ return done ;
422
+ }
423
+
414
424
public long getLastInputTime () {
415
425
return lastInputTime ;
416
426
}
0 commit comments