株式会社ライブキャストロゴ 株式会社ライブキャスト

2011年11月3日 追記
ご注意!
Google Translate API v1が2011年12月1日にサービスが終了いたします。添付のサンプルソースでは、Google Translate API v1を利用していますので、翻訳が正常に機能しない場合がございます。ご承知おきください。

Android Market公開を目指してAndroidアプリを開発する!(音声認識機能実装編)の続きです。

We’ve introduced a new feature in version 1.6 of the Android platform: Text-To-Speech (TTS). Also known as “speech synthesis”, TTS enables your Android device to “speak” text of different languages.

Android Developers Blog: An introduction to Text-To-Speech in Androidで、テキストデータの読み上げが可能になったのを知りました。

前回に引き続き、今回もTranslatAIRにはない機能、

翻訳結果をしゃべる機能

を実装していきたいと思います。

The TTS engine that ships with the Android platform supports a number of languages: English, French, German, Italian and Spanish. Also, depending on which side of the Atlantic you are on, American and British accents for English are both supported.

Android Developers Blog: An introduction to Text-To-Speech in Androidより引用。

対応している言語は、

  • 英語
  • フランス語
  • ドイツ語
  • イタリア語
  • スペイン語

の五ヶ国語のようです。
日本語には対応していないようですね。残念です。。。

前回サンプルの画面に「play」ボタンを追加しました。「voice」ボタンと「tweet」ボタンの間です。

activity

XMLには、以下の部分を追加しました。

		<Button
			android:id="@+id/play"
			android:layout_width="fill_parent"
			android:layout_height="fill_parent"
	    	android:layout_weight="1"
		    android:text="play"
		    />

それでは、「play」ボタンが押された時の処理に入っていきたい思います。

TextToSpeechクラスを使用します。

音声認識機能(Voice Recognition)の時と同じように、TextToSpeechのエンジンが利用できるか判断し、初期化処理をしていきます。

    	try {
    		Intent intent = new Intent();
    		intent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    		startActivityForResult(intent, TTS_DATA_CHECK_REQUEST_CODE);
    	}
		catch (Exception ex) {
			playable = false;
		}

コールバックで、TextToSpeechクラスのインスタンスを生成します。

        else if (requestCode == TTS_DATA_CHECK_REQUEST_CODE) {
        	// TextToSpeech初期化の結果
    		if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
    			// TextToSpeechが利用できる場合
    			if (tts == null) {
    				try {
    					tts = new TextToSpeech(getApplicationContext(), this);
    					playable = true;
    				}
    				catch (Exception ex) {
    					playable = false;
    				}
    			}
    		}
    		else {
    			// TextToSpeechのリソースがインストールされていない場合
    			try {
	    			Intent intent = new Intent();
	    			intent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
	    			startActivity(intent);
    			}
    			catch (Exception ex) {
    				playable = false;
    			}
    		}
        }

但し、TextToSpeechエンジンは音声読み上げのためのリソースが、Android端末に入っていないと機能しません。

インストールは、「設定」→「テキスト読み上げ」→「音声データをインストール」からできます。

設定

設定

テキスト読み上げ

テキスト読み上げ

音声データをインストール

音声データをインストール



ですが、リソースがインストールされていない場合には、18~20行のようにすると、インストールを促すように出来るのです。

tts

install

Android端末の初期状態ではインストールされていないようなので、これは実装することをオススメします。

前回同様、コールバックのリクエストコード(requestCode)は、メンバー変数で定数として定義しています。

    private static final int TTS_DATA_CHECK_REQUEST_CODE = 9998;

最後に、「play」ボタンのクリックイベントリスナーを実装します。

        Button btnPlay = (Button)findViewById(R.id.play);
        btnPlay.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				if (gmodel != null) {
    				if (!gmodel.getTranslated().equals("")) {
    					if (tts.isSpeaking()) {
    						tts.stop();
    					}

    					tts.setLanguage(getLocale(gmodel.getSrcLanguage()));
    					tts.speak(gmodel.getTranslated(), TextToSpeech.QUEUE_FLUSH, null);
    				}
				}
			}

        });

しゃべっている最中に、繰り返し「play」ボタンを押された場合には、一旦止めてからしゃべりなおさせるようにしておきました。

それと、今後対応される言語が増えていったときのことを想定して、Localeを設定するところは、五ヶ国語以外も事前に準備をしておきました。

    private String getLocale(LanguageModel model) {
    	String locale;

    	if (model.getValue().equals("en")) {
    		locale = Locale.ENGLISH.toString();
    	}
    	else if (model.getValue().equals("ja")) {
    		locale = Locale.JAPAN.toString();
    	}
    	else if (model.getValue().equals("zh")) {
    		locale = Locale.CHINA.toString();
    	}
    	else if (model.getValue().equals("it")) {
    		locale = Locale.ITALY.toString();
    	}
    	else if (model.getValue().equals("es")) {
    		locale = new Locale("spa", "ESP").toString();
    	}
    	else if (model.getValue().equals("fr")) {
    		locale = Locale.FRANCE.toString();
    	}
    	else if (model.getValue().equals("de")) {
    		locale = Locale.GERMAN.toString();
    	}
    	else if (model.getValue().equals("ko")) {
    		locale = Locale.KOREA.toString();
    	}
    	else if (model.getValue().equals("ru")) {
    		locale = new Locale("ru", "RUS").toString();
    	}
    	else {
    		locale = new Locale("OTHER").toString();
    	}

    	return locale;
    }

実行結果は、ここでは表現できなかったので、サンプルソースを試していただければと思います!

但し、テキストデータの読み上げに対応していない言語に翻訳した場合には、「play」ボタンは無効化され、押せない状態になりますので、ご注意を!

サンプルソース