음성 합성 액션

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()
     {
     }
 }

Tts 액션의 객체를 얻기 위해서는 Action 클래스의 obtain(Context context, String actionId) 메소드에서 actionId에 Action.Tts.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.Tts.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() 메소드에서 액션을 중지 및 폐기하였지만 어디에서 해도 상관은 없다. 애플리케이션을 종료하기 전에 액션을 모두 폐기하여야 한다는 것만 잊지 않도록 하자.

Tts 액션에는 음성 합성할 문자열을 쓰는 디바이스로 COMMAND_TEXT가 있다.

 public class SampleActivity extends RobotActivity
 {
     private Action mAction;
     private Device mTextDevice;

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

         mAction = Action.obtain(this, Action.Tts.ID);
         mTextDevice = mAction.findDeviceById(Action.Tts.COMMAND_TEXT);
         mTextDevice.writeString("안녕하세요");
         mAction.activate();
     }

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

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

     @Override
     public void onInitialized(Robot robot)
     {
     }

     @Override
     public void onExecute()
     {
     }
 }

알버트 로봇의 몸도 좌우로 움직여 보도록 하자.

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

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

         mAction = Action.obtain(this, Action.Tts.ID);
         mTextDevice = mAction.findDeviceById(Action.Tts.COMMAND_TEXT);
         mTextDevice.writeString("안녕하세요");
         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()
     {
         if((++mCount / 50) % 2 == 0)
         {
             mLeftWheelDevice.write(20);
             mRightWheelDevice.write(-20);
         }
         else
         {
             mLeftWheelDevice.write(-20);
             mRightWheelDevice.write(20);
         }
     }
 }

인사가 끝났는데 몸을 계속 움직이니 이상하다. 음성 출력이 끝날 때 정지하도록 해보자.

액션이 완료되었는지 알기 위해서는 Action 클래스의 setOnCompletedListener(Action.OnCompletedListener listener) 메소드를 사용하여 리스너를 설정하면 된다. Tts 액션의 음성 출력이 끝나 액션이 완료되었을 때 Action.OnCompletedListeneronCompleted(Action) 메소드가 호출되므로 여기서 알버트 로봇이 정지하도록 하면 된다.

 public class SampleActivity extends RobotActivity implements Action.OnCompletedListener
 {
     private Action mAction;
     private Device mTextDevice;
     private Device mLeftWheelDevice;
     private Device mRightWheelDevice;
     private int mCount;
     private boolean mCompleted;

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

         mAction = Action.obtain(this, Action.Tts.ID);
         mAction.setOnCompletedListener(this); // 리스너를 설정한다.
         mTextDevice = mAction.findDeviceById(Action.Tts.COMMAND_TEXT);
         mTextDevice.writeString("안녕하세요");
         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()
     {
         if(mCompleted)
         {
             mLeftWheelDevice.write(0);
             mRightWheelDevice.write(0);
         }
         else
         {
             if((++mCount / 50) % 2 == 0)
             {
                 mLeftWheelDevice.write(20);
                 mRightWheelDevice.write(-20);
             }
             else
             {
                 mLeftWheelDevice.write(-20);
                 mRightWheelDevice.write(20);
             }
         }
     }

     @Override
     public void onCompleted(Action action)
     {
         mCompleted = true;
     }
 }