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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。