달리기
밤 10시, 달리기를 마치고 나서 휴대폰으로 확인한 기온은 18도였다. 반바지를 입으니 무릎이 자유로워서 좋다. 그렇다고 해서 기록이 나아진 것은 아니지만. 오늘의 페이스는 6분 19초로서 별로 좋지는 않다. 5.5km를 6분 2초 페이스로 달린 날도 있었는데(4월 15일)!
거리를 5.5km에서 6km로 슬쩍 늘렸다. 런데이 앱에서는 1시간에 10km를 달리는 오구오구(59:59) 운동 플랜이 나를 유혹하지만, 이를 달성하려면 6분 페이스를 1시간 내내 유지해야 한다. 아직 이런 목표를 논할 수준이 아니다.
인공지능을 이용한 음성 합성
다음 주에 있을 국제학회(실은 서울에서 열림)에서 영어로 발표를 할 일이 있어서 스크립트를 써서 연습을 하다가 AI를 이용한 text-to-speech 서비스를 써 보았다. 내가 사용한 유료 서비스는 Text To Speech OpenAI이다. 다른 TTS에 비해서 저렴하고, 상업적으로 이용해도 제한이 없다는 점이 유리하다. 매달 정기결제를 하지 않고 필요할 때마다 크레딧($8 = 20만 크레딧)을 구매하면 된다. 실제 활용해 보니 정말 외국인 성우가 읽는 것처럼 매우 자연스러운 결과를 얻었다.
My Voices라는 메뉴에서는 내 목소리를 녹음한 오디오 파일을 업로드하여 음성 학습에 쓸 수 있다. 5천 크레딧을 써서 5분 이상의 녹음 파일을 넣은 뒤 영문을 읽게 하였다. 적용한 액센트는 'Korean (Seoul)'이었다.
아두이노 나노
MIDI controller를 만들기 위한 단계별 작업을 진행하고 있다. 이것 역시 AI, 즉 ChatGTP와 상의해 가면서 기초부터 최종 목표까지를 차근차근 익혀 나가는 중이다. 아직 필요한 부품을 다 갖추어 놓지는 않았기 때문에 갖고 있는 부품 위주로 기본 기능부터 단계적으로 만들어 나가는 방식으로 진행한다. 예를 들어 시리얼 1602 LCD에 메시지 표시하기를 시작으로 가변저항을 이용한 프로그램 변경값(0~127) 설정, 버튼을 이용한 채널 복제 등의 순서를 따른다.
가변저항의 wiper로부터 읽은 값, 즉 analogRead() 함수값을 0~127로 전환하는 일은 이론적으로는 단순하다. 그러나 최소 또는 최대값에서 정확한 0과 127이 나오지 않는다. 따라서 실제 얼마가 나오는지 LCD에 나타나게 한 뒤 이를 참조하여 프로그램 번호로 전환하는 아이디어를 내고, 이를 ChatGPT에게 물어서 코드와 배선 방법을 알아낸 뒤 실제 실험을 통해 확인하는 방법을 거치고 있다.
가변저항의 1회전으로 0~127의 값을 안정적으로 설정하기는 쉽지 않다. 1 단위로 미세하게 바꾸려면 아주 조심스럽게 노브를 돌려야 하기 때문이다. 그래서 최종적으로 택한 방법은 가변저항과 누름버튼 스위치를 같이 쓰는 것. 가변저항은 10 단위의 값을, 스위치는 1단위의 값을 바꾼다. 단, 사용하는 버튼의 수를 줄이기 위해 한 번 누르면 +1, 연속해서 두 번 누르면 -1씩 변하게 하였다. 이런 방법은 아마 다른 여러 기기에서 쓰고 있을 것이다.
ChatGPT가 처음부터 이런 솔루션을 제시한 것은 아니었다. 일단 제시한 방법으로 실험을 한 뒤 부족한 부분을 찾아내고, 나름대로 아이디어를 내서 ChatGPT에게 타당성을 물어본 뒤(대개 좋은 아이디어이고 이미 많이 쓰이는 방법이라면서 칭찬을 함) 코드와 배선 방법을 제시해 달라고 해서 그대로 실험을 진행한다.
손으로 직접 코드를 하나씩 타이핑하는 것이 교육 목적으로는 좋을 것이다. 하지만 ChatGPT 창으로부터 마우스로 긁어서 Arduino IDE에 붙여넣는 꼴이라니... 효율만 생각한다면 이런 '개발' 방법도 나쁘지는 않다.
브레드보드에 점퍼선을 꽂아서 프로토타입까지 만드는 것은 어떻게든 될 것이지만, 실사용을 위해서는 만능기판에 납땜을 해야 된다. 납땜을 위한 부품 배치와 배선을 하려면 프로토타이핑과는 또 다른 차원의 설계가 필요하다. 케이스 가공은? 어휴...