組み込みAndroidな元気人を探せ!(3) ―― 音声認識ロボット「ドロンくん」を作ってみた

久保 幸夫

tag: 組み込み 電子回路

コラム 2012年3月30日

●ドロンくんのアプリを改造する

 次は,ドロンくんのAndroidアプリの製作です.ソース・コード(delonkun source)はドロンくん(Delonkun)のFacebookページから入手できます(リスト1.「ノート」として掲載されている).

 

リスト1 「ドロンくん」制御用アプリのソース・コード(dolonkun source)

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端末をドロンくん(本体)に乗せて,イヤホン・ジャックをつなげば完成です.なお,ブレッドボードや電池ボックスは両面テープで固定しました.

 

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日