[솔다/기초다지기] 아두이노에게 말문을 열어주자 -上-


안녕하세요?
디바이스마트의 용감한쿠키 솔다입니다

아두이노로 프로젝트를 할 때
소리가 필요한경우에는 버저를 이용하고는 하는데요

음악이 필요할 때에는 스피커와 SD카드 리더기를 이용해서
음악을 재생하기도 합니다

그러나 그 중간, SD카드도 쓰지 않으면서
음성을 쓰면 좋겠다고 생각하신적도 있으실텐데요

오늘은 SD카드 리더기 없이 스피커만으로
음성을 출력하는 방법에 대해 포스팅해보겠습니다


-

먼저 하드웨어 준비물입니다


아두이노 우노 링크
앰프 + 스피커 모듈 링크
점퍼와이어 몇가닥

SD카드 리더기 없이 간단하게 두 준비물로만 진행합니다

배선도 간단합니다

VCC와 GND를 각각 아두이노에 연결해주시고
IN은 UNO 기준 3번 핀에 연결해주시면 되시겠습니다


이럼 연결 끝!

-

이번에는 S/W 차례입니다
오늘 활용해 볼 라이브러리는 Talkie라는 라이브러리입니다

위 '링크'를 누르셔서 깃허브로 들어가주세요


이런 화면이 나옵니다


여기서 녹색 버튼인 [Code]를 눌러주시고
[Download ZIP]을 눌러 라이브러리를 ZIP 파일로 받아줍시다


저도 적당한 경로에 다운로드 받았습니다


이제 라이브러리를 추가하기 위해 아두이노IDE를 실행해줍시다


[스케치] => [라이브러리 포함하기] => [.ZIP 라이브러리 추가...]
위와 같이 선택해줍니다


다운받으셨던 경로의 ZIP파일을 선택해주시면 됩니다

그럼 한번 예제를 실행해보겠습니다


[예제] => [Talkie] => [_1_Getting_Started]

위와 같이 선택해줍니다


주석부분을 건너뛰고 밑의 내용을 띄워 봤습니다
이대로 업로드를 해주시면 아래와 같이 동작합니다


진짜로 아두이노가 말을 할 수 있게 되었습니다!
내용은 모터가 불탄다는 적생경보 알람입니다


만일 소리가 나지 않는다면 위와같이 트리머를
십자드라이버 등을 사용해 조절해주시면 되시겠습니다
해당 트리머가 모듈의 볼륨입니다

-


어떻게 말을 할 수 있는걸까요?

비밀은 PWM에 있습니다

두개의 타이머를 사용해 PWM을 세밀하게 분할하여
음성에 가까운 주파수를 3번 핀으로 출력해줍니다

이같은 알고리즘은 이미 Texas Instruments에서
Linear Predictive Coding(LPC)라는 소프트웨어로 구현되었던 기술입니다

지금은 반도체 회사로만 널리 알려져있지만
과거에는 여러 전자기기를 출시했었습니다

LPC 기술을 사용한 대표적인 제품이 바로 Speak & Spell이라는 완구입니다
Speak & Spell은 무려 1978년도에 출시 되었었습니다


qwerty 자판이 아닌걸 보시면 아시겠지만 아동교육용 완구였습니다
알파벳을 눌러 단어를 입력하면 음성으로 변환해주는 장치였습니다

어딘가 익숙하지 않으신가요?

문자를 음성으로, 바로 Text to Speech(TTS) 기술입니다
비록 수동으로 문자를 입력해야하지만
1세대 TTS라고 불러도 과언이 아닙니다

사실 TTS라기에는 출시 당시 기준으로
200여개의 단어밖에 지원을 하지 않았습니다

영어의 문자적 특성상 철자와 발음이 1:1로 대응되지 않기 때문에
단어에 해당하는 음성을 실제로 녹음 한 뒤
그 음성 데이터를 LPC 방식으로 변환하여 메모리에 탑재 했기 때문입니다

-

테스트도 해봤고 LPC에 대해서도 알아 봤으니
talkie를 약간 응용하여 코딩해봅시다


위와같이 소스코드를 작성해주세요
복사 붙여넣기 하실 수 있도록 스크립트로도 준비 했습니다


#include "Talkie.h"
#include "Vocab_US_Clock.h"
 
Talkie voice;
 
void setup()
{
    voice.say(spc_GOOD);
    voice.say(spc_AFTERNOON);
    delay(100);
    voice.say(spc_GOOD);
    voice.say(spc_EVENING);
    delay(100);
    voice.say(spc_GOOD);
    voice.say(spc_NINE);
}
 
void loop() {
}
cs

별거 없죠?
이대로 복사해서 붙여넣으시고 업로드 해주시면 됩니다

들어보시면 미국억양의 영어를 쓰는 여성의 목소리로
굿 에프터눈, 굿 이브닝, 굿 나인(?)
이라고 인사합니다


꿀잼 영화의 트루먼쇼의 명대사를 구현해봤습니다

그런데 왜 '굿 나잇'이 아니라 '굿 나인'으로 썼을까요?
Speak & Spell에서 살펴 봤듯이 녹음된 음성을 가져다 썼기 때문입니다

가짜 TTS이기 때문에 녹음된 음성이 없으면
목소리를 낼 수 없습니다ㅠㅠ

썸네일과는 다르게 무야호를 할 수 없다는 말입니다

무야호를 무야호라고 부르지 못하고...

-


'일반적으로 말하자면' 그렇다는 얘기지요
사실 방법이 없는 것은 아닙니다

특정 규격으로 샘플링 된 음성 파일과 LPC 인코딩 알고리즘만 있다면
직접 음성을 제작해 넣을 수 있습니다

눈치 채셨겠지만 이번 포스팅은 상편입니다
다음 포스팅은 아두이노에게 진짜 무야호를 할 수 있도록
처리하는 과정을 포스팅하도록 하겠습니다

기대하셔도 좋습니다
감사합니다!



댓글 쓰기

0 댓글