음성 합성 액션

01. 인사하기

작고 예쁜 알버트 로봇이 인사를 하면 귀여울 것 같다. 좌우로 몸을 움직여 애교를 부리면서 인사하도록 해보자.

문장을 스마트 폰의 스피커로 출력하는 프로그램을 작성하시오.

웹 페이지 만들기를 참고하여 안드로이드 프로젝트와 웹 페이지 파일을 만들자. onInitialized(robot) 콜백 함수와 onExecute() 콜백 함수를 만들고, 웹 페이지가 닫힐 때 호출되는 window.onunload 함수도 만들자.

 <script type="text/javascript">

 function onInitialized(robot)
 {
 }

 function onExecute()
 {
 }

 window.onunload = function()
 {
 }
 </script>

Tts 액션의 객체를 얻기 위해서는 Action 객체의 obtain(actionId) 함수에서 actionId에 Action.Tts.ID를 입력하면 된다.

 <script type="text/javascript">

 var action = Action.obtain(Action.Tts.ID); // 액션 객체를 얻는다.
 action.activate(); // 액션을 시작한다.

 function onInitialized(robot)
 {
 }

 function onExecute()
 {
 }

 window.onunload = function()
 {
     action.deactivate(); // 액션을 중지한다.
     action.dispose(); // 액션을 폐기한다.
 }
 </script>

window.onunload 함수에서 액션을 중지 및 폐기하였지만 어디에서 해도 상관은 없다. 웹 페이지가 닫히기 전에 액션을 모두 폐기하여야 한다는 것만 잊지 않도록 하자.

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

 <script type="text/javascript">

 var action = Action.obtain(Action.Tts.ID);
 var textDevice = action.findDeviceById(Action.Tts.COMMAND_TEXT);
 textDevice.writeString("안녕하세요");
 action.activate();

 function onInitialized(robot)
 {
 }

 function onExecute()
 {
 }

 window.onunload = function()
 {
     action.deactivate();
     action.dispose();
 }
 </script>

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

 <script type="text/javascript">

 var leftWheelDevice;
 var rightWheelDevice;
 var count = 0;

 var action = Action.obtain(Action.Tts.ID);
 var textDevice = action.findDeviceById(Action.Tts.COMMAND_TEXT);
 textDevice.writeString("안녕하세요");
 action.activate();

 function onInitialized(robot)
 {
     leftWheelDevice = robot.findDeviceById(Albert.EFFECTOR_LEFT_WHEEL);
     rightWheelDevice = robot.findDeviceById(Albert.EFFECTOR_RIGHT_WHEEL);
 }

 function onExecute()
 {
     if((++count / 50) % 2 == 0)
     {
         leftWheelDevice.write(20);
         rightWheelDevice.write(-20);
     }
     else
     {
         leftWheelDevice.write(-20);
         rightWheelDevice.write(20);
     }
 }

 window.onunload = function()
 {
     action.deactivate();
     action.dispose();
 }
 </script>

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

Tts 액션의 음성 출력이 끝나 액션이 완료되었을 때 onActionCompleted(action) 콜백 함수가 호출되므로 여기서 알버트 로봇이 정지하도록 하면 된다.

 <script type="text/javascript">

 var leftWheelDevice;
 var rightWheelDevice;
 var count = 0;
 var completed = false;

 var action = Action.obtain(Action.Tts.ID);
 var textDevice = action.findDeviceById(Action.Tts.COMMAND_TEXT);
 textDevice.writeString("안녕하세요");
 action.activate();

 function onInitialized(robot)
 {
     leftWheelDevice = robot.findDeviceById(Albert.EFFECTOR_LEFT_WHEEL);
     rightWheelDevice = robot.findDeviceById(Albert.EFFECTOR_RIGHT_WHEEL);
 }

 function onExecute()
 {
     if(completed)
     {
         leftWheelDevice.write(0);
         rightWheelDevice.write(0);
     }
     else
     {
         if((++count / 50) % 2 == 0)
         {
             leftWheelDevice.write(20);
             rightWheelDevice.write(-20);
         }
         else
         {
             leftWheelDevice.write(-20);
             rightWheelDevice.write(20);
         }
     }
 }

 function onActionCompleted(action)
 {
     completed = true;
 }

 window.onunload = function()
 {
     action.deactivate();
     action.dispose();
 }
 </script>