Network Tech/소프트웨어
굳나잇! Cortana / SmartServer
또자쿨
2016. 2. 19. 15:14
아이폰 6 광고를 보다 마지막 장면에 관심이 쏴악 쏠렸습니다. 한 남자가 Siri에게 good night이라 말하자 주변 등들이 소등되죠.
이 장면은 사실 많은 부분이 생략된 구성이라 생각합니다. 현재 애플에서 제공하는 Siri API지원이 제한적이라 홈버튼을 누르고 시리에게 직접 내가 원하는 명령을 내려 동작하기는 제약사항들이 꽤 많습니다.
암튼 이 부분에 관심을 가지게 된건 그냥 비슷한걸 해보고자 하는 맘이 훅 달아 올랐기 때문입니다. 일하고 있는 터가 이런 제어를 주로 다루다 보니 말이죠.
여러가지 방법들을 고민해봤습니다. 진짜 Siri를 이용할까 아니면 제일 간단한 윈도우의 Speech recognition을 이용해서 프로그램을 만들어 볼까?
첫번째 Siri는 첫 메인화면에서 뭔가를 하기엔 제약사항이 많았습니다. 광고와 같이 Good Night이라는 말로 뭔가를 바로 명령하기에는 어려운 부분들이 많았습니다… 물론 몰라서 그럴수도 있습니다.
두번째 윈도우에서 제공하는 Speech recognition의 경우 음성인식 확률이 굉장히 떨어지더군요. 제 발음이 쓰레기라 그런지 몰라도 생각만큼의 퍼포먼스를 보여주지 못했습니다. 사실 젤 맘에 들지 않았던 건 컴터 목소리였습니다. C#에서 제공하는 API의 경우 나이때, 성별을 구분할수는 있었으나 영….
그래서 고민하다 윈도우10의 Cortana를 떠올리게 되었습니다. 아직 한글을 지원하지는 않지만 그래도 제일 인간을 흉내내는 목소리기 때문에 이정도면 뭔가 자연스럽겠다 생각했습니다.
1. Custom Cortana command
Cortana에게 사용자가 원하는 명령어에 어떤 것을 반응하게 하기위해서는 Universal Windows Platform 프로그래밍이 필요합니다. VCD라고 하는 XML형식의 파일을 등록해야 합니다. 사용자가 원하는 명령과 그 외 Cortana의 반응 메시지등을 설정할 수 있습니다.
이를 위해 아래 내용들을 참고 했습니다.
2. 무엇을 할 것인가?
해보고자 했던건 내가 명령을 목소리로 보내면 프로그래밍 된 UWP프로그램이 애쉴론의 스마트서버에게 Digital Output포인트 값을 바꾸는 명령의 Soap request를 보냅니다. 그럼 Digital Output에 연결되어 있는 어떠한 전기장비에 전원을 공급 및 비공급형태로 바꿔 제어하는 것입니다.
여러방법이 존재할것입니다. 이런 하드웨어 제어를 위해 라즈베리파이부터 해서 소형 마이크로프로세서를 이용해도 되고요. 다 귀찮고 그냥 있는 제품인 애쉴론의 스마트서버를 이용하기로 했습니다.
3. UWP 프로그래밍
지금까지는 해봤자 .NET Framework을 이용한 윈도우폼정도를 다뤘는데 UWP는 조금 새로운 개념입니다. 윈도우 8부터 시작된 앱의 개념인 것이죠. 윈도우폰, 윈도우 컴퓨터, 윈도우 태블릿등에서 사용될 수 있는 형태의 앱이라고 보면 됩니다. 따라서 기존 .NET Framework의 개념과는 좀 다르더군요.
Soap 통신을 위해 WSDL을 Import 했으나 윈도우폼에서의 각종 Function들의 Property들이 다 바뀌더군요. Await와 Async라는 개념이 들어와서 인 듯 한데 귀찮아서 아직은 공부하지 않았습니다. :)
단순히 몇개의 간단한 Soap 메시지를 보내면 됐기에 그냥 httpClient()를 사용하여 수동으로 Header와 Body를 String으로 넣어 하나의 패킷을 완성했습니다. 물론 복잡한 프로그래밍을 위해서라면 이렇게 했다간 패킷 만드는 노가다를 하게되겠지요.
하지만 여기선 끄고 키는 두개의 메시지 포맷만을 필요로 하니 간단히 만들었습니다.
Command XML
이번에 사용한 VCD입니다. Good이라는 prefix를 이용해 이를 시작으로 그 다음 단어에 따라 다르게 반응하게 됩니다.
<ListenFor>태그를 통해 Good morning이나 Good night이냐에 따라 다른 동작, 다른 feedback 음성으로 반응합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?xml version="1.0" encoding="utf-8" ?>
<CommandSet xml:lang="en-us" Name="CustomCommands">
<CommandPrefix>good </CommandPrefix>
<Example>Soap request to SmartServer </Example>
<Command Name="TurnOn">
<Example> Turn on Digital output of SmartServer </Example>
<ListenFor> morning </ListenFor>
<ListenFor> afternoon </ListenFor>
<ListenFor> evening </ListenFor>
<Feedback> Hi Sean. I'll turn on the lights.</Feedback>
<Navigate/>
</Command>
<Command Name="TurnOff">
<Example> Turn off Digital output of SmartServer</Example>
<ListenFor>bye </ListenFor>
<ListenFor>night </ListenFor>
<Feedback> Goodbye Sean. Good job today.</Feedback>
<Navigate/>
</Command>
</CommandSet>
</VoiceCommands>
|
cs |
4. 결과
자 동영상을 보시죠. 별거 아닌걸 가지고 그래도 몇일 고생했습니다. 근데 이걸 왜 했지??