恥ずかしながら仏文科出身である筆者の現在の英語力はソフトウエア関係の英文なら,なんとか読めるという程度のものである。一応,翻訳本の監修をしたこともあるが,翻訳本の監修の場合,英語の知識よりもそのソフトウエアへの知識の方が重要である。なぜなら,翻訳者は外国語のプロであるが,対象のソフトウエアについては,あまり知識がないことがあるからだ。
英文を書く能力は中学生の英作文程度だが,もっとも苦手なのは日本人のご多分にもれず聞く・話すである。今を去ること,二十数年前,新婚旅行に妻と一緒にバリ島に行った。駄文である。妻以外と新婚旅行に行ける幸せものはそういない。
当時,直行便はなく,香港,ジョグジャカルタを経由してバリ島を目指したと記憶している。ジョグジャカルタの空港には,小銃を持った兵士がたくさんいて怖い思いをしたが,捧げ持ったライフルを向けられるほどの粗相はしなかった。
ヤバイ思いをしたのは香港である。トランジットの際(飛行機が変わったので,今で言うならトラスファーなのだろうが,当時はトランジットと言っていた),妻が「ちょっとトイレ」と言ったきり,いつまで経っても出てこない。戻ってきたころには,バリ島へのトランジットご一行の姿はもう見えず,どこへ行ったのかもわからない。
空港のお姉さんを見つけ,バリ島へのトランジットにはどこに行けばいいかを必死になって英語で聞く。お姉さんはキョトンとしている。なぜこんな簡単な英語をわかってくれないのだろうか?文法が違うのか?周りの人も変な目でこっちをみている。パニくる。こんなときに正しい発音なんて出てくるわけがない。rもthも知るものか。お姉さんはしまいに視線を合わせてくれなくなってしまった。
「香港,おいてけぼり」という情けない事態が現実味をおびてイメージされたころ,通りかかった日本人のツアーコンダクターが声をかけてくれた。無事乗り込んだガルーダ・インドネシアは,エアコンが白い霧を煙幕のように吐き続け,ガンガン揺れながら,ジョグジャカルタを目指し太平洋を南下した。
あのとき,Android端末があったらなということで,今回はAndroid1.6で実装されたText-To-Speech機能を使ってみたい。
Androidにしゃべらせるのは,意外に簡単だ。
-------------------------------------------------------------- public class SpeakActivity extends Activity implements OnClickListener, TextToSpeech.OnInitListener { public final static int FP = ViewGroup.LayoutParams.FILL_PARENT; private sText; private Button btnSpeak; private Button btnClear; private TextToSpeech tts; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout=new LinearLayout(this); setContentView(layout); layout.setOrientation(LinearLayout.VERTICAL); layout.setBackgroundColor(color.darker_gray); layout.setGravity(Gravity.LEFT); sText = new EditText(this); sText.setGravity(Gravity.LEFT|Gravity.TOP); sText.setHorizontallyScrolling(true); sText.setLayoutParams( new LinearLayout.LayoutParams(FP,90)); layout.addView(sText); LinearLayout layoutBtn =new LinearLayout(this); layoutBtn.setOrientation(LinearLayout.HORIZONTAL); btnSpeak = new Button(this); btnSpeak.setText("しゃべる"); btnSpeak.setOnClickListener(this); btnClear = new Button(this); btnClear.setText("クリアする"); btnClear.setOnClickListener(this); layoutBtn.addView(btnSpeak); layoutBtn.addView(btnClear); layout.addView(layoutBtn); tts = new TextToSpeech(this, this); } --------------------------------------------------------------
上述のコードはクラスの宣言から,Activityの画面を作るonCreateメソッドまで,だ。SpeakActivityクラスは,Activityクラスを継承し,OnClickListenerとTextToSpeech.OnInitListenerをimplementsする。
今回はEditTextやButtonをコードで画面に配置している。これまでお読みいただいた方ならなんとなくおわかりいただけると思うので,画面作成についての説明は省略する。最後にtts = new TextToSpeech(this, this);でテキストスピーチを生成している。これが今回の目玉だ。もちろん,必要なimportはEclipseの指示通りに適宜,宣言していく。
これで,上のような画面ができる。sTextに入力した英文をbtnSpeakが押されたら,しゃべり,btnClearが押されたら消去するのである。
-------------------------------------------------------------- @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { Locale locale = Locale.ENGLISH; if (tts.isLanguageAvailable(locale) >= TextToSpeech.LANG_AVAILABLE) { tts.setLanguage(locale); Toast.makeText(this, "テキストスピーチが起動しました。", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "テキストスピーチは起動しましたが, 英語は話せません。アプリを終了します。", Toast.LENGTH_LONG).show(); finish(); } } else { Toast.makeText(this, "テキストスピーチの起動に失敗しました。 アプリを終了します。", Toast.LENGTH_LONG).show(); finish(); } } --------------------------------------------------------------
上のコードにあるonInitは,テキストスピーチの初期化終了時に呼び出される。StatusがTextToSpeech.SUCCESSだと,正常に起動されている。今回は英語をしゃべらせたいので,localeにLocale.ENGLISHを指定してtts.isLanguageAvailableメソッドで確認している。TextToSpeech.LANG_AVAILABLE以上の値が返ってこれば,その言語はサポートされている。
ちなみに日本語は未サポートなので,次に示すコードのようにJAPANESEを指定すると,エラーになる。
-------------------------------------------------------------- @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { Locale locale = Locale.JAPANESE; if (tts.isLanguageAvailable(locale) >= TextToSpeech.LANG_AVAILABLE) { tts.setLanguage(locale); Toast.makeText(this, "テキストスピーチが起動しました。", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "テキストスピーチは起動しましたが, 日本語は話せません。アプリを終了します。", Toast.LENGTH_LONG).show(); finish(); } } else { Toast.makeText(this, "テキストスピーチの起動に失敗しました。 アプリを終了します。", Toast.LENGTH_LONG).show(); finish(); } } --------------------------------------------------------------
-------------------------------------------------------------- @Override protected void onDestroy() { super.onDestroy(); if (tts != null) { tts.shutdown(); } } --------------------------------------------------------------
上のコードで示したように、生成したテキストスピーチは画面をonDestroyするタイミングでshutdownし,リソースを解放する。
-------------------------------------------------------------- @Override public void onClick(View view) { if(view == btnSpeak){ String strSpeak = sText.getText().toString(); if (strSpeak != null && !strSpeak.equals("")) { if (tts.isSpeaking()) { tts.stop(); } HashMapmyHash = new HashMap --------------------------------------------------------------(); myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_RING)); tts.speak(strSpeak, TextToSpeech.QUEUE_FLUSH, myHash); } }else if(view == btnClear){ if (tts.isSpeaking()) { tts.stop(); } sText.setText(""); } }
肝心なのは,ボタンが押されたときの処理である。btnSpeakが押されたときは,strSpeakに入力されたテキストを取得し,tts.isSpeaking()でスピーキング中かどうかを確認し,処理中のときはtts.stop()で止めている。
テキストスピーチのパラメータはHashMapで指定する。ここでは, KEY_PARAM_STREAMにSTREAM_RINGの値を指定している。つまり,着信音量で英語を話すようにしているわけだ。Xperia本体で実行するときのことを考えると,着信音量はボタンで簡単に操作できるからだ。tts.speakで入力した英文をしゃべる。btnClearが押された場合は,スピーチを止め,英文をクリアしている。
これでエミュレータがきれいな発音で英文を話すようになったのだが,今回は実機でも試してみたい。パソコンとXperiaをUSBケーブルでつないだら,Xperiaを指で操作し,設定-アプリケーション-開発-USBデバッグにチェックを付ける。
Android端末が認識されていることは,adb devicesで確認できる(adbコマンドにパスが通っている必要がある)。アプリケーションの実行ファイル(.apk)を「adb -d install -r SpeakEnglish.apk」で転送するとメニューにSpeakEnglishが追加される。
I want to go to bali.Where is the transit room?
Androidがしゃべった。