[Session 02] 모두 안녕하신가요?
모두 안녕하신가요?
2021년에도 여전히 코로나19로 인해서 우리의 일상 생활들이 위축되고 다양한 어려움 속에 처해있다. 이번 세션에서는 각국의 안녕을 바라는 의미에서 여러나라의 인사말을 음성 데이터로 분류하고 이것을 인식한 결과값을 기반으로 해당되는 언어를 처리할 수 있는 프로그램을 제작하고자 한다.
학습 목표
여라나라 인사말을 기반으로 한 인공지능 음성 분류 모델을 통해 다양한 조건의 프로그램을 만들 수 있다.
학습 준비물
음성 녹음이 가능한 PC 또는 노트북
데이터 수집 아이디어
![]()
2-1 인공지능 데이터 수집
이전 세션에서와 마찬가지로 음성을 인식하기 위한 분류체계를 먼저 생성해야 한다. 이를 위해서 음성 학습 모델이름을 ‘모두 안녕하신가요?’라고 설정하였으며 데이터 입력을 위한 클래스는 크게 한국어, 히브리어, 영어 세가지로 분류하였다.
각각의 클래스 이름에 적합한 사용자가 입력하고자 하는 데이터를 녹음하여 인공지능 학습모델을 위한 자료를 업로드하도록 한다. 다만 음성 분류 모델 보다 용이하기 위해서 녹음하는 음성 파일의 높낮이, 발음 방법 등을 고려하여 컴퓨터가 인공지능 모델 학습 후 사용자가 사전에 분류한 클래스에 적용할 수 있는 기술이 필요하다.
|
클래스별로 입력한 데이터가 업로드되었다면 다음과 같이 학습 단계에서 모델 학습하기 버튼이 활성화된다. 이를 클릭하여 컴퓨터가 인공지능 모델 학습을 완료하게 되면 학습을 완료하였다고 표시된다. |
2-2 데이터 분류 및 테스트
|
사용자가 생성한 클래스별로 인공지능 학습모델이 잘 동작하는지 확인해 보기 위해서 다양한 음성 테스트를 녹음한 자료를 업로드하거나 실제 PC나 노트북 환경에서 녹음하여 테스트하면 다음과 같이 사전에 분류한 클래스별로 신뢰도를 제시해 주는 것을 확인할 수 있다. |
2-3 엔트리 프로그래밍
이전 세션에서 간단하게 제작해본 프로그래밍의 과정을 다시 한번 생각해보면 다음과 같다.
첫째, 프로그램을 제작하는 목적에 적합한 구현 방법을 고려해야 한다. 이를 위해서 컴퓨팅사고 절차에 따라 제시된 문제해결 방법이나 생각한 문제해결 절차에 따라 보다 세부적인 단계로 구분하여 이를 명료화할 필요가 있다. 일반적으로 프로그래밍을 처음 접하는 사용자들은 제시된 문제의 복잡성을 고려하지 않고 직접적으로 블록형 프로그래밍으로 구현하려고 하나 이는 추후 실제 프로그래밍 테스트 과정에서 발생되는 문제를 해결하거나 새로운 기능을 추가하려고 할 때 세분화된 절차가 없이 머릿속 생각만으로 프로그래밍한다면 보다 정교하게 제작할 수 없을뿐더러 수정 또한 쉽지 않을 것이다. 따라서 엔트리의 오브젝트들과 연계되어 구현하고자 하는 기능에 맞는 이벤트들을 중심으로 해결해야 하는 과제들을 시각적으로 표현해 보는 과정이 대단히 중요한 것이다. 이를 위해 다음과 같은 온라인 기반의 마인드맵 프로그램(www.mindmup.com)들을 활용하여 구현하고자 하는 세부적인 기능별로 보다 구체화된 구현 방법들을 시각적으로 설계해 보는 학습이 중요하다.
둘째, 인공지능의 음성 분류, 오디오 감지를 위한 좋은 데이터 품질을 확보하는 것이다. 이를 위해서는 음성 또는 사운드 파일에 대한 속성과 특징에 대해서 좀 더 많은 이해가 필요하다. 사운드 즉 소리는 주기적인 진동을 나타내는 것으로 높은 소리는 진동수가 높고 낮은 소리는 진동수가 낮은 특징을 가지고 있다. 또한 소리의 크기는 진폭과 연관이 있으며 진폭이 클수록 강도가 크다고 생각할 수 있다. 따라서 인공지능 모델이 사용자가 설정한 클래스 분류를 보다 정확하게 하기 위해서는 이러한 소리의 특성을 이해하고 차별화되는 데이터를 제공해야 할 필요가 있다.
|
셋째, 제시된 문제해결에 필요한 기능들을 생각할 때 엔트리에 추가되는 오브젝트에 따라서 어떻게 연결하고 구현할지에 대해서 고민해야 한다. 즉 일반적인 블록 프로그래밍의 기초단계에서는 오브젝트 기반의 프로그래밍을 주로 다루어 보며 하나의 오브젝트를 구성하고 있는 다양한 속성들을 제어하고 수정, 변경해 보는 학습들이 필요하다. 이를 보다 상세하게 설명하기 위해서 엔트리의 기본 오브젝트인 엔트리봇의 그림을 살펴보면 다음과 같다. |
|
3) 종합하면 오브젝트는 모양과 관련된 좌표, 크기, 방향, 이동 방향, 회전 방식, 모양 번호, 소리 번호와 함께 블록들을 통한 다양한 제어가 가능한 것이다. 특히 오브젝트에서 오브젝트간의 이벤트 제어를 위해서는 일반적으로 신호를 보내거나 변수를 통해 전달하게 된다. 이를 위해 간단한 프로그램을 한 번 살펴보도록 한다. 다음과 같이 2개의 오브젝트가 있다고 가정하고 왼쪽의 ‘엔트리봇’이 오른쪽의 ‘[묶음] 얼굴 스티커’ 오브젝트에 닿을 때까지 이동하도록 한다. |
4) 이를 위해 다음과 같이 프로그래밍 할 수 있다.
5) 여기에서 ‘[묶음] 얼굴 스티커’에 값을 전달하기 위해서 새로운 변수인 ‘말 전달하기’ 변수를 만들고 위의 이동절차가 실행이 완료되고 나면 ‘말 전달하기’ 변수값에 ‘앗 너에게 닿았어’ 값을 다음과 같이 입력해 준다.
|
6) 다음의 화면은 이를 실행한 결과 화면이다. |
|
7) 그렇다면 이제 ‘말 전달하기’변수에 저장되어 있는 값인 ‘앗 너에게 닿았어’ 를 ‘[묶음] 얼굴 스티커’ 오브젝트에서 어떻게 표현할 수 있는지 생각해보면 다음과 같다. 프로그래밍으로 구현하는 방법은 다양하게 할 수 있는데 오브젝트를 변수로 제어하는 방법에 대해서 이해할 수 있도록 다음과 같이 설계하였다. |
|
8) 먼저 ‘[묶음] 얼굴 스티커’ 오브젝트는 무한 반복하는 가운데 ‘말 전달하기’ 변수에 값이 입력되기를 기다린다. 만약 ‘말 전달하기’ 변수의 값에 ‘앗 너에게 닿았어’ 글자가 입력되면 전체 글자수는 1보다 크게 될 것이다. 따라서 이 조건을 만족하는 경우 ‘말 전달하기’ 변수값을 ‘[묶음] 얼굴 스티커’가 말하게 함으로써 ‘엔트리봇’ 오브젝트에서 입력된 ‘말 전달하기’ 변수에 저장된 값을 ‘[묶음] 얼굴 스티커’ 오브젝트에게 전달할 수 있는 것이다. 이번 세션에서 요구하고 있는 다양한 언어의 음성을 인식하여 오브젝트에 추가된 모양들을 변경하고 변경된 모양 값에 따라 새로운 장면이 나타나는 프로그램을 만들어 보도록 한다. |
먼저 오브젝트의 모양을 추가하기 위해서 모양 선택 화면에서 사람을 선택하고 다음과 같이 사용자가 원하는 3가지 모양을 선택한다.
|
9) 교재에서는 다음과 같이 각각의 모양 번호에 따라 다음과 같이 모양의 이름을 정하였다. |
10) 먼저 간단하게 입력되는 대답 값을 기초로 오브젝트의 모양을 바꿀 수 있도록 하기 위해 다음과 같이 묻고 답하는 형태로 프로그램을 만들어 보도록 한다.
11) 학습되어 있는 인공지능 모델을 테스트하기 위해 학습한 모델로 분류하고 분류 결과값을 간단한 텍스트로 결합하여 제시할 수 있도록 다음과 같이 블록을 추가하여 프로그래밍 한다.
|
12) 실행버튼을 클릭하면 다음과 같이 “만나서 반가워요. 번호를 입력해 주세요.”라는 화면이 나타나면 번호를 입력한다. |
|
13) 3이라고 입력하면 다음과 같이 3번째 모양으로 변경되는 것을 볼 수 있다. 또한 인공지능음성인식을 위해 ‘어떤 말로 해야할까요?’라고 표현하는 것을 확인할 수 있다. |
|
14) 블록이 실행되면 데이터 입력을 위한 창이 나타나게되며 녹음되어 있는 사운드 파일을 업로드하거나 사용자의 컴퓨터 환경에서 제공되는 녹음 도구를 사용하여 녹음할 수 있다. |
|
15) 업로드하거나 녹음이 완료되면 다음과 같이 재생 버튼을 눌러서 녹음한 사운드 품질을 확인하고 적절한 부분을 영역으로 설정하여 적용하기 버튼을 클릭한다. |
15) 실제 실행해보면서 사용자의 데이터 품질과 학습된 모델의 분류 성능을 확인해보도록 한다.
2-4 프로그램 개선하기
프로그램 실행을 통해 다음과 같은 문제점 또는 개선사항에 대해 생각해 볼 수 있다.
사용자가 입력한 대답의 값이 번호의 범위가 1, 2, 3으로 정하였으나 실제 그렇게 입력이 되지 않을 수 있 다. 이를 위해 범주를 벗어나는 경우에 대한 처리 부분이 필요하다. 이것을 어떻게 해결할 수 있을까?
다양한 방법들이 있으나 가장 일반적으로 조건문을 설정하여 다음과 같이 프로그래밍 하는 방법을 생각해 볼 수 있다.
묻고답하기의 경우 입력되는 데이터 값은 ‘대답’이라는 임시변수에 저장되며 저장된 값을 사용자가 설정한 범위 내의 값으로 제한할 수 있는 프로그램을 설계한다고 고려하면 다음과 같다. 조건문 블록을 사용하여 다음과 같이 구성하고 대답 변수에 입력되어 있는 값에 따라 대답결과 처리를 위한 새로운 변수에 사용자가 정해 놓은 클래스명을 대입시켜 구성해 볼 수 있다.
블록이 실행되면 대답값이 1, 2, 3 중의 하나가 될 때까지 묻고 대답 기다리기 블록 이하의 명령문들을 계속해서 실행하게 된다. 대답의 값이 1이라면 대답결과 변수값에는 ‘한국말’이 저장되고 대답의 값이 2라면 대답 결과 변수값에는 ‘이스라엘말’이 저장된다. 상위 조건문에서 대답 변수에 입력되는 값은 1, 2, 3으로 제한하였으므로 대답 값이 1, 2가 아니라면 3의 경우가 된다. 따라서 이때 대답결과 변수의 값에는 ‘영어말’을 저장하게 된다.
이의 명령문은 모양을 변경하기 위해 간단하게 ‘짜잔! 변신’이라는 말을 해 주고 실제 입력된 ‘대답’ 변수값의 모양번호로 오브젝트의 모양을 변경시킨다.
다음으로 변경된 모양번호에 맞는 언어로 이야기 하기 위해 실제 학습한 인공지능 음성인식 모델을 통해 사용자의 음성을 인식시키고 이에 대한 결과를 분석하여 분류 결과 변수에 저장하며 이를 오브젝트를 통해 이야기할 수 있도록 다음과 같이 프로그래밍 한다.
분류 결과의 클래스명에 따라 새로운 장면으로 시작하기 위해서 다음과 같이 해당 언어에 맞는 장면을 추가 해 준다.
|
|
|
이를 구현하기 위해서 조건문을 사용하여 인공지능 학습모델의 인식결과에 따라 분기할 수 있도록 다음과 같이 구성한다. |
실제 프로그램을 실행해보고 다양한 조건의 음성 데이터를 입력하여 사용자가 원하는 형태의 결과를 얻을 수 있는지 확인하도록 한다.
그렇다면 추가로 처음 입력한 대답 결과에 해당하는 사용자 음성 데이터 입력 결과값을 비교한다. 이에 두 개의 데이터가 동일하다면 앞서 설계한 내용대로 진행되게 할 수 있도록 프로그램을 변경하는 것이 필요하다. 따라서 다음과 같은 조건문을 추가로 구성하여 변경하도록 한다.