diff --git a/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/Const.java b/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/Const.java index 7dfed0b7..0947011c 100644 --- a/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/Const.java +++ b/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/Const.java @@ -25,6 +25,8 @@ public enum DeviceModel { public static final boolean LOAD_AUDIO = false; public static boolean SHOW_SUBTITLES = false; + // The time interval in which duplicate TTS speeches are suppressed + public static int SPEECH_DEDUP_INTERVAL = 5; // high level sensor control (on/off) public static boolean SENSOR_VIDEO = true; diff --git a/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/GabrielClientActivity.java b/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/GabrielClientActivity.java index 58d0f26d..2211f4df 100644 --- a/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/GabrielClientActivity.java +++ b/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/GabrielClientActivity.java @@ -52,7 +52,10 @@ public class GabrielClientActivity extends Activity implements TextToSpeech.OnIn private EngineInput engineInput; final private Object engineInputLock = new Object(); private FrameSupplier frameSupplier; + + // TTS private String previousTts = ""; + private long previousTtsTime = 0; private boolean isRunning = false; private boolean isFirstExperiment = true; @@ -358,8 +361,10 @@ public void onClick(DialogInterface dialog, int which) { dialog.show(); } else if (msg.what == NetworkProtocol.NETWORK_RET_SPEECH) { String ttsMessage = (String) msg.obj; - - if (tts != null && !ttsMessage.equals(previousTts)){ + // suppress the duplicate message if they are adjacent and comes in a short interval + boolean isSuppressed = ttsMessage.equals(previousTts) && ( + (System.currentTimeMillis()/1000 - previousTtsTime) < Const.SPEECH_DEDUP_INTERVAL); + if (tts != null && !isSuppressed){ Log.d(LOG_TAG, "tts to be played: " + ttsMessage); tts.setSpeechRate(1.0f); String[] splitMSGs = ttsMessage.split("\\."); @@ -377,6 +382,7 @@ public void onClick(DialogInterface dialog, int which) { tts.speak(splitMSGs[i].toString().trim(),TextToSpeech.QUEUE_ADD, null); } previousTts = ttsMessage; + previousTtsTime = System.currentTimeMillis() / 1000; } subtitleView = (TextView) findViewById(R.id.subtitleText); subtitleView.setText(ttsMessage); diff --git a/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/ServerListActivity.java b/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/ServerListActivity.java index ead91a5c..dddb3fe5 100644 --- a/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/ServerListActivity.java +++ b/android-client/app/src/main/java/edu/cmu/cs/gabrielclient/ServerListActivity.java @@ -18,6 +18,9 @@ import android.app.AlertDialog; import android.content.SharedPreferences; import androidx.appcompat.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -54,6 +57,7 @@ public class ServerListActivity extends AppCompatActivity { SeekBar seekBar = null; TextView intervalLabel = null; Switch subtitles = null; + EditText speechDedupInterval = null; CameraManager camMan = null; private SharedPreferences mSharedPreferences; private static final int MY_PERMISSIONS_REQUEST_CAMERA = 23; @@ -105,12 +109,8 @@ protected void onCreate(Bundle savedInstanceState) { mSharedPreferences=getSharedPreferences(getString(R.string.shared_preference_file_key), MODE_PRIVATE); - + // app options subtitles = (Switch) findViewById(R.id.subtitles); - - - - subtitles.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Const.SHOW_SUBTITLES = isChecked; @@ -121,6 +121,34 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { }); subtitles.setChecked(mSharedPreferences.getBoolean("option:subtitles", false)); + speechDedupInterval = (EditText) findViewById(R.id.speechDedupInterval); + speechDedupInterval.addTextChangedListener( + new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + @Override + public void afterTextChanged(Editable s) { + try { + Const.SPEECH_DEDUP_INTERVAL = Integer.parseInt(s.toString()); + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putInt("option:speechDedupInterval", + Const.SPEECH_DEDUP_INTERVAL); + editor.commit(); + } catch (NumberFormatException e) { + Log.e(this.getClass().getName(), "Invalid int string (" + + s.toString() + ").. Failed to set SPEECH_DEDUP_INTERVAL"); + } + } + } + ); + Const.SPEECH_DEDUP_INTERVAL = mSharedPreferences.getInt("option:speechDedupInterval", + Const.SPEECH_DEDUP_INTERVAL); + speechDedupInterval.setText(String.valueOf(Const.SPEECH_DEDUP_INTERVAL)); + camMan = (CameraManager) getSystemService(Context.CAMERA_SERVICE); initServerList(); diff --git a/android-client/app/src/main/res/layout/activity_serverlist.xml b/android-client/app/src/main/res/layout/activity_serverlist.xml index 2146a56d..9386871c 100644 --- a/android-client/app/src/main/res/layout/activity_serverlist.xml +++ b/android-client/app/src/main/res/layout/activity_serverlist.xml @@ -44,6 +44,27 @@ android:layout_marginLeft="20dp" android:text="@string/subtitles" /> + + + + + + Options Show Subtitles for Audio Feedback + Period to Suppress Identical Speech (in Seconds) Server List Name Address