[글또] 음성 명령어 인식 라이브러리 소개 (JSGF, Voice2Json, Rhasspy)

Judy·2024년 4월 14일
0

Nugu, Google Assistant 등의 인공지능 스피커 및 음성 비서와 같은
각종 음성 인식 서비스는 사용자의 발화를 어떻게 명령어로 인식할까요?

사용자의 발화 명령어는 텍스트로 변환되고, 이 텍스트가 기존에 정의한 명령어라면 해당 명령을 수행합니다.
이렇게 인식된 사용자의 음성이 명령어인지, 명령어라면 어떤 명령을 수행하는지 판별하여 명령을 수행할 수 있도록 하는 모듈이 필요한데,
저는 챗봇 원리를 차용한 '음성 명령 봇' 을 개발하여 음성 명령 인식 및 수행 모듈로 사용될 수 있게 하였습니다.

이 과정에서 음성 명령을 인식할 수 있도록 개발된 'Voice2Json' 라이브러리를 가장 먼저 적용해 보았습니다.
이 Voice2Json 은 NLU 라이브러리 'Rhasspy'에 각종 음성 인식 모듈을 붙인 라이브러리이므로
최종적으로는 Rhasspy 를 이용해 명령봇을 개발하였습니다.
(STT모델은 이미 사용중인 다른 모델이 있어서 음성 인식 모듈을 따로 사용할 필요가 없고, 텍스트만 처리하면 되었거든요)
Rhasspy 를 이용해 텍스트로 변환된 발화 의도를 분류하고 slot-filling 을 적용하였으며
이를 위해 명령어 규칙을 미리 설계할 때 'JSGF (Java Speech Grammar Format)' 언어를 이용했습니다.

Voice2Json 은 Rhasspy 를 리패키징하여 만든 라이브러리이므로
본 포스팅에서는 주로 Rhasspy 위주로 우선 설명합니다.

라이브러리 및 언어 소개

Voice2Json

https://github.com/synesthesiam/voice2json

voice2json is a collection of command-line tools for offline speech/intent recognition on Linux. It is free, open source (MIT), and supports 18 human languages.

'리눅스 오프라인 환경에서 사용할 수 있는 의도 파악 툴'

Voice2Json 구성

  • rhasspy/rhasspy-nlu (문장을 파싱하고 의도를 인식하는 NLU 라이브러리)
  • 음성 처리 모듈
    • Kaldi 등
  • Robust 하게 명령어를 인식하는 각종 기능들

쉽게 말해, wav 파일을 입력하면 json 포맷에 맞추어 event 를 추출합니다.
이벤트를 추출하기 위해 미리 룰(rule) 을 작성하는데요,
이 때 사용하는 언어(문법 규칙)가 'JSGF' 입니다.

JSGF (Java Speech Grammar Format)

The JSpeech Grammar Format (JSGF) is a platform-independent, vendor-independent textual representation of grammars for use in speech recognition.

음성 인식에 사용되는 문법 규칙으로, Java 언어의 스타일과 규칙에 더해 JSGF만의 문법을 사용하는 것이 특징입니다.

Example
조명 색을 설정하는 명령어 규칙 예시
(Java 와 유사해 보이지만 사실 다른 언어(문법) 이라는 걸 알 수 있죠?)

[SetLightColor]
colors = (red | green | blue){color}
set the light to <colors>

Rhasspy (Rhasspy-NLU)

https://github.com/rhasspy/rhasspy-nlu

Rhasspy is an open source, fully offline set of voice assistant services

쉽게 표현하면 JSFG 포맷에 맞춰 미리 짜 둔 규칙(rule) 을 적용하여
입력받은 발화 텍스트의 의도(intent) 를 분류하고,
개체명 (entity) 를 인식하고, slot-filling 을 수행합니다.
(챗봇 동작원리 및 intent, slot-filling 등의 챗봇 용어는 'kochat' 메뉴얼에 설명이 잘 되어 있습니다.
https://github.com/hyunwoongko/kochat/blob/master/docs/02_about_chatbot.md)

(Tip) 한국어도 지원하므로 룰을 한국어로 짜도 됩니다 🤗

Example
1. JSGF 포맷에 맞춰 룰 작성

[SetLightColor]
colors = (red | green | blue){color}
set the light to <colors>
  1. Rhasspy 에 명령어 발화 텍스트 입력
    🗣️ : `set the light to red``

  2. Rhasspy 실행 결과

{
    "intent": {
        "name": "SetLightColor"
    },
    "entities": [
        { "entity": "color", "value": "red" }
    ],
    "slots": {
        "color": "red"
    }
}

예시와 같이 Rhasspy 는 사용자의 발화 텍스트를 입력받고,
미리 작성한 룰에 맞춰 intent, entity, slot value 를 채워 줍니다.
이 룰은 목적에 따라 문법에 맞춰 작성하면 더 복잡한 명령어를 인식할 수 있습니다.


자세한 명령어 사용 예시 및 동작 원리는
다음 포스팅과 GitHub 에 메뉴얼을 만들어 설명할 예정입니다 🥰

profile
NLP Researcher

0개의 댓글