Implement voice recognition language switch

This commit is contained in:
Snek 2017-03-09 04:26:12 +03:00
parent 78ca58f2cd
commit 0a329db4a3
7 changed files with 74 additions and 44 deletions

View File

@ -7,10 +7,8 @@ import android.content.Context;
import android.content.ContextWrapper;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.DisplayMetrics;
import java.util.Locale;

View File

@ -11,7 +11,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
@ -34,6 +34,7 @@ import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
@ -49,7 +50,7 @@ public class MainActivity extends AppCompatActivity {
int shaman_girls = -1;
Random randomgen = new Random();
SharedPreferences sharedPreferences;
String lang;
String lang, recogLang;
MediaPlayer m;
private SpeechRecognizer sr;
@ -63,6 +64,7 @@ public class MainActivity extends AppCompatActivity {
ImageView imageViewSubtitles = (ImageView) findViewById(R.id.imageView_subtitles);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
lang = sharedPreferences.getString("lang", "ja");
recogLang = sharedPreferences.getString("recognition_lang", "ja");
if (!sharedPreferences.getBoolean("show_subtitles", false)) {
imageViewSubtitles.setVisibility(View.INVISIBLE);
}
@ -155,7 +157,14 @@ public class MainActivity extends AppCompatActivity {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, getString(R.string.lang_default_value));
switch (recogLang) {
case "ja":
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ja-JP");
break;
case "en":
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US");
break;
}
/* Temporary workaround for strange bug on 4.0.3-4.0.4 */
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
@ -168,7 +177,7 @@ public class MainActivity extends AppCompatActivity {
sr.startListening(intent);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
@ -291,10 +300,27 @@ public class MainActivity extends AppCompatActivity {
}
private void answerSpeech(String input) {
Log.e(TAG, input);
Context context = getApplicationContext();
Configuration config = context.getResources().getConfiguration();
Locale locale = new Locale(recogLang);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(locale);
} else {
config.locale = locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
context = context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
input = input.toLowerCase();
Random randomGen = new Random();
if (input.contains(getString(R.string.christina))) {
if (input.contains(context.getString(R.string.christina))) {
switch (randomGen.nextInt(4)) {
case 0:
speak(voiceLines.get(10));
@ -309,7 +335,7 @@ public class MainActivity extends AppCompatActivity {
speak(voiceLines.get(15));
break;
}
} else if (input.contains(getString(R.string.nullpo))) {
} else if (input.contains(context.getString(R.string.nullpo))) {
shaman_girls += 1;
if (shaman_girls < 5) {
switch (randomGen.nextInt(2)) {
@ -340,29 +366,29 @@ public class MainActivity extends AppCompatActivity {
break;
}
}
} else if (input.contains(getString(R.string.the_zombie))
|| input.contains(getString(R.string.celeb17))) {
} else if (input.contains(context.getString(R.string.the_zombie))
|| input.contains(context.getString(R.string.celeb17))) {
speak(voiceLines.get(32));
} else if (input.contains(getString(R.string.atchannel))
|| input.contains(getString(R.string.kurigohan))
|| input.contains(getString(R.string.kamehameha))) {
} else if (input.contains(context.getString(R.string.atchannel))
|| input.contains(context.getString(R.string.kurigohan))
|| input.contains(context.getString(R.string.kamehameha))) {
speak(voiceLines.get(30 + randomGen.nextInt(2)));
} else if (input.contains(getString(R.string.salieri))
|| input.contains(getString(R.string.maho))
|| input.contains(getString(R.string.hiyajo))) {
} else if (input.contains(context.getString(R.string.salieri))
|| input.contains(context.getString(R.string.maho))
|| input.contains(context.getString(R.string.hiyajo))) {
speak(voiceLines.get(26 + randomGen.nextInt(4)));
} else if (input.contains(getString(R.string.time_machine))
|| input.contains(getString(R.string.cern))
|| input.contains(getString(R.string.time_travel))) {
} else if (input.contains(context.getString(R.string.time_machine))
|| input.contains(context.getString(R.string.cern))
|| input.contains(context.getString(R.string.time_travel))) {
speak(voiceLines.get(33 + randomGen.nextInt(5)));
} else if (input.contains(getString(R.string.memory))
|| input.contains(getString(R.string.amadeus))
|| input.contains(getString(R.string.science))) {
} else if (input.contains(context.getString(R.string.memory))
|| input.contains(context.getString(R.string.amadeus))
|| input.contains(context.getString(R.string.science))) {
speak(voiceLines.get(38 + randomGen.nextInt(5)));
} else if (input.contains(getString(R.string.hello))
|| input.contains(getString(R.string.good_morning))
|| input.contains(getString(R.string.konnichiwa))
|| input.contains(getString(R.string.good_evening))) {
} else if (input.contains(context.getString(R.string.hello))
|| input.contains(context.getString(R.string.good_morning))
|| input.contains(context.getString(R.string.konnichiwa))
|| input.contains(context.getString(R.string.good_evening))) {
switch (randomGen.nextInt(4)) {
case 0:
speak(voiceLines.get(12));
@ -377,11 +403,11 @@ public class MainActivity extends AppCompatActivity {
speak(voiceLines.get(1));
break;
}
} else if (input.contains(getString(R.string.nice_body))
|| input.contains(getString(R.string.hot))
|| input.contains(getString(R.string.sexy))
|| input.contains(getString(R.string.boobies))
|| input.contains(getString(R.string.oppai))) {
} else if (input.contains(context.getString(R.string.nice_body))
|| input.contains(context.getString(R.string.hot))
|| input.contains(context.getString(R.string.sexy))
|| input.contains(context.getString(R.string.boobies))
|| input.contains(context.getString(R.string.oppai))) {
switch (randomGen.nextInt(3)) {
case 0:
speak(voiceLines.get(2));
@ -393,8 +419,8 @@ public class MainActivity extends AppCompatActivity {
speak(voiceLines.get(11));
break;
}
} else if (input.contains(getString(R.string.robotics_notes))
|| input.contains(getString(R.string.antimatter))) {
} else if (input.contains(context.getString(R.string.robotics_notes))
|| input.contains(context.getString(R.string.antimatter))) {
speak(voiceLines.get(21)); //Hehehe
} else {
speak(voiceLines.get(16 + randomGen.nextInt(7)));
@ -500,6 +526,7 @@ public class MainActivity extends AppCompatActivity {
/* TODO: Japanese doesn't split the words. Sigh. */
String[] splitInput = input.split(" ");
/* TODO: Works only with english right now (and best with english) */
if (splitInput.length > 1 && splitInput[0].equalsIgnoreCase(getString(R.string.christina))) {
String cmd = splitInput[1].toLowerCase();
String[] args = new String[splitInput.length - 2];
@ -510,9 +537,6 @@ public class MainActivity extends AppCompatActivity {
case "open":
openApp(args);
break;
case "открой":
openApp(args);
break;
}
} else {
answerSpeech(input);

View File

@ -4,7 +4,6 @@
<string name="connecting">Connecting…</string>
<string name="disconnected">Disconnected.</string>
<string name="google_app_error">Google App wasn\'t detected.</string>
<string name="lang_default_value">ja-JP</string>
<string name="line_hello">Hello.</string>
<string name="line_dont_call_me_like_that">Don\'t call me like that!</string>

View File

@ -4,7 +4,6 @@
<string name="connecting">Подключение…</string>
<string name="disconnected">Отключено.</string>
<string name="google_app_error">Google App не найден.</string>
<string name="lang_default_value">ru-RU</string>
<!-- Многие фразы были вырваны из контекста, поэтому прошу не пинать -->
<string name="line_hello">Привет.</string>

View File

@ -12,9 +12,13 @@
<item>ja</item>
</string-array>
<string-array name="commandChristina">
<item>Christina</item>
<item>Кристина</item>
<item>クリスティーナ</item>
<string-array name="languagesRecogArray">
<item>English</item>
<item>日本語</item>
</string-array>
<string-array name="languagesRecogValues">
<item>en</item>
<item>ja</item>
</string-array>
</resources>

View File

@ -4,7 +4,6 @@
<string name="connecting">Connecting…</string>
<string name="disconnected">Disconnected.</string>
<string name="google_app_error">Google App wasn\'t detected.</string>
<string name="lang_default_value">en-US</string>
<integer name="duration">40</integer>
<string name="line_hello">Hello.</string>

View File

@ -6,6 +6,13 @@
android:key="show_subtitles"
android:summary="Shows subtitles for Amadeus' answers"
android:title="Show subtitles" />
<ListPreference
android:key="recognition_lang"
android:title="Recognition language"
android:summary="Voice recognition language"
android:defaultValue="@string/lang_default_value"
android:entries="@array/languagesRecogArray"
android:entryValues="@array/languagesRecogValues" />
<ListPreference
android:summary="Select app language (app restart required)"
android:title="Language"