在Android中使用Google引擎进行文本到语音转换

在Android中使用Google引擎进行文本到语音转换,android,text-to-speech,Android,Text To Speech,我正在用Android开发一个简单的应用程序,我对TextToSpeech有一个问题 应用程序必须使用TextToSpeech来发音字母和数字,但有一个问题,默认情况下,设备使用Picott,我希望他们被迫使用google tts引擎 我怎么能做到 我的代码: @SuppressLint("NewApi") public class LearnAlphabet extends Activity { Button howto, number, alphabet; public TextToSp

我正在用Android开发一个简单的应用程序,我对TextToSpeech有一个问题

应用程序必须使用TextToSpeech来发音字母和数字,但有一个问题,默认情况下,设备使用Picott,我希望他们被迫使用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);
****编辑****** 如果我设置: setEngineByPackageName(“com.google.android.tts”)


正在引发NPE,因为在调用tts.setEngineByPackageName()时tts对象为null

只有在
onInit()
成功返回后才能创建tts,因此您应该在
onInit()中调用tts.setEngineByPackageName()


如果您对重定向用户以安装未安装的google TTS引擎不感兴趣,可以删除confirmDialog()

您是否尝试过
TTS.setEngineByPackageName(…)
?软件包名称可能是
com.google.android.tts
。可能是未安装google软件包。您应该像这样检查,并将用户转发到像下面这样的安装,即LearnAlphabet.java中的第47行?NullPointerException在该行中被抛出。@Elisa Giavino,在onInit()成功返回之前不会创建tts,因此您应该在onInit()中调用tts.setEngineByPackageName()。查看我的回答有时用户可能会禁用手机上的谷歌tts。这是虽然谷歌tts安装在手机上,但它只是被禁用!如何检查此状态?我使用TTS构造函数设置了TTS引擎。但同样,当应用程序运行时,会打开一个弹出窗口选择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)
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;
    }