[英]Text To Speech using Google Engine in Android
我正在Android中開發一個簡單的應用程序,我遇到TextToSpeech的問題。
應用程序必須使用TextToSpeech發出字母和數字的字母,但是有一個問題,默認設備使用PicoTTS我希望他們被迫使用google tts引擎。
我怎么能這樣做?
我的代碼:
@SuppressLint("NewApi")
public class LearnAlphabet extends Activity {
Button howto, number, alphabet;
public TextToSpeech tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.learn_number);
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0170a5")));
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new NumberFunction(this));
final String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();
tts = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR){
switch (locale.toString()) {
case "it":
tts.setLanguage(new Locale("it_IT"));
break;
case "en":
tts.setLanguage(new Locale("en_US"));
break;
case "es":
tts.setLanguage(new Locale("es_ES"));
break;
case "de":
tts.setLanguage(new Locale("de_NL"));
break;
case "ru":
tts.setLanguage(new Locale("ru_RU"));
break;
default:
tts.setLanguage(new Locale("en_US"));
break;
}
}
}
});
}
並為每個字母或數字:
tts.speak(getResources().getString(R.string.a), TextToSpeech.QUEUE_FLUSH, null);
****編輯*****如果我設置錯誤:tts.setEngineByPackageName(“com.google.android.tts”)
12-11 15:52:04.954: E/AndroidRuntime(12203): FATAL EXCEPTION: main
12-11 15:52:04.954: E/AndroidRuntime(12203): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.imparafacile/com.imparafacile.LearnAlphabet}: java.lang.NullPointerException
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2311)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.access$600(ActivityThread.java:149)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.os.Handler.dispatchMessage(Handler.java:99)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.os.Looper.loop(Looper.java:137)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.main(ActivityThread.java:5214)
12-11 15:52:04.954: E/AndroidRuntime(12203): at java.lang.reflect.Method.invokeNative(Native Method)
12-11 15:52:04.954: E/AndroidRuntime(12203): at java.lang.reflect.Method.invoke(Method.java:525)
12-11 15:52:04.954: E/AndroidRuntime(12203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
12-11 15:52:04.954: E/AndroidRuntime(12203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
12-11 15:52:04.954: E/AndroidRuntime(12203): at dalvik.system.NativeStart.main(Native Method)
12-11 15:52:04.954: E/AndroidRuntime(12203): Caused by: java.lang.NullPointerException
12-11 15:52:04.954: E/AndroidRuntime(12203): at com.imparafacile.LearnAlphabet.onCreate(LearnAlphabet.java:47)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.Activity.performCreate(Activity.java:5133)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-11 15:52:04.954: E/AndroidRuntime(12203): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)
拋出NPE是因為在調用tts.setEngineByPackageName()時tts對象為null。
在onInit()
成功返回之前不會創建tts,所以你應該在onInit()
調用onInit()
:
String googleTtsPackage = "com.google.android.tts", picoPackage = "com.svox.pico";
tts = new TextToSpeech(getApplicationContext(),
new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR){
if(!isPackageInstalled(getPackageManager(), googleTtsPackage))
confirmDialog();
else myTTS.setEngineByPackageName(googleTtsPackage);
}
private void confirmDialog(){
AlertDialog.Builder d = new AlertDialog.Builder(LearnAlphabet.this);
d.setTitle("Install recommeded speech engine?");
d.setMessage("Your device isn't using the recommended speech engine. Do you wish to install it?");
d.setPositiveButton("Yes", new android.content.DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int arg1){
Intent installVoice = new Intent(Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installVoice);
}});
d.setNegativeButton("No, later", new android.content.DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int arg1){
if(isPackageInstalled(context.getPackageManager(), picoPackage))
myTTS.setEngineByPackageName(picoPackage);
}
});
d.show();
}
public static boolean isPackageInstalled(PackageManager pm, String packageName) {
try {
pm.getPackageInfo(packageName, 0);
} catch (NameNotFoundException e) {
return false;
}
return true;
}
如果您不想重定向用戶安裝Google TTS引擎(如果未安裝),則可以刪除confirmDialog()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.