質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2552閲覧

Androidアプリ 音声認識

MagicalJourney

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2015/09/07 02:09

SpeechRecognizerを利用し、音声認識をするアプリを作成しようとしています。
作りたい機能は、「"go"という言葉を認識したら、3秒間振動し、30度以上傾いたら画面遷移」というものです。
このコードで実行したところ、傾きの検知はできていますが、音声認識がうまくいきません。
ログを追っていくと、StartVr()までは正常に動いているように思えます。
解決策を教えていただけるとありがたいです。よろしくお願いします。

import

1import android.content.Intent; 2import android.hardware.Sensor; 3import android.hardware.SensorEvent; 4import android.hardware.SensorEventListener; 5import android.hardware.SensorManager; 6import android.os.Vibrator; 7import android.speech.RecognitionListener; 8import android.speech.RecognizerIntent; 9import android.speech.SpeechRecognizer; 10import android.support.v7.app.AppCompatActivity; 11import android.os.Bundle; 12import android.util.Log; 13import android.view.View; 14import android.widget.Button; 15import java.util.ArrayList; 16 17public class Playing extends AppCompatActivity implements SensorEventListener{ 18 private SensorManager mSensorManager; 19 private Sensor mAccelerometerSensor; 20 private Sensor mMagnetSensor; 21 22 private float[] mLastAccelerometer = new float[3]; 23 private float[] mLastMagnetometer = new float[3]; 24 private boolean mLastAccelerometerSet = false; 25 private boolean mLastMagnetometerSet = false; 26 27 private float[] mR = new float[9]; 28 private float[] outR = new float[9]; 29 private float[] mOrientation = new float[3]; 30 31 private SpeechRecognizer mSpeechRecognizer; 32 33 34 @Override 35 protected void onCreate(Bundle savedInstanceState) { 36 super.onCreate(savedInstanceState); 37 setContentView(R.layout.activity_playing); 38 39 // センサーマネージャを獲得する 40 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 41 Log.v("SensorService", "Success"); 42 // マネージャから加速度センサーオブジェクトを取得 43 mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 44 Log.v("Accelerometer","Success"); 45 // マネージャから地磁気センサーオブジェクトを取得 46 mMagnetSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 47 Log.v("MagneticField","Success"); 48 // SpeechRecognizer取得 49 mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 50 mSpeechRecognizer.setRecognitionListener(new mRecognitionListener()); 51 Log.v("Recognizer", "Success"); 52 //リスナー登録 53 Button button1 = (Button)findViewById(R.id.buttonToShout); 54 button1.setOnClickListener(new View.OnClickListener() { 55 @Override 56 public void onClick(View v) { 57 startVr(); 58 } 59 }); 60} 61 62 private void startVr() { 63 64 Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 65 intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 66 intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getPackageName()); 67 mSpeechRecognizer.startListening(intent); 68 Log.v("StartVr","Success"); 69 } 70 class mRecognitionListener implements RecognitionListener{ 71 @Override 72 public void onReadyForSpeech(Bundle params) { 73 Log.v("SpeechRecognize", "Ready..."); 74 } 75 @Override 76 public void onBeginningOfSpeech() { 77 Log.v("SpeechRecognize", "Speak!"); 78 } 79 @Override 80 public void onBufferReceived(byte[] buffer) {} 81 @Override 82 public void onRmsChanged(float rs) {} 83 @Override 84 public void onEndOfSpeech() {} 85 @Override 86 public void onError(int error) { 87 switch(error){ 88 case SpeechRecognizer.ERROR_AUDIO: 89 break; 90 case SpeechRecognizer.ERROR_CLIENT: 91 break; 92 case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS: 93 break; 94 case SpeechRecognizer.ERROR_NETWORK: 95 Log.e("SpeechRecognizeError", "Network Error!"); 96 startVr(); 97 break; 98 case SpeechRecognizer.ERROR_NETWORK_TIMEOUT: 99 Log.e("SpeechRecognizeError", "TimeOut!"); 100 startVr(); 101 break; 102 case SpeechRecognizer.ERROR_NO_MATCH: 103 Log.e("SpeechRecognizeError", "No Match!"); 104 startVr(); 105 break; 106 case SpeechRecognizer.ERROR_RECOGNIZER_BUSY: 107 Log.e("SpeechRecognizeError", "Too Busy!"); 108 startVr(); 109 break; 110 case SpeechRecognizer.ERROR_SERVER: 111 Log.e("SpeechRecognizeError", "Server Error!"); 112 startVr(); 113 break; 114 case SpeechRecognizer.ERROR_SPEECH_TIMEOUT: 115 Log.e("SpeechRecognizeError", "No Input?"); 116 startVr(); 117 break; 118 } 119 } 120 @Override 121 public void onEvent(int eventType, Bundle params) {} 122 @Override 123 public void onPartialResults(Bundle partialResults) {} 124 @Override 125 public void onResults(Bundle results) { 126 127 Vibrator vib; 128 Log.v("Recognizer", "Success"); 129 ArrayList<String> recData = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 130 String getData = new String(); 131 132 vib = (Vibrator)getSystemService(VIBRATOR_SERVICE); 133 134 for(String s : recData){ 135 getData += s + " "; 136 if(s.equals("go")) { 137 vib.vibrate(3000); 138 Log.v("Vibration", "Success!"); 139 } 140 Log.v("RecognizedVoice",getData); 141 142 startVr(); 143 } 144 145 } 146 } 147 148 149 @Override 150 public void onSensorChanged(SensorEvent event) { 151 //To change body of implemented methods use File | Settings | File Templates. 152 if(event.sensor == mAccelerometerSensor){ 153 System.arraycopy(event.values,0,mLastAccelerometer,0,event.values.length); 154 mLastAccelerometerSet = true; 155 } 156 if(event.sensor == mMagnetSensor){ 157 System.arraycopy(event.values,0,mLastMagnetometer,0,event.values.length); 158 mLastMagnetometerSet = true; 159 } 160 if(mLastAccelerometerSet && mLastMagnetometerSet){ 161 SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer); 162 SensorManager.remapCoordinateSystem(mR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); 163 SensorManager.getOrientation(mR, mOrientation); 164 // Log.v("OrientationX", String.valueOf(radianToDegree(mOrientation[0]))); 165 // Log.v("OrientationY",String.valueOf(radianToAbsDegree(mOrientation[1]))); 166 // Log.v("OrientationZ",String.valueOf(radianToAbsDegree(mOrientation[2]))); 167 if( radianToAbsDegree(mOrientation[1]) > 30 || radianToAbsDegree(mOrientation[2]) > 30){ 168 Intent intent; 169 intent = new Intent(getApplication(), Lost.class); 170 startActivity(intent); 171 } 172 } 173 } 174 175 int radianToAbsDegree(float rad) { 176 return (int)Math.floor(Math.toDegrees(Math.abs(rad))); 177 } 178 179 180 181 @Override 182 protected void onResume() { 183 super.onResume(); 184 mLastAccelerometerSet = false; 185 mLastMagnetometerSet = false; 186 187 // 200msに一度SensorEventを観測するリスナを登録 188 mSensorManager.registerListener(this, mAccelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL); 189 mSensorManager.registerListener(this, mMagnetSensor, SensorManager.SENSOR_DELAY_NORMAL); 190 } 191 192 @Override 193 protected void onPause() { 194 super.onPause(); 195 196 // 非アクティブ時にSensorEventをとらないようにリスナの登録解除 197 mSensorManager.unregisterListener(this); 198 } 199 200 @Override 201 public void onAccuracyChanged(Sensor sensor, int accuracy) { 202 //To change body of implemented methods use File | Settings | File Templates. 203 } 204} 205

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。ソースには問題はなく、AndroidManifestで、RECORD_AUDIOのパーミッションがうまく通っていなかったのが原因でした。その後、振動中に画面遷移してしまうという問題が出てきましたが、画面遷移の条件を緩めて80度以上を条件とすることで解決しました。

投稿2015/09/07 03:54

MagicalJourney

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問