음성 인식 액션

01. 음성으로 조종하기

알버트 로봇을 음성 명령으로 움직여 보자.

음성 명령으로 알버트 로봇을 앞뒤로 움직이는 프로그램을 작성하시오.

로봇을 움직이기 위해 RobotActivity 클래스를 상속한 액티비티를 만들고, onInitialized(Robot) 메소드와 onExecute() 메소드를 상속받아 새로 구현하자. Activity 클래스의 onDestroy() 메소드도 상속받아 새로 구현하고, 프로젝트에 스마트 로봇 라이브러리를 포함하는 것을 잊지 않기를 바란다.

 public class SampleActivity extends RobotActivity
 {
     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();
     }

     @Override
     public void onInitialized(Robot robot)
     {
     }

     @Override
     public void onExecute()
     {
     }
 }

VoiceRecognition 액션의 객체를 얻기 위해서는 Action 클래스의 obtain(Context context, String actionId) 메소드에서 actionId에 Action.VoiceRecognition.ID를 입력하면 된다.

 public class SampleActivity extends RobotActivity
 {
     private Action mAction;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mAction = Action.obtain(this, Action.VoiceRecognition.ID); // 액션 객체를 얻는다.
         mAction.activate(); // 액션을 시작한다.
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();

         mAction.deactivate(); // 액션을 중지한다.
         mAction.dispose(); // 액션을 폐기한다.
     }

     @Override
     public void onInitialized(Robot robot)
     {
     }

     @Override
     public void onExecute()
     {
     }
 }

onCreate(Bundle savedInstanceState) 메소드에서 액션을 얻어서 시작하고 onDestroy() 메소드에서 액션을 중지 및 폐기하였지만 어디에서 해도 상관은 없다. 애플리케이션을 종료하기 전에 액션을 모두 폐기하여야 한다는 것만 잊지 않도록 하자.

VoiceRecognition 액션에는 음성 인식 결과를 얻는 디바이스로 EVENT_TEXT가 있다.

 public class SampleActivity extends RobotActivity
 {
     private Action mAction;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mAction = Action.obtain(this, Action.VoiceRecognition.ID);
         mAction.addDeviceDataChangedListener(this);
         mAction.activate();
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();

         mAction.deactivate();
         mAction.dispose();
     }

     @Override
     public void onInitialized(Robot robot)
     {
     }

     @Override
     public void onExecute()
     {
     }

     @Override
     public void onDeviceDataChanged(Device device, Object values, long timestamp)
     {
         switch(device.getId())
         {
         case Action.VoiceRecognition.EVENT_TEXT:
             {
                 String[] results = (String[])values;
             }
             break;
         }
     }
 }

음성 인식 결과에 따라 알버트 로봇을 앞뒤로 움직여 보도록 하자.

 public class SampleActivity extends RobotActivity
 {
     private Action mAction;
     private Device mLeftWheelDevice;
     private Device mRightWheelDevice;

     @Override
     public void onCreate(Bundle savedInstanceState)
     {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mAction = Action.obtain(this, Action.VoiceRecognition.ID);
         mAction.addDeviceDataChangedListener(this);
         mAction.activate();
     }

     @Override
     public void onDestroy()
     {
         super.onDestroy();

         mAction.deactivate();
         mAction.dispose();
     }

     @Override
     public void onInitialized(Robot robot)
     {
         mLeftWheelDevice = robot.findDeviceById(Albert.EFFECTOR_LEFT_WHEEL);
         mRightWheelDevice = robot.findDeviceById(Albert.EFFECTOR_RIGHT_WHEEL);
     }

     @Override
     public void onExecute()
     {
     }

     @Override
     public void onDeviceDataChanged(Device device, Object values, long timestamp)
     {
         switch(device.getId())
         {
         case Action.VoiceRecognition.EVENT_TEXT:
             {
                 String[] results = (String[])values;
                 for(String result : results)
                 {
                     if(result.equals("앞으로"))
                     {
                         mLeftWheelDevice.write(20);
                         mRightWheelDevice.write(20);
                         break;
                     }
                     else if(result.equals("뒤로"))
                     {
                         mLeftWheelDevice.write(-20);
                         mRightWheelDevice.write(-20);
                         break;
                     }
                 }
             }
             break;
         }
     }
 }

프로그램을 실행하고 스마트 폰의 마이크에 '앞으로' 또는 '뒤로'라고 말을 하면 알버트 로봇이 움직일 것이다.