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