세 줄 요약 :

1. 음성인식으로 커맨드를 입력함

2. 그럭저럭 되긴 함

3. 철권을 사랑하는 몸이 불편한 분들도 이걸로 플레이 할 수 있지 않을까?





장황한 이야기 :



여느때처럼 갤을 보던 중, 입철권이라는 표현이 눈에 들어왔습니다.
일반적으로 남의 게임에서 일해라 절해라 하는 사람들을 보고 비아냥거리는 표현인데, 왠지 그냥 입에 착착 달라붙어서 재미있어 보였어요.

재미있어 보이면 만들어야죠.

그래서 입철권 프로그램을 만들어봤습니다.


트수들이 채팅창에 기술이름 쓰는 것 처럼, 커맨드창에 키보드로 기술명을 입력하면 나가는 걸 말이죠.

그런에 이게 .. 윈도우 포커스가 철권 창을 벗어나면 조이스틱이 아닌 이상 인게임상에 커맨드가 입력이 되지 않더라구요.

그래서 고안해낸 방법이,

1) 콘솔창에 한글로 커맨드를 입력한다
2) 입력받은 커맨드를 방향입력으로 전환한다
3) 가상 조이스틱을 에뮬레이션해서 2)의 데이터와 매핑
4) 철권에 입력

그래서 이래저래 만들었습니다.


어찌됐건 만들긴 했는데, 이것은 진정한 입철권은 아니죠.
그래서 이번엔 음성인식 기능을 추가했습니다.

음성인식을 하는 여러가지 방법이 있는데, 가장 빠른 방법은 남이 만든걸 활용하는 것입니다. 다양한 음성인식 API들이 있는데, 그 중 저는 구글 Cloud Speech-to-Text API[1] 를 이용했어요. 한국어 입력 성능도 가장 좋은 편이구요.

그래서 앞선 방법에서

1) 음성을 인식한다
2) 입력받은 음성을 텍스트로 변환한다
----
3) 입력받은 커맨드를 방향입력으로 ..
4) 이하 동일

의 방법이 추가된 것이죠.

이걸로 잘 되긴 했는데, 문제는 인식의 성능입니다. 초풍 이라고 말하면 소풍으로 인식한다거나, 나락이라고 말하면 나라 라고 인식한다거나 하는 문제입니다.

이건 일반적이지 않은 단어가 음성으로 인식 될 경우, 내부적으로 잘 알려진 단어로 변환하기 때문입니다. 그래서 우리가 의도한 단으로 재변경을 할 필요가 있었죠.

보통 이런건 word correction 알고리즘에서 많이 다루는데, 요즘은 word2vec 이나 fasttext같은 ANN(일반적으로 딥러닝이라고 부르는 그것)을 활용한 NLP테크닉으로 해소하곤 합니다. 하지만 이런 장난감 프로그램을 위해서 수많은 갤 글들을 크롤링 한 다음에 머신러닝 텍스트 모델을 만드는건 너무 과한 일이기도 하고, Vectorization에 의한 결과는 글 문맥에 의한 의미기반이기에 단순 기술명을 입력해서 수정하는건 용도에 맞지 않습니다.

그래서 저는 가장 단순한 테크닉 중 하나인 Levenshtein distance[2] 알고리즘을 사용했습니다. 식은 아래와 같습니다 :

uc?export=view&id=1f5Ym1HQNqy2bl-j2dITkAp8Vp-tNCwOG


간단하게 말해서, 소풍이라는 입력이 들어왔을때 기존에 보유하고 있는 기술들인 초풍, 나락, 웨캔마신, 웨이브 라는 단어들 중에서 어떤 단어가 가장 적은 수정소요가 필요한지를 수치화 해서, 그 값이 가장 적은 단어로 수정하는 테크닉이라고 생각하시면 될 것 같습니다.

이게 가장 잘 동작을 하려면 한글도 자모단위로 분리가 되어야 하는데, 다행히 이걸 만들어놓으신 분이 계셨습니다[3]

그래서 적용시켜 플레이 해봤습니다.



감탄사로 오를 말했는데 초풍이 나가는 것은, 오라는 입력에 가장 가까운 커맨드가 초풍이기 때문입니다. 어찌됐건 되긴 하네요.

다만 음성입력 -> 구글 서버로 전송 -> 결과 다운로드 -> 분석의 과정을 거치기 때문에 반응이 느린건 어쩔 수 없습니다. 이 부분은 오프라인 전용 음성 모델을 만들어 프로그램에 내장하면 해결 될 문제로 보입니다.

오늘도 정말 쓸데없는데 시간을 보냈네요 ...

병신철찌아재들아 그럼 이만!



* 입철권 어쩌고 쓰긴 했지만, 사실 철권을 좋아하지만 신체에 장애가 있어 게임을 즐길 수 없는 분들이 음성으로 철권을 즐기면 어떨까 하는 생각에 한 번 시도해봤습니다. 시각에 장애가 있어 소리로만 스파를 즐기는 분[4]도 계시지만, 손에 장애가 있으신 분들이 격겜을 하시는 경우는 아직 보지 못해서요.




출처: 철권 갤러리 [원본보기]