組み込みAndroidな元気人を探せ!(3) ―― 音声認識ロボット「ドロンくん」を作ってみた
●ドロンくんのアプリを改造する
次は,ドロンくんのAndroidアプリの製作です.ソース・コード(delonkun source)はドロンくん(Delonkun)のFacebookページから入手できます(リスト1.「ノート」として掲載されている).
package jp.delon;
import java.util.ArrayList;import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class delonmain extends Activity {
ToneGenerator toneGenerator;
private static final int REQUEST_CODE = 0;
private void activateRecognize() {
try {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
"Delon-kun Voice Recognition");
startActivityForResult(intent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
}
public void pushTone(int i){
toneGenerator.startTone(i);
try {Thread.sleep(100);} catch (InterruptedException e){ e.printStackTrace();}
toneGenerator.stopTone();
try {Thread.sleep(1000);} catch (InterruptedException e){ e.printStackTrace();}
toneGenerator.startTone(ToneGenerator.TONE_DTMF_4);
try {Thread.sleep(100);} catch (InterruptedException e){ e.printStackTrace();}
toneGenerator.stopTone();
}
@Override public void onCreate(Bundle savedInstanceState) {
toneGenerator = new ToneGenerator(AudioManager.STREAM_SYSTEM,ToneGenerator.MAX_VOLUME);
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
Button btn1 = new Button(this);
btn1.setText("Voice Recognition");
layout.addView(btn1);
pushTone(ToneGenerator.TONE_DTMF_4);
btn1.setOnClickListener(new OnClickListener()
{public void onClick(View v) {activateRecognize();}});
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK){
String resultsString ="";
ArrayList results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
for (int i = 0; i< results.size(); i++){
resultsString += results.get(i);
}
if (resultsString.contains("右"))pushTone(ToneGenerator.TONE_DTMF_1);
if (resultsString.contains("左"))pushTone(ToneGenerator.TONE_DTMF_2);
if (resultsString.contains("前進"))pushTone(ToneGenerator.TONE_DTMF_3);
if (resultsString.contains("stop"))pushTone(ToneGenerator.TONE_DTMF_4);
Toast.makeText(this, resultsString, Toast.LENGTH_LONG).show();
activateRecognize();
}
super.onActivityResult(requestCode, resultCode, data);
}
}
プログラムを改造する場合のヒントとして,プログラムを簡単に説明します.
まず,アプリが起動するとonCreate()メソッドが呼び出されます.onCreate()では,toneGeneratorの準備を行い,画面にボタンを表示します.ボタンが押されると,activateRecognize()で,音声認識機能(音声認識Activity)を呼び出します.
音声認識Activityは,Android端末が音声を受けると,クラウド上のGoogleの音声認識エンジンに送ります.そして,結果が返ってくると,onActivityResult()メソッドが呼び出されます.onActivityResult()では,音声認識の結果(複数)をresultsString(結果を格納する文字列)に入れます.そして,resultsStringの中に「右」,「左」,「前進」などの文字が含まれている場合,pushTone()メソッドを使用して,ToneGeneratorからトーン信号(TONE_DTMF_1など)を送出しています.
onActivityResult()のif文の文字列を変えることによって,認識させたい語句を変えることができます.またpushTone()の引き数を変えることにより異なるトーン信号を出すことができます.また,pushTone()メソッドのThread.sleep()の引き数を変えることにより,トーン信号の送出時間を変更させることができます.
このソース・プログラムをAndroidの開発環境の新規プロジェクトにコピーして,コンパイルすればOKです.なお,Androidの開発環境については,Interface増刊「Smartphone World」や関連書籍,インターネット上のコンテンツなどを参照してください.
後は,Androidにドロンくんのアプリをダウンロードさせて,アプリが正常に音声認識をし,DTMFトーン信号が出ているかをテストします.以下にテスト中のYouTube動画を載せています.
http://www.youtube.com/watch?v=0C8Y-ts66Cw
後は,Android端末をドロンくん(本体)に乗せて,イヤホン・ジャックをつなげば完成です.なお,ブレッドボードや電池ボックスは両面テープで固定しました.