아리아, 명상틀어줘
최근 NUGU Developers 및 Nugu Play가 출시되었다.
이름은 좀 베낀감이 있지만 NUGU Play는 인공지능 스피커를 이용하여 스마트폰 앱을 만들 듯이 인공지능 스피커 앱을 만드는 것이다. 다만 다른점은 음성명령과 소리 응답만 가능하다는 것이다.
언뜻 보면 스마트폰은 화면과 소리, 진동 등 많은 것을 컨트롤해야하는 반면 소리만 컨트롤하는 누구는 개발하기가 쉽다고 생각할 수 있는데, 사실이다. 개발하기 쉽다.
사실 정말 누구나 할 수 있을 정도로 쉽다. 코드한줄 적지 않고도 개발이 가능하다.
이 글에서는 최근 개최된 NUGU Play Builder 개발 공모전에 탈락한 에피소드를 다루려고한다.
공모전 마감 며칠 전 친구를 통해 이 공모전의 존재를 알게 되었다. 개발 문서를 읽어보니 코드는 거의 없고 개념만 이해한다면 쉽게 개발할 수 있었다. 경험삼아 개발해보기로 했다. 주제는 명상도우미.
헤드스페이스를 사용하며 명상이 좀 괜찮다라는 걸 느끼고 있던 찰나 음성으로만 서비스가 가능한 누구 디바이스로 제공할 수 있는 안성맞춤 서비스라고 생각했다. 명상에 여러 테마가 있기에, 매일매일 달라지는 테마와 원하는 테마를 명령하면 틀어주는 방식을 생각했다. 월요일에는 활기가 넘쳐야하니 에너제틱을 위한 명상, 금요일에는 평일을 마무리하며 휴식을 위한 명상을 틀어주는 식이다.
나는 누구의 음성으로 명상을 틀어주려고 했지만 응답이 길면 안된다는 것을 보고 직접 녹음을 하게 되었다. 스크립트를 짜고 천천히 녹음을 했다. 그리고 이 음성녹음 파일을 스트리밍으로 재생을 해주면 서비스가 끝이다. 그럼 바로 누구 디바이스가 내 명령을 알아들을 수 있게 개발을 해보자.
NUGU Developers 가이드를 보면 너무 잘나와있어서 자세한 설명은 여기 적지 않겠지만, 음성 명령을 몇가지 분류로 나눈다. 예를들어 "명상 틀어줘" 라는 명령은 명상을 틀어달라는 의도이다. 다른말로 "명상 좀 틀어주지 않을래?" 또한 같은 의도이다. 따라서 명령을 의도에 따라 묶어준다. 이 의도를 Intent라고 정의한다.
여러 인탠트가 있겠지만 내가 제공하고자 하는 서비스는 딱 하나의 인탠트이다. 명상을 틀어주는 것. 하지만 추천명상을 원하는 명령, 원하는 테마명상을 틀고싶은 명령 이 두가지로 나누어 인탠트를 정의했다.
추천명상을 틀어달라는 말을 여러가지 말로 할 수 있다. 그냥 "명상 시작해줘"라고 말해도 추천명상을 틀어달라는 것이고, "추천 명상 틀어줄래", "추천 명상 시작해줘" 등 한끗차이로 말은 다르지만 모두 같은 의도를 갖고 있음을 알 수 있다. 친절하게도 예상발화를 쭉 적어나가면 알아서 NUGU가 학습을 한다. 우리가 할일은 그저 예상 발화를 최대한 많이 적는 것이다.
그리고 "집중을 위한 명상 틀어줘"라고 명령했을 때 원하는 테마명상을 틀고 싶은 것이 인탠트이고 어떤 테마를 원하는지를 파악해야하는데 저 명령에서는 '집중'이 해당된다. 이 의도는 같지만 원하는 것이 다를 수 있는 항목을 Entity라고 한다.
예를 들면 당신이 아르바이트를 하고 있는 편의점에 손님이 들어왔는데, 당신을 향해 "담배 주세요" 라고 했을 때 손님이 원하는 의도는 담배를 구입하는 것을 알 수 있지만 당신은 선뜻 담배를 줄 수 없다. 그 이유는 어떤 담배를 줄지 모르기 때문이다. 여기서 당신은 다시 물을 것이다. "어떤 담배를 드릴까요?" 여기서 담배를 구입하려는 것이 의도이고 어떤 담배에 해당하는 것이 엔티티이다.
서비스에 따라 엔티티는 여러 타입을 지정할 수 있다. 나는 이용자가 원하는 테마명상을 틀어주면 되기에 MEDI_TYPE이라는 타입 엔티티를 정의했다. 그 안에 스트레칭, 휴식, 수면, 집중 등을 추가하고 동의어로 비슷한 말들을 모두 적어주었다. 이렇게 한다면 "몰입을 위한 명상 틀어줘"라고 명령했을 때 말은 다르지만 '집중'이라는 하나의 대표값으로 정해줄 수 있다.
예상발화를 적고 엔티티부분을 마우스로 드래그하면 손쉽게 엔티티를 추가할 수 있다. NUGU Play 개발팀의 세심한 배려를 엿볼 수 있었다.
이용자가 원하는 의도를 파악하고나서 이제 누구 디바이스가 대답할 차례이다. 이것을 Action이라고 한다. 인탠트에 따라 액션을 정할 수 있다.
액션을 정하는 것도 매우 간단하다.
어떤 명령에 대한 응답인지 선택하고,
그 응답에 대해 텍스트로 적어주면 된다. 각진 괄호로 된 것은 아까 정했던 엔티티에 해당한다. "집중을 위한 명상 틀어줘"라고 명령했다면 "집중을 위한 명상을 시작할게요."라고 응답한다.
캡처화면 속 여러 유형들이 많아 복잡해 보일 수 있는데, 전혀 복잡하지 않다. Resopnse 유형이 Prompt + Directive라고 되어있는데, 이것은 스트리밍을 제공하기 위함이다. Directive는 음성 응답외에 추가로 컨트롤 해야할 것이 있을 때 선택하는 항목이다. 우선 응답을 확인하기 위해 Prompt만 선택하면 된다.
여기까지 했다면 심사 요청을 한다. 당신의 누구 디바이스를 테스트 디바이스로 등록하고 당신의 서비스를 누릴 수 있다. 심사에 통과한다면 누구 디바이스에서 당신의 서비스를 이용할 수 있게 되는 것이다.
스트리밍 서비스의 경우 약간의 코딩이 필요하다. 이 글에 적으면 코드에 묻힐 당신을 위해 적지 않겠다.
Github에 코드와 간단한 튜토리얼을 함께 업로드 했다.
이렇게 명상도우미를 제작하고 공모전에 제출하고 광탈했다.
쉬운 개발과 즉각적인 응답, 재미있는 개발. 심지어 누구 디바이스가 없어도 웹상에서 테스트할 수 있다.(스트리밍은 안 됨) 심사 제출만 하면 테스트 디바이스에서 이용할 수 있기에 음악을 스트리밍 서비스가 아닌 파일로 듣는 분들은 직접 스트리밍 서비스를 만들어서 해보는 것도 좋겠다.