2016/03/31

透過 Android TTS API 進行 Text To Speech

Android 本身就內建 TTS Engine API,

可以讓你實現 Text To Speech 功能,

但有一點要注意, Android 2.2 以前版本(包含 2.2), "離線版本" 只支援 English(英文) / French(法文) / German(德文) / Italian(義大利文) / Spanish(西班牙文),

其他語系若【不支援】或【沒有下載離線語音檔】, 則需要【打開行動網路】, 取得線上語音資料才可,

範例如下 :
 程式碼
public class HelloWorld extends Activity
{
    private EditText et;

    /** TTS 物件 */
    private TextToSpeech tts;
    
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        
        // 建立 TTS
        createLanguageTTS();
        
        // 輸入文字
        et = new EditText(this);
        
        // 按鈕
        Button b = new Button(this);
        b.setText("Speech");
        b.setOnClickListener( new OnClickListener(){
            @Override
            public void onClick(View arg0)
            {
                //【英文】發音
                tts.speak( et.getText().toString(), TextToSpeech.QUEUE_FLUSH, null );
            }
        });
        
        // 版面配置
        LinearLayout ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        ll.addView( et, 320, 200 );
        ll.addView( b, 320, 100 );
        addContentView( ll, new LinearLayout.LayoutParams(320, 480) );
    }
    
    @Override
    protected void onDestroy()
    {
        // 釋放 TTS
        if( tts != null ) tts.shutdown();
        
        super.onDestroy();
    }

    private void createLanguageTTS()
    {
        if( tts == null )
        {
            tts = new TextToSpeech(this, new OnInitListener(){
                @Override
                public void onInit(int arg0)
                {
                    // TTS 初始化成功
                    if( arg0 == TextToSpeech.SUCCESS )
                    {
                        // 指定的語系: 英文(美國)
                        Locale l = Locale.US;  // 不要用 Locale.ENGLISH, 會預設用英文(印度)
                        
                        // 目前指定的【語系+國家】TTS, 已下載離線語音檔, 可以離線發音
                        if( tts.isLanguageAvailable( l ) == TextToSpeech.LANG_COUNTRY_AVAILABLE )
                        {
                            tts.setLanguage( l );
                        }
                    }
                }}
            );
        }
    }
}

範例結果, 如下 :


另外, 若有發生【speak failed: TTS engine connection not fully set up】問題,

原因是【TTS Engin 建立成功, 但因 "主執行緒" 或 "執行緒池" 已滿, 導致 TTS.speak 沒有位置可以被執行】,

解決為【執行 AsyncTask 由 "execute" 改為 "executeOnExecutor"】.

以上, 參考看看囉.