MOVI와 Rasberry PI를 이용한 음성인식과 합성

by 심형주 | 2017-08-01 17:04
아두이노 음성인식



MOVI Arduino Voice Dialog Shield는 아두이노로 컨트롤되는 장치에 음성 다이얼로그를 추가하도록 해줍니다. 자신만의 문장과 신호를 학습시킬 수 있고, 오디오 프런트엔드가 함께 있으며 인터넷 연결이 필요하지 않습니다.  들리는 바에 의하면 수백개의 문장으로 학습시켰던 Jasper을 뛰어넘는 성능입니다. 

하지만 단점이 하나 있습니다. 이것은 라즈베리 파이가 아닌 아두이노를 위해 디자인 되었습니다.

이 설명서는 어떻게 MOVI를 라즈베리 파이에 연결하고 어떻게 쉽게 사용하는지 알려줍니다. 이 튜토리얼을 통해서 아두이노에서의 MOVI 와 친숙해질 수 있다고 확신합니다. MOVI에 대한 적응이 필요하다면, 먼저 Arduino MOVI Instructable을 확인해주세요.


step1 : 재료

만약 라즈베리 파이를 이용해본 적이 없다면, 라즈베리 파이에 대한 설명서를 먼저 읽어주세요.

다음의 준비물들이 필요합니다.

1. 라즈베리 파이 A/B, B+ (최신 버전이 더 잘 작동할 것으로 예상되지만, 아직 테스트 해보지 않았습니다)

2. 라즈베리 파이 전원 공급 기구

3. 헤드폰 잭에 연결 가능한 확성기 (4옴 또는 8옴)

4. MOVI 쉴드 (이곳에서 구매 가능합니다.)

5. 두번째 전원 공급 기구, 예를 들면 12V 500mA 또는 AA 알카인 배터리 4개 (축전지는 5개)

6. 8-10개의 점퍼 케이블

7. LED

8. (선택사항) 안전성을 고려한 아두이노 쉴드를 부착한 빵판



Step2 : Wiring

Wiring

IMG_2129.JPGIMG_2241.JPG


라즈베리 파이

- (선택사항) 빵판 위에 라즈베리 파이를 올려주세요. 저는 확실하게 하기 위해 두개의 압정을 사용했습니다.

- 마우스, 키보드, 모니터를 라즈베리 파이를 연결하고 전원도 연결해주세요. (아직 전원을 켜지 마세요.)


MOVI

1. (선택사항) MOVI를 빵판 위에 눌러서 부착합니다. 단, 합선이 생기지 않도록 헤더핀의 각 부분을 잘 구분지어 주세요.

2. 스피커를 MOVI의 헤드폰 출력부분에 연결해주세요.

3. 두 개의 점퍼 케이블을 이용하여 두번째 전력 공급 기구를 MOVI에 연결해 주세요. (여기서는 4개의 AA건전지를 사용했습니다.)


MOVI <-> 라즈베리 파이

점퍼 케이블을 이용하여 다음에 따라 연결해주세요:

1. 라즈베리 파이 GPIO 핀1 (3.3V)과 MOVI의 IOREF 헤더

2. 라즈베리 파이 GPIO 핀6 (GND)와 MOVI의 두번째 GND 헤더

3. 라즈베리 파이 GPIO 핀10 (GPIO15)와 MOVI의 D10 (TX) 헤더

4. 라즈베리 파이 GPIO 핀8 (GPIO14)와 MOVI의 D11 (RX) 헤더


라즈베리 파이 -> LED

1. LED의 길이가 더 긴 핀을 라즈베리 파이 GPIO 핀12 (GPIO18)에 연결해주세요.

2. 그리고 LED의 더 짧은 길이의 핀은 라즈베리 파이 GPIO 핀14 (GND)에 연결해주세요.


여기까지 완료했다면, 사진과 대조하여 맞게 연결했는지 확인 후에 라즈베리 파이와 MOVI의 전력 공급 기구를 연결해주세요. 보통은 두 장치 모두 구동되어야 합니다. 만약 그렇지 않다면, 다시 전력 공급기를 바로 분리하고 다시 체크해주세요.



step3 : PI 구성

자동적으로, 라즈베리 파이는 커널 디버그 메세지들을 전송할 때 자신의 UART (GPIO 핀8과 핀10)을 사용합니다. 이것은 MOVI와의 소통에 장애를 줄 수 있습니다. 이것을 방지하기 위해, 라즈베리 파이에 로그인 후에 다음 명령문을 수행해주세요.


그리고 나서 에디터를 사용하여 (vi 또는 nano와 같은) /boot/cmdline.txt 파일을 수정하고 ttyAMA0 또는 시리얼0에 대한 참조는 모두 지워주세요.

예를 들어, 만약 cmdline.txt가 다음과 같다면

그것을 다음과 같이 수정해주세요.

그리고 라즈베리 파이를 다시 시작해주세요.



step 4 : 첫번째 테스트

만약 MOVI가 스스로 준비되었다고 선언했으며 (MOVI에 대한 자세한 정보는 이곳을 참조해 주세요) 라즈베리 파이가 구동중이라면 다음의 명령어를 실행해주세요.

그 다음엔, MOVI의 버튼을 몇 초동안 눌러서 초기 상태로 만들어 줍니다. 

MOVI에게 다음과 같이 말해보세요:

- 나 : Arduino
- MOVI : 
- 나 : Let there be light.
- MOVI:


위의 스냅샷과 같은 화면을 보실 수 있습니다.

만약 이 시도가 성공했다면, CTRL+C를 눌러 이 cat을 나가주세요. 이것은 MOVI로부터 읽을 수 있다는 것을 테스트 한 것입니다. 이제 MOVI에 쓰는 것을 테스트 하도록 하겠습니다.


실행 후에 스피커가 "hello world"라고 말하는 것이 들려야 합니다. 이것이 MOVI에 쓰기를 할 수 있다는 것을 의미하며 스피커가 제대로 연결되었다는 것을 의미합니다.

이제, 선택사항으로 다음의 스크립트를 lowlevel.sh.라고 불리는 에디터에 복사, 붙여넣기, 그리고 저장합니다. lowlevel.sh.을 실행하면 아두이노의 시리얼 모니터와 LowLevelInterface 프로그램을 사용하는 것과 같이 낮은 단계의 명령어를 입력할 수 있게되며 MOVI의 응답을 읽을 수 있게 됩니다. 첫번째로 입력하기 좋은 명령어는 'HELP'입니다.



step 5 : MOVI 프로그래밍

Programming MOVI

MOVI를 프로그래밍하고 빛 스위치를 설계하는 예제는 비디오에서 확인할 수 있습니다. 파이썬을 사용해 보겠습니다. 다음의 파이썬 코드는 시리얼 인터페이스와 GPIO 라이브러리를 목소리 기반의 빛 스위치를 만들기 위해 어떻게 사용하는지 보여줍니다.

다음의 코드를 에디터에 복사&붙여넣기 하고 실행해주세요.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# LightSwitch.py
# LightSwitch example similar to the Arduino example sketch
# https://github.com/audeme/MOVIArduinoAPI/blob/master/examples/beginner/LightSwitch/LightSwitch.ino
# Imports: Rasberry PI GPIO (for LED), serial, time
import RPi.GPIO as GPIO
import serial
import time
# Initialize serial line
ser = serial.Serial ("/dev/ttyAMA0")
ser.baudrate = 9600
# Change this method to be more intelligent.
# Right now, it only checks for sentence one and two.
def process(line):
    print line       # Debug output
    if "#0" in line: # Sentence 1
        GPIO.output(18,GPIO.HIGH)
        ser.write("SAY ...and there was light!\n")  
    if "#1" in line: # Sentence 2
                GPIO.output(18,GPIO.LOW)
def main():
    # Initialize GPIO for LED
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(18,GPIO.OUT)
    # Initialize MOVI
    ser.write("INIT\n") # INIT
    
    #### The following commands are only executed by MOVI if needed
    ser.write("CALLSIGN rasberrypie\n") # Set callsign to rasberrypi
    ser.write("NEWSENTENCES\n")         # Train MOVI
    ser.write("ADDSENTENCE Let there be light\n") # Sentence 1
    ser.write("ADDSENTENCE Go dark\n")  # Sentence 2
    ser.write("TRAINSENTENCES \n")      # Go train, if needed
    #### End lazy
    
    ser.write("SAY Mohvee on Rasberry Pi \n") # Say we are ready.
    
    data="" # stores one line of data from MOVI
    while (True): #loop enlessly like loop() on Arduino
        if (ser.inWaiting()>0): #if there is stuff on the serial port
            serchar=ser.read()  # read it
            if (serchar=="\n"): # if a line was ending
                process(data)       # process it
                data=""             # make a new line
            else:               # otherwise
                data=data+serchar;  # just append
        time.delay(0.1)  # Don't busy spin
    ser.close()      # Will never be reached
# See: http://www.artima.com/weblogs/viewpost.jsp?thread=4829
if __name__ == "__main__":
    main()
cs



Step 6: 다음 단계

축하합니다! MOVI가 이제 라즈베리 파이와 함께 작동하네요. 이제 전단계에서처럼 파이썬 스크립트를 사용하여 마음대로 조작할 수 있습니다. 시리얼 라인을 보내기 위한 명령어의 리스트를 확인하려면 이곳을 참조해주세요. (부록 C와 D참조)

또한, MOVI를 매우 쉽게 프로그래밍하게 도와주는 Elixir기반의 라이브러리가 오픈소스 커뮤니티에 나와있습니다. 이곳을 참조해주세요.

이 커뮤니티에 파이썬 기반의 MOVI 라이브러리가 곧 나올 것이라고 확신합니다. 또한, 라즈베리파이 버전alexa 도 확인해주세요. 재밌는 요소가 될 것입니다. 아니면 MOVI를 Jasper의 백엔드로 사용하여 시도할 수도 있습니다.

또 다른 아이디어는 오픈소스인 MOVI 아두이노 라이브러리 (C++기반)를 사용하여 그것을 라즈베리 파이에 연결하는 것입니다.




원문을 참조해주세요.

댓글 0

MADE BY

MOVI와 Rasberry PI를 이용한 음성인식과 합성현재글 Google Cloud Speech API 사용후기 이전글