android-sdk icon indicating copy to clipboard operation
android-sdk copied to clipboard

Speech to Text: OggOpusEncoder hanging on close after Inactivity Timeout

Open smccants opened this issue 7 years ago • 5 comments

I'm working on a sample Speech-to-text Android App that will timeout after a certain amount of inactivity from the speaker. For testing purposes, I set the timeout at 1 second. However, there seems to be a race condition (which I reproduced in the example by setting the inactivity timeout to 1 second) that causes the MicrophoneHelper to hang on closing.

The hang occurs in MicrophoneCaptureThread.run() line 110 - encoder.close() call. I'm not quite sure what is hanging it up, but if you toggle the microphone and then let it timeout after one or two attempts it will fail this way. The final hang is in MicrophoneInputStream.consume(byte[]).

Here is the link to the sample application I used: https://github.com/watson-developer-cloud/android-sdk/blob/master/example/src/main/java/com/ibm/watson/developer_cloud/android/myapplication/MainActivity.java

The only change I made was to getRecognizeOptions() where I changed the timeout from 2000 to 1.

smccants avatar Mar 13 '18 18:03 smccants

Workaround: I use a timer in my app which calls "microphoneHelper.closeInputStream();". This seems to avoid the problem.

smccants avatar Mar 13 '18 18:03 smccants

The problem was originally reported here: https://developer.ibm.com/answers/questions/435993/speech-to-text-oggopusencoder-hanging-on-close-aft.html?childToView=436412#answer-436412

smccants avatar Mar 13 '18 18:03 smccants

Hey @smccants, thanks for bringing this issue up. I've assigned myself to take a look at this as soon as I get some time and I'll report back with any findings.

lpatino10 avatar Mar 14 '18 18:03 lpatino10

I think I'm running into a slightly different flavor of this problem. Any update on when it might be fixed?

smccants avatar Aug 28 '18 17:08 smccants

It looks like the hang is a result of this thread never exiting:

"Thread-5@5044" prio=5 tid=0x5c7 nid=NA waiting
  java.lang.Thread.State: WAITING
	 blocks Thread-5@5044
	  at java.lang.Object.wait(Object.java:-1)
	  at java.lang.Object.wait(Object.java:407)
	  at java.io.PipedInputStream.awaitSpace(PipedInputStream.java:280)
	  at java.io.PipedInputStream.receive(PipedInputStream.java:238)
	  - locked <0x15d5> (a java.io.PipedInputStream)
	  at java.io.PipedOutputStream.write(PipedOutputStream.java:149)
	  at java.io.OutputStream.write(OutputStream.java:75)
	  at com.ibm.watson.developer_cloud.android.library.audio.MicrophoneInputStream.consume(MicrophoneInputStream.java:142)
	  at com.ibm.watson.developer_cloud.android.library.audio.opus.OpusWriter.write(OpusWriter.java:236)
	  at com.ibm.watson.developer_cloud.android.library.audio.opus.OpusWriter.flush(OpusWriter.java:209)
	  at com.ibm.watson.developer_cloud.android.library.audio.opus.OpusWriter.writePacket(OpusWriter.java:184)
	  at com.ibm.watson.developer_cloud.android.library.audio.opus.OggOpusEnc.encodeAndWrite(OggOpusEnc.java:116)
	  at com.ibm.watson.developer_cloud.android.library.audio.MicrophoneCaptureThread.run(MicrophoneCaptureThread.java:99)

While this thread is hung, the main thread is in a spin loop waiting for it:

"main@4487" prio=5 tid=0x1 nid=NA sleeping
  java.lang.Thread.State: TIMED_WAITING
	 blocks main@4487
	  at java.lang.Thread.sleep(Thread.java:-1)
	  at java.lang.Thread.sleep(Thread.java:371)
	  - locked <0x15bb> (a java.lang.Object)
	  at java.lang.Thread.sleep(Thread.java:313)
	  at com.ibm.watson.developer_cloud.android.library.audio.MicrophoneCaptureThread.end(MicrophoneCaptureThread.java:126)
	  at com.ibm.watson.developer_cloud.android.library.audio.MicrophoneInputStream.close(MicrophoneInputStream.java:109)
	  at com.ibm.watson.developer_cloud.android.library.audio.MicrophoneHelper.closeInputStream(MicrophoneHelper.java:61)
	  at com.hcs.android.watsonspeech.MainActivity.turnOffSpeechRecognition(MainActivity.java:96)
	  at com.hcs.android.watsonspeech.MainActivity$1.onCheckedChanged(MainActivity.java:51)
	  at android.widget.CompoundButton.setChecked(CompoundButton.java:166)
	  at android.widget.Switch.setChecked(Switch.java:1127)
	  at com.hcs.android.watsonspeech.MainActivity$5.run(MainActivity.java:133)
	  at android.os.Handler.handleCallback(Handler.java:751)

smccants avatar Aug 28 '18 19:08 smccants