2012-09-16 52 views

回答

6

辦法安裝TTS引擎列表,你應該得到的com.ivona.tts UID包:
http://developer.android.com/reference/android/content/pm/PackageManager.html#getApplicationInfo(java.lang.String,%20int%29
然後問PackageManager用於共享此UID的所有應用程序:
http://developer.android.com/reference/android/content/pm/PackageManager.html#getPackagesForUid(int%29

要更改TTS引擎,請使用此方法:
http://developer.android.com/reference/android/speech/tts/TextToSpeech.html#setEngineByPackageName(java.lang.String%29

(請注意,此方法已過時,並且在新的API級別,你應該使用下面的構造函數:
http://developer.android.com/reference/android/speech/tts/TextToSpeech.html#TextToSpeech(android.content.Context,%20android.speech.tts.TextToSpeech.OnInitListener,%20java.lang.String%29

最後設置特定伊沃娜的聲音,你必須從語音包名稱解析語言/國家/名稱,並將其傳遞到:
http://developer.android.com/reference/android/speech/tts/TextToSpeech.html#setLanguage(java.util.Locale%29 例如。選擇com.ivona.tts.voicebeta.eng.gbr.amy你應該使用:

tts.setLanguage(new Locale("eng", "gbr", "amy")); 

這裏的樣本的活動,可打印呼聲logcat的:

package com.example.com.ivona.tts.test; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import android.app.Activity; 
import android.content.pm.ApplicationInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.os.Bundle; 
import android.speech.tts.TextToSpeech; 
import android.util.Log; 

public class TTSActivity extends Activity implements TextToSpeech.OnInitListener { 
    private static final String TAG = "TTSActivity"; 
    private TextToSpeech tts; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tts = new TextToSpeech(TTSActivity.this, TTSActivity.this); 
    } 

    @Override 
    public void onInit(int status) { 
     PackageManager pm = getPackageManager(); 

     ApplicationInfo ai = null; 
     try { 
      ai = pm.getApplicationInfo("com.ivona.tts", 0); 
     } catch (NameNotFoundException e) { 
      e.printStackTrace(); 
      return; 
     } 

     String[] ivonaVoices = pm.getPackagesForUid(ai.uid); 

     Log.d(TAG, "Possible tts.setLanguage() usage:"); 
     Pattern p = Pattern.compile("^com\\.ivona\\.tts\\.voicebeta\\.([^.]+)\\.([^.]+)\\.([^.]+)$"); 
     for (String voice: ivonaVoices) { 
      Matcher m = p.matcher(voice); 
      if (m.matches()) 
       Log.d(TAG, String.format("tts.setLanguage(\"%s\", \"%s\", \"%s\")", m.group(1), m.group(2), m.group(3))); 
     } 
    } 
} 
+0

非常感謝Michael。 – mbrc

+0

以及另一個例子,如果有人需要獲取所有已安裝的軟件包:http://www.coderzheaven.com/2011/04/03/how-to-get-information-about-all-the-applications-installed-in-your -android-emulator-or-phone-how-to-use-getpackagemanager-in-android/ – mbrc

+0

但是在這種情況下,我們不希望所有已安裝的軟件包,只有那些與com.ivona.tts有共同sharedUid的軟件包。 –

1

也許一個簡單的方法是使用下面的代碼從任何活動類:

final int TTS_CHECK_DATA = 977; // arbitrary number 
private ArrayList<String> myVoices = null; 

在一些活動類方法:

onActivityResult()
Intent in = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
// if you want specific, non-default TTS Engine also set package, else skip: 
in = in.setPackage("com.acapelagroup.android.tts"); // or whatever package you want 
startActivityForResult(in, TTS_CHECK_DATA); 

然後:

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == TTS_CHECK_DATA && data != null) { 
     myVoices = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES); 
    } 
} 

現在myVoices填充區域設置字符串(郎國家變體),例如對於Acapela我得到:

pol-POL-Ania 
eng-USA-Heather 
eng-GBR-Rachel 
rus-RUS-Alyona 

TTS引擎,擁有每聲音只有一個揚聲器可能不會給你第三(變體)組成,例如Ivona現在只給你「eng-USA」,「eng-GBR」,「fra-FRA」等。

Greg

相關問題