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

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

Android Market公開を目指してAndroidアプリを開発する!(TextToSpeech編)で、TextToSpeechクラスを使って翻訳結果をしゃべる機能を実装しました。

日本語には対応していないので、日本語に翻訳した結果を読み上げるさせることは出来ませんでした。

対応している言語は、

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

の五ヶ国語のようです。

が、いろいろ調べていると、

Android JaTTS – namespace gimiteという、日本語を読み上げることの出来るライブラリを発見しました!

修正BSDライセンスということですので、早速利用させていただくことにしました。

2010/7/27時点の最新版はandroid-jatts-0.0.1.jarのようです。

ダウンロードしたら、プロジェクトに登録します。Eclipseの「Project」メニューより「Properties」を選択すると、以下のような画面が表示されます。

jar

左ペインより「Java Build Path」を選択し、「Add JARs」ボタンを押して、「libraries」に追加します。

準備ができたので、前回のサンプルソースを変更していきます。

まずは、パッケージをインポートします。

import net.gimite.jatts.JapaneseTextToSpeech;

それから、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;
		}

    	if (jatts == null) {
        	try {
        		jatts = new JapaneseTextToSpeech(getApplicationContext(), this);
         	   	playable_ja = true;
    		}
    		catch (Exception ex) {
         	   	playable_ja = false;
    		}
    	}

※ 10~18行目が追加した処理になります。

次に、翻訳をした後に、読み上げ可能なLocaleかどうかにより、「play」ボタンを制御している部分を以下のように変更しました。

●変更前

				if (playable) {
					Locale locale = getLocale(gmodel.getDstLanguage());

					if (tts.isLanguageAvailable(locale) == TextToSpeech.LANG_AVAILABLE) {
						btnPlay.setEnabled(true);
					}
					else {
						btnPlay.setEnabled(false);
					}
				}

●変更後

				if (gmodel.getSrcLanguage().equals("ja")) {
					btnPlay.setEnabled(playable_ja);
				}
				else {
					if (playable) {
						Locale locale = getLocale(gmodel.getDstLanguage());

						if (tts.isLanguageAvailable(locale) == TextToSpeech.LANG_AVAILABLE) {
							btnPlay.setEnabled(true);
						}
						else {
							btnPlay.setEnabled(false);
						}
					}
				}

また、「play」ボタンが押された時の処理は、以下のような変更になります。

●playボタンクリック処理変更前

    					if (tts.isSpeaking()) {
    						tts.stop();
    					}

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

●playボタンクリック処理変更後

    					if (tts.isSpeaking()) {
    						tts.stop();
    					}
    					else if (jatts.isSpeaking()) {
    						jatts.stop();
    					}

    					if (gmodel.getDstLanguage().equals("ja")) {
    						HashMap<String, String> params = new HashMap<String, String>();
    						params.put(JapaneseTextToSpeech.KEY_PARAM_SPEAKER, "female01");
	    					jatts.speak(gmodel.getTranslated(), TextToSpeech.QUEUE_FLUSH, params);
    					}
    					else {
        					tts.setLanguage(getLocale(gmodel.getSrcLanguage()));
        					tts.speak(gmodel.getTranslated(), TextToSpeech.QUEUE_FLUSH, null);
    					}

これで、日本語もしゃべるようになりました!前回同様、実行結果は、サンプルソースを試していただければと思います!

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

サンプルソース

サンプルソースには、libフォルダ配下にandroid-jatts-0.0.1.jarも含んでいますが、プロジェクトへの登録が再度必要ですので、ご注意ください。