지난 포스팅에서는 스피커에 연결하고 기본적인 라즈베리파이의 설정을 하는 법을 알아보았다.
이번 포스팅에서는 실제로 Google Assistant API를 이용하여 스마트 스피커로 변신 시키는 법을 알아보자!

주의: 이전 포스팅은 2018-11-16 버전 이미지 파일로 작성되었다. 구글 API 인증 경로가 바뀌었는지 이 버전에서는 API를 이용하지 못하였다. 이곳에서 최신 이미지 파일을 다운로드 해서 이용하자. 이 포스트는 2019-11-13 버전으로 작성되었다.


# 스피커 작동 테스트

Google Assistant API를 연결하기 전에 스피커가 제대로 작동하는지 우선 테스트.
스피커에 ssh로 연결이 된 상태에서 아래 스크립트를 실행 시켜본다.

/home/pi/AIY-projects-python/checkpoints/check_audio.py

스피커가 정상적으로 작동하고 있다면 스피커에서 "Front Center" 라고 영어로 말한다.
들렸으면 터미널에서 y를 눌러주고 엔터.
그러면 이번엔 마이크 테스트가 시작된다. 엔터키를 눌러주고 3초동안 얘기하면 그 뒤에 자기 목소리가 스피커에서 재생이 되어야 한다.
자기 목소리가 들렸다면 제대로 작동하는 것. y를 눌러주고 엔터. 그 다음 다시 엔터를 눌러주면 테스트 스크립트가 종료된다.


# Google Assistant API 연결

API를 이용하기 위해선 우선 구글 개발자 콘솔에 로그인 해야 한다.

새로운 프로젝트 생성

구글 클라우드 대시보드 화면이 나오는데, 왼쪽 위에 Google Cloud Platform 옆에 있는 부분을 클릭해서 새로운 프로젝트를 생성해 준다.

프로젝트 선택 새로운 프로젝트 생성 프로젝트 이름을 지정하고 CREATE

API를 활성

프로젝트를 생성했으면 그 다음은 API를 활성화 시켜주자.
왼쪽 메뉴에 있는 "APIs & Services"에서 "Library"를 클릭.
그 다음 검색창에 "google assistant"라고 치면 결과화면에 "Google Assistant API"가 나오면 그걸 클릭.
그 다음 ENABLE을 누르면 API가 활성화 된다.

Google Assistant API 활성화

API를 활성화 했다면 자동으로 Google Assistant API 대쉬보드 화면으로 넘어간다.

클라이언트 아이디와 인증정보 생성

이제 여기서 클라이언트 아이디를 생성해야한다.
"CREATE CREDENTIALS"를 클릭한다.

Credentials 생성

첫번째 설정은 아래와 같이 해준다.

그러면 OAuth consent screen을 설정해야한다는 팝업이 뜬다.
"SET UP CONSENT SCREEN"을 클릭하면 새로운 창이 열린다.
새로운 창에서 User Type을 고르라고 나오는데 External을 선택하고 CREATE를 클릭.

다음 화면에서는 상세한 설정을 할 수 있는 화면이 나오는데 "Application Name" 부분만 대충 아무 이름이나 넣어주고 밑으로 스크롤 하여 Save 버튼을 클릭하면 된다.

그럼 다시 이전 화면으로 돌아가서 클라이언트 아이디를 지어주고 Refresh 클릭.
그러면 Refresh버튼이 Create OAuth client ID버튼으로 바뀐다. 그걸 클릭.

마지막으로 Download를 클릭하여 클라이언트 인증정보를 다운로드 해준다.
"client_id.json" 파일이 다운로드 된다. 텍스트 에디터 등으로 이 파일을 열어주고 안에 있는 내용을 복사해준다.

인증정보를 스피커에 저장

ssh로 스피커(라즈베리파이)가 터미널과 연결 된 상태에서 다음 커맨드를 실행해준다.

nano assistant.json

이건 스피커 안에 "assistant.json"이라는 파일을 만들어주는 커맨드다.
nano는 터미널에서 사용할 수 있는 텍스트 에디터의 한 종류.
앞선 과정에서 다운로드한 "client_id.json"에서 복사해준 내용을 그대로 붙여넣기 한다.
그 다음 control + o를 눌러준 다음 엔터를 누르면 내용이 저장된다.
저장이 끝나면 control + x를 눌러서 nano를 종료해준다.

터미널에서 ls를 실행하면 파일과 디렉토리 리스트가 나오는데 거기에 assistant.json이 있으면 제대로 저장이 된 것이다.


# 데모 코드를 실행

API활성화, 클라이언트 아이디와 인증 정보 생성까지 마쳤으니 이제 실제로 스피커를 작동해 볼 차례.

아래 커맨드로 "AIY-voice-kit-python" 폴더로 이동해준다.

cd AIY-voice-kit-python

그 다음 아래 커맨드로 데모 스크립트를 실행한다.

src/examples/voice/assistant_grpc_demo.py

처음으로 이 스크립트를 실행하면 인증코드를 넣으라고 한다. 인증코드를 받기 위해서는 나오는 주소를 복사하여 브라우저에 붙여넣기 하면 된다.
https로 시작해서 offline으로 끝나는 부분까지가 인증코드를 받을 수 있는 주소다.

해당 주소로 가면 구글에 로그인 하는 화면이 뜬다. 프로젝트를 만든 구글 계정을 선택하면 퍼미션을 허락할건가 하는 팝업이 뜬다. Allow를 눌러서 허락해주자.

그러면 코드를 복사하라는 화면이 나온다. 거기에 나오는 코드를 복사한 후, 터미널에 돌아가서 붙여넣기 한 다음 엔터를 해주면 인증이 완료된다.

모든 과정이 끝나면 스피커 버튼에 불이 들어온다. 버튼을 누른 다음 스피커에게 명령어를 말하면 된다.

그런데 여기서 문제가 발생한다. 영어 밖에 못 알아듣는다.
그 이유는 라즈베리파이의 기본 언어 설정이 영어로 되어있기 때문.
한국어를 알아듣게 하려면 라즈베리파이의 언어 설정을 한국어로 변경을 해주거나 스크립트를 실행할 때 언어 설정을 따로 해주는 방법이 있다.
라즈베리파이의 언어 설정을 변경하는 법을 모르거나 혹은 귀찮을 경우는 control+z로 일단 스크립트를 종료한 후, 아래 커맨드로 다시 실행을 해보자.

src/examples/voice/assistant_grpc_demo.py --language=ko-KR --volume=50

volume 뒤에 숫자는 말 그대로 볼륨 조절이다. 기본 값이 너무 시끄러울 경우 0에서 100 사이의 숫자로 조절 해 주면 된다.
참고로 스피커의 기본 볼륨 값은 alsamixer 커맨드를 실행시키면 조절 할 수 있다.

방향키로 볼륨을 조절한 후 esc 키를 눌러서 종료하면 된다.

스크립트 실행 후, 한국말로 명령을 해보면 터미널에 어떤식으로 나의 명령어가 전달되고 처리되는지 그 과정을 볼 수 있다.


# 스피커 전원이 켜질 때 자동으로 실행

ssh로 스피커에 연결 된 상태로 수동으로 스크립트를 실행시켜서 스마트 스피커 기능을 실행 시키는 법도 괜찮지만, 일반적인 스마트 스피커로 사용하기 위해서는 ssh에 연결되지 않아도 자동으로 스크립트가 실행되어야 실용성이 있다.

그러기 위해서는 우선 라즈베리파이가 와이파이에 연결되도록 설정을 해주어야 한다. (설정 방법은 이전 포스팅을 참조)

와이파이에 연결이 되게 설정을 했으면 그 다음은 라즈베리파이가 켜질 때 자동으로 지정한 스크립트가 실행되게 끔 서비스 파일을 만들어서 설정 해 주면 된다.

sudo nano /etc/systemd/system/google_assistant.service

이걸로 새로운 google_assistant.service 파일을 생성.
내용은 아래 내용을 복사 붙여넣기 한 다음 그대로 저장.

[Unit]
Description=Google Assistant
After=network.target ntpdate.service

[Service]
Environment=DISPLAY=:0
Type=simple
ExecStart=/home/pi/AIY-voice-kit-python/src/examples/voice/assistant_grpc_demo.py --language=ko-KR
Restart=on-failure
User=pi
Group=pi
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=google_assistant

[Install]
WantedBy=multi-user.target

그 다음 아래 커맨드를 차례로 실행시켜준다.

sudo systemctl enable google_assistant.service
sudo service google_assistant start

서비스가 제대로 실행되고 있나 확인하고 싶을 땐 아래 커맨드를 실행하면 된다.

sudo service google_assistant status

나중에 서비스를 종료 시키고 싶을 땐 아래 커맨드.

sudo service google_assistant stop

서비스를 실행시켰으면 이제 스피커 전원이 들어왔을 때 알아서 스크립트가 실행되는지 확인하기 위해 아래 커맨드로 라즈베리파이를 재시작 해 준다.

sudo reboot

ssh연결이 끊어지고 라즈베리파이가 다시 시작된다.
2~3분 정도 라즈베리파이가 기동할 때 까지 기다린다.
스피커 버튼에 불이 들어오면 모든 설정이 제대로 되었다는 뜻이며 정상적으로 작동이 될 것이다.


이걸로 시중에 팔리고 있는 스마트 스피커가 어떤식으로 만들어지 것인지 살짝 엿볼 수 있었다.
Google Assistant API로는 시중에 나온 구글 스마트 스피커들 처럼 뉴스나 음악을 재생할 수 있는 기능이 없기 때문에, 단순한 질문에 대해 대답을 해주는 정도의 구실 밖에 하지 못한다.
하지만 파이선으로 코드만 짤 수 있다면 스피커를 자기가 원하는대로 개조를 하는 것도 가능하니 열심히 연구해보자!