프라트(Praat)를 이용한 음성분석의 이론과 실제




양병곤 지음






만수출판사

Copyright ⓒ 2010 양병곤



프라트(Praat)란?


간단한 음성분석에서 복잡하고 전문적인 처리까지 가능한 도구

인터넷을 통해 무료로 다운 받을 수 있는 프로그램

스크립트를 이용하여 대용량의 음성 자동 처리


이 책은 프라트에 대해 상세히 설명하고, 기본적인

분석방법을 보여줍니다.

 

발성과 음향학의 기본 개념

프라트의 주요 메뉴 개관

피치, 포먼트, 스펙트로그램, 진폭의 분석

피치와 진폭시간 변형으로 음성조작

스크립트 작성의 기본과정과 자동음성분석의 실제

 

이 책이 필요하신 분


음성언어학자, 음성의학자, 음성공학자

언어병리학자, 외국어교육자, 음성처리에 관심 있는 분

 

머리말


이 책은 지난 수년간 저자가 프라트(Praat)라는 프로그램을 활용해 오면서 많은 시행착오를 통해 알게된 지식을 정리하여 여러 연구자들과 정보를 공유하기 위해 쓰게 되었다. 프라트의 기능을 모두 다루는 완전한 안내서는 아니지만, 음성처리와 분석의 핵심이 되는 부분을 다뤘기 때문에 많은 도움이 되리라 여겨진다.

프라트는 인터넷을 통해 무료로 받을 수 있는 음성분석프로그램으로 스크립트를 이용하면 많은 용량의 자료를 짧은 시간 내에 처리할 수 있는 장점이 있다. 특히, 기초적인 활용은 물론 다양한 분석메뉴와 사용자가 직접 분석 파라미터를 수치로 입력할 수 있는 대화창을 통해 전문적으로 처리할 수 있다. 음성을 다루는 프로그램을 개발하기 전에 어떤 과정과 파라미터를 이용하여 처리하는 것이 적절한지 그래픽 등을 이용해 결과를 미리 확인해 볼 수 있는 중요한 도구이다. 프라트를 사용하면 할수록 복잡하고 배워야할 것들로 가득 차 있음을 알게된다. 개발자 자신도 거의 매일 새로운 메뉴를 덧붙이고 오류를 줄이려는 노력을 하고 있다. 그래서 너무 방대하고 복잡한 기능을 갖추고 있기 때문에 초보자들이 쉽게 활용하기에는 어려울 것으로 여겨진다. 또한 음성분석에 대한 전문적인 지식이 부족한 분들이 영문으로 된 안내서를 읽어 가는데 어려움이 많을 것으로 예상된다.

이 책에서는 프로그램 자체의 메뉴 설명에 많은 지면을 사용했고, 이 메뉴들을 다양하게 조합하여 음성분석에 활용하는 순서를 몇 가지 보여줌으로써 초보자도 쉽게 따라할 수 있도록 애썼다. 그러나 본문 가운데 설명을 너무 간단히 했거나, 저자의 전문적 지식이 얕아 잘못 서술한 부분도 많을 것이다. 그런 부분은 저자의 홈페이지(Http://www.dongeui.ac.kr/~bgyang)를 방문하여 이메일로 질문하거나 지적해 주길 바란다. 앞으로 주기적으로 수정한 원문을 애크로뱃 전자파일로 만들어 홈페이지에 올려놓을 예정이다. 만약 주위에 누구라도 음성분석에 관심이 있는 분이 있다면, 이 전자파일을 알려주어 보다 많은 사람들이 훌륭한 음성분석 프로그램을 개발하고, 자신의 연구와 교육에 활용하길 바란다.

마지막으로 이 책의 원고를 읽고 지적해 준 대구대학교 언어치료학과 박사과정의 조성미, 박희정, 신혜정, 이강현 양에게 감사드린다.

                   

                   2010년 12월 13일

                                   

                                        양 병 곤

차 례


머리말     3


제 1 장 음성학과 음향학의 기초     11

     

     1.1 음원 여과기 이론      11

     1.2 음향학의 기본 용어      12

     1.3 표본추출      15

     1.4 단순음과 복합음      16

     1.5 스펙트럼․스펙트로그램      17


제 2 장 프라트 설치      21

     

     2.1 파일 받기      21

     2.2 작업폴더 구성      22


제 3 장 프라트 사용법      25

     

     3.1 프로그램 실행      25

     3.2 프라트의 메뉴      25

     3.3 객체창의 분석단추      34

     3.4 그림창의 메뉴      36

     3.5 음성 녹음 환경 설정      41

          마이크로 녹음하기      41

          웹페이지 음성 녹음하기      43

          녹음기 음성 녹음하기      43

          녹음용 마이크      44

     3.6 음성 녹음의 실제      46

          음성 파일로 저장하기      47

     3.7 음성파일 편집창      48

     3.8 음성파일 편집의 실제      60

          저장한 음성파일 들어보기      60

          저장한 음성파일 일부를 잘라서 저장하기      60

          한 파일의 일부를 복사하여 다른 파일 창에 붙여 넣기      61

          한 개의 파일에 대한 피치와 스펙트로그램 동시 비교하기      62

          두 개 이상의 파일을 동시에 분석하여 비교하기      63

          객체창에서 음성파일의 이름 바꾸기      63

          음성파일이나 분석결과를 그림으로 나타내기      64


제 4 장 피치 분석      65


     4.1 피치분석 설정      65

     4.2 Jitter 값 구하기      69

     4.3 Shimmer 값 구하기      71

     4.4 피치분석의 실제      72

     4.5 피치 값 확인 방법      74

     4.6 프라트 피치분석 평가      78


제 5 장 스펙트럼․스펙트로그램 분석      79


     5.1 객체창 분석단추의 스펙트럼 메뉴 활용      79

     5.2 스펙트럼 분석의 실제      81

     5.3 스펙트로그램 분석의 실제      84


제 6 장 포먼트 분석      89


     6.1 포먼트 메뉴      89

     6.2 포먼트 측정의 실제      96


제 7 장 강도 값 측정      101

     

     7.1 강도 값 측정 메뉴      101

     7.2 강도 값 측정의 실제      102



제 8 장 음성조작      105

     

     8.1 음성조작 메뉴      105

     8.2 음성조작의 실제      107

     8.3 피치변환      108

     8.4 재생속도 변환      110


제 9 장 프라트 스크립트      113

     

     9.1 스크립트 작성      113

     9.2 스크립트의 기본 구성      116

          조건절      116

          되풀이 작업문      116

          서브루틴      118

          배열      119

          입력(Form)      121

          정보창에 나타내기      121

          문의(Query)      123

          파일입출력      123

          사용자와의 통신      124

          행렬(Matrix)      125

     9.3 스크립트를 이용한 분석의 실제      127

     9.4 복잡한 음성분석 스크립트      129

     9.5 스펙트럼간 상관계수를 구하기 위한 스크립트      137

     9.6 라링고그라프의 미분 값 구하기      139

     9.7 녹음파일이름 자동 생성      139


제 10 장 기타 음성 분석방법      143

     

     10.1 성대진동개시시간 측정      143

     10.2 이중모음의 포먼트      145

     10.3 ‘사’와 ‘샤’의 절단주파수 구하기      147

     10.4 라링고그라프의 신호 분석      149

     10.5 음성장애자의 음성분석의 실제      155

     10.6 발음학습프로그램 제작      158

     10.7 개 짖는 소리의 분석      160

     10.8 새소리 분석    163

     10.9 통계처리시 유의사항    164

참고문헌    165


그림목록


그림 1.1 사람의 발성구조와 버들피리의 비교     11

그림 1.2 모음 발성시 입안 공간의 정중단면     12

그림 1.3 진동체의 흔적 기록     13

그림 1.4 진동 파형     13

그림 1.5 컴퓨터에 입력된 진동파형     13

그림 1.6 파형의 특징     14

그림 1.7 음성파형의 기본 용어     15

그림 1.8 단순음과 복합음 파형     17

그림 1.9 모음 '아'의 음성 파형     17

그림 1.10 푸리에 변환과정     18

그림 1.11 정현파와 스펙트럼     18

그림 1.12 정현파와 스펙트로그램     18

그림 1.13 스펙트로그램 생성 과정     19

그림 1.14 연속 포먼트 구조     20

그림 2.1 프라트 파일 받기     21

그림 2.2 바로 가기 만들기     22

그림 2.3 작업폴더 구성의 예     22

그림 3.1 프라트 객체창과 그림창     25

그림 3.2 Control의 하위메뉴     26

그림 3.3 Buttons의 선택     26

그림 3.4 음성입력 메모리 설정     28

그림 3.5 음성 출력 설정 대화창     28

그림 3.6 New의 하위메뉴     28

그림 3.7 Sound의 하위메뉴     28

그림 3.8 Matrix의 하위메뉴     29

그림 3.9 발음기호 입력창     30

그림 3.10 발음한 단어 입력 창     30

그림 3.11 Read의 하위메뉴     31

그림 3.12 Write의 하위메뉴     31

그림 3.13 Help의 하위메뉴     33

그림 3.14 검색어를 이용한 정보 찾기     34

그림 3.15 객체창의 분석단추     35

그림 3.16 그림창의 기본메뉴     37

그림 3.17 그림창의 Edit 하위메뉴     37

그림 3.18 그림창의 World 하위메뉴     38

그림 3.19 Viewport 대화창     39

그림 3.20 문자 입력 대화창     40

그림 3.21 Pen의 하위 메뉴     40

그림 3.22 Font의 하위메뉴     41

그림 3.23 멀티미디어 설정     42

그림 3.24 녹음 조절 설정     42

그림 3.25 인터넷 음성파일 받기     43

그림 3.26 마이크별 입력 음성 특성     45

그림 3.27 잡음의 확대     45

그림 3.28 녹음기 대화창     46

그림 3.29 파일저장 대화창     47

그림 3.30 음성 편집창     48

그림 3.31 편집창 File의 하위메뉴     49

그림 3.32 편집창 Edit의 하위메뉴     49

그림 3.33 편집창 Query의 하위메뉴     50

그림 3.34 자동 분석 기록 설정     52

그림 3.35 편집창 View의 하위메뉴     53

그림 3.36 편집창의 Show analyses 대화창     53

그림 3.37 스펙트로그램 설정 대화창     54

그림 3.38 피치 설정     55

그림 3.39 강도 설정 대화창     56

그림 3.40 포먼트 설정 대화창     57

그림 3.41 편집창 보기 메뉴     58

그림 3.42 편집창 재생 메뉴     58

그림 3.43 편집창 선택 메뉴     59

그림 3.44 스펙트로그램과 피치를 동시에 작업하는 그림     62

그림 3.45 두 개의 피치 분석 파일을 비교하기     62

그림 4.1 객체창의 피치분석 하위메뉴     65

그림 4.2 피치분석 파라미터 설정 대화창     66

그림 4.3 자기상관법 파라미터 설정 대화창     67

그림 4.4 점처리후 편집창     70

그림 4.5 편집창의 Query메뉴     71

그림 4.6 Shimmer 구하기 대화창     72

그림 4.7 피치 분석 결과 객체 편집창     73

그림 4.8 분석 결과 보이기 선택 대화창     74

그림 4.9 스펙트로그램 설정 대화창     75

그림 4.10 음성파형의 확대에 의한 피치 확인     76

그림 4.11 Hanning창으로 변형한 음성파형     77

그림 5.1 스펙트로그램 측정 파라미터 설정 대화 상자     79

그림 5.2 달팽이관의 음향적 주파수 공명위치     81

그림 5.3 모음 '아'의 전체 스펙트럼     82

그림 5.4 대역정지를 한 스펙트럼     83

그림 5.5 스펙트럼 분석 객체를 선택한 뒤의 객체창의 분석 단추     84

그림 5.6 스펙트로그램 분석 파라미터 설정 대화창     85

그림 5.7 모음 '아'의 스펙트로그램 편집창     86

그림 5.8 모음 '아'의 스펙트럼     86

그림 6.1 객체창의 포먼트 분석 단추 하위메뉴     89

그림 6.2 포먼트(burg) 분석 파라미터 설정 대화창     89

그림 6.3 고주파대역 강조 실행 전․후의 스펙트럼     91

그림 6.4 포먼트 그리기 하위메뉴     91

그림 6.5 포먼트 그리기 파라미터 설정 대화창     91

그림 6.6 모음 '아'의 포먼트 흔적     92

그림 6.7 모음 '아'의 포먼트 흔적 재처리     92

그림 6.8 낮은 차수에서 처리된 모음 '아'의 포먼트 흔적     94

그림 6.9 포먼트 측정 파라미터 설정 대화창     96

그림 6.10 포먼트 그리기 설정 대화창     97

그림 6.11 포먼트 흔적 그림     97

그림 6.12 대역폭의 측정 위치     98

그림 7.1 진폭 값의 그래프     101

그림 7.2 강도 값 분석 파라미터 설정 대화창     102

그림 7.3 강도 값 그리기 파라미터 설정 대화창     103

그림 7.4 모음 '아'의 강도 값 분석 결과 그림     104

그림 7.5 강도 값의 개별 지점 값 구하기 대화창     104

그림 8.1 음성조작 파라미터 설정 대화창     105

그림 8.2 객체창의 분석 단추     106

그림 8.3 모음 '아'의 음성조작 편집창     106

그림 8.4 '어머니' 발성에 대한 음성조작 편집창     108

그림 8.5 '어머니' 발성에 대한 피치 변환 편집창     109

그림 8.6 피치 변환 단계 설정 대화창     109

그림 8.7 '어머니' 발성에 대한 재생속도 변형     111

그림 9.1 스크립트 편집창     113

그림 9.2 스크립트 편집창의 File메뉴     114

그림 9.3 스크립트 편집창의 Edit메뉴     114

그림 9.4 숫자 계산 결과 정보창     119

그림 9.5 오류정보 표시 정보창     120

그림 9.6 form 파라미터 입력 대화창     121

그림 9.7 안내문 출력 정보창     121

그림 9.8 구구단 출력 정보창     122

그림 9.9 스크립트 일시 중단 대화창     124

그림 9.10 행렬 작성 대화창     125

그림 9.11 복합 행렬 파라미터 설정 대화창     127

그림 9.12 숫자음 '1'의 분석 결과 그림     128

그림 10.1 '바'의 VOT 측정 편집창     143

그림 10.2 '빠'의 VOT 측정 편집창     144

그림 10.3 '파'의 VOT 측정 편집창     144

그림 10.4 음성 '야'의 편집창     145

그림 10.5 영어음성 'I'의 편집창     146

그림 10.6 스펙트로그램 분석 파라미터 설정 대화창     147

그림 10.7 '사'의 절단주파수 구하기 편집창     148

그림 10.8 '샤'의 절단주파수 구하기 편집창     148

그림 10.9 라링고그라프 신호 편집창     149

그림 10.10 음성신호 변환 대화창     150

그림 10.11 위치가 변환된 라링고그라프 신호 편집창     150

그림 10.12 미분 라링고그라프 신호 편집창     151

그림 10.13 음성장애자의 음성 편집창     156

그림 10.14 음성장애자의 음성 분석창     156

그림 10.15 음성장애자의 피치확인 편집창     157

그림 10.16 음성장애자의 좁은대역 스펙트로그램 편집창     157

그림 10.17 묵음 편집창     160

그림 10.18 개 짖는 소리의 신호 편집창     161

그림 10.19 개 짖는 소리의 신호 확대 편집창     161

그림 10.20 포먼트 분석 파라미터 설정 대화창     162

그림 10.21 개 짖는 소리의 포먼트 분석 편집창     162

그림 10.22 새소리 분석 편집창     163




제 1 장 음성학과 음향학의 기초


이 장에서는 프라트를 사용하는데 필요한 최소한의 음향학의 기본 용어와 개념에 대해 살펴보기로 한다. 먼저 발성기관의 원리와 소리의 음향물리학적 특징으로 흔히 말하는 주파수, 진폭, 파장 등과 컴퓨터로 음성을 저장하는 과정에서 흔히 사용되는 표본추출 속도 등을 알아본다. 이런 기본 개념들을 잘 알고 있는 독자들은 이 장을 건너뛰어 다음 장으로 가기 바란다.


1.1 음원 여과기 이론


사람의 발성구조는 그림 1.1과 같다. 사람은 횡경막을 내리고 늑골을 확장하여 폐로 공기를 흡입한 뒤 다시 횡경막을 올리고 늑골로 압축된 공기를 기관을 지나 성대로 보내며 베루누이 효과와 성대의 탄성에 의해 성대가 진동하게된다. 이 진동이 입 안과 코 안의 공간을 울려서 소리나게 된다. 이 때 성대의 진동은 버들피리의 접촉부분에 해당하고, 입안의 모양은 피리의 울림통에 해당한다.


그림 1.1 사람의 발성구조와 버들피리의 비교

     

피리의 굵기와 길이에 따라 소리의 진동 주파수가 달라지듯이 사람은 혀와 턱을 이용하여 입안의 공간을 여러 가지 모양으로 변화시킴으로써 다양한 소리를 만들게 된다.

모음 ‘이, 아, 우’를 발음할 때의 구강과 인강의 모양을 그림 1.2에서 살펴보자(양병곤, 1998). 모음 ‘이’일 때는 구강이 좁고 인강이 넓은 반면 모음 ‘아’일 때는 그 반대로 구강이 넓고 인강이 좁다. 모음 ‘우’에서는 구강과 인강이 원뿔꼴 모양으로 되어 있고 목젖 주위가 가장 좁게 된다. 이러한 정중단면으로 보면 면적의 차이가 크게 보이지 않지만 실제로는 구강과 인강의 공간을 삼차원적으로 구해야 하기 때문에 단면적에 의한 면적 값보다는 더 차이가 난다.


그림 1.2 모음 발성시 입안 공간의 정중단면


     


1.2 음향학의 기본 용어


우리가 귀로 듣는 소리는 공기의 진동이다. 눈으로는 공기를 볼 수 없지만, 바람이나 연기의 이동을 통해 공기의 움직임을 관찰할 수 있다. 소리의 진동을 가장 단순하게 설명하자면 그림 1.3과 같이 천정에 매달린 연필심이 달려있는 추가 좌우로 일정한 속도로 진동하고 있다고 가정해보자. 이 연필심 아래에서 시간 축 방향으로 종이를 서서히 당기면, 그림과 같은 모양의 진동한 흔적이 그려진다.

이 때 진동하는 폭의 범위를 진폭이라 한다. 종이 위에 그려진 진동 흔적을 90°시계방향으로 돌려 나타내면 그림 1.4와 같이 프라트에서 흔히 볼 수 있는 파형 모양이 된다.

이 파형은 각각의 지점을 연결시켜서 나타내고 있지만 실제 음성에서는 1초라는 시간을 22050 등분하여 각각의 시간점에서의 진동의 크기를 하드디스크로 저장하게된다. 그림 1.5는 시간대별로 입력된 진폭의 크기를 나타내 주고 있다. 여기서, 1 밀리초 안에 22개의 표본이 있으므로 1초 안에는 총 22050개의 표본이 있게된다.



그림 1.3 진동체의 흔적 기록

그림 1.4 진동 파형


그림 1.5 컴퓨터에 입력된 진동파형



진폭을 숫자로 저장할 때, 보통 비트수에 따라 해상도가 달라진다. 예를 들어, 저장하는 비트수가 8비트이면 28에 해당하는 256개의 다른 값으로 표현되며 16비트이면 216에 해당하는 숫자가 된다. 아래와 같이 비트수가 높을수록 진폭의 간격이 매우 촘촘하고 세밀하게 나타낼 수 있게되고 음성의 특징도 고스란히 보존된다.


8비트 28=256

16비트 216=65536

32비트 232=4294967296

64비트 264=1.84467E+19 (E+19는 1.84467X1019를 나타낸다.)


하지만 음성분석에서는 16비트 정도만 해도 청각적으로 유효한 값들은 충분히 포착되기 때문에 그 이상으로 할 필요는 없다.


그림 1.6 파형의 특징



진폭 값은 파형의 진동 폭을 나타내는데 그림 1.6에서 보듯이 최대 값과 최소 값 사이의 차이 값을 정점간 진폭이라고 한다. 두 개의 파형의 진폭 값의 차이는 소리의 볼륨과 비례한다.

종이에 그려진 모양을 위에서 내려다보면 그림 1.7과 같은 파형(파동의 모양)이 된다. 이 때 무게추의 움직임이 완전히 멈춘 자리에서 위로 밀려갔다가 아래로 최대한 이동한 뒤 제자리로 돌아온 부분을 한 싸이클(cycle)이라고 한다. 이러한 싸이클이 1초라는 단위시간 안에 몇 개 들어있는가를 숫자로 나타내면 주파수(주기적인 파동수, frequency)가 된다.



그림 1.7 음성파형의 기본 용어


그림 1.7에서는 0.002초마다 한 번의 싸이클이 나타나 있으므로 1초에는 약 500개의 싸이클이 생긴다. 따라서, 주파수는 500 Hz이다. 주파수가 높아질수록 주기는 짧아진다. 즉, 주파수와 주기는 서로 반비례하는 관계를 나타낸다. 또한 최대한 위로 이동한 최대 값과 아래로 이동한 최대 값 사이의 거리를 진폭(진동하는 폭, amplitude)이라 한다. 무게추의 움직임이 클수록 진폭은 커지게 되며, 중력이나 마찰력에 의해 점점 진폭이 줄어지는 감폭(damping) 현상이 나타난다. 일상 온도에서 공기입자의 진동은 1초당 약 340 m로 전달되는데 만약 1 Hz의 파형이라면 1초에 한 싸이클만 있기 때문에 340 m가 파장(wavelength)이 된다. 10 Hz의 파형이라면 1초에 열 개의 싸이클이 있기 때문에 파장은 34 m가 된다. 즉, 주파수가 높을수록 한 싸이클이 차지하는 파장은 짧아지게 된다. 그리고 위의 무게추를 움직이기 시작한 지점이 어디인가에 따라 위상각(phase)으로 나타낸다. 위의 그림에서는 위상각이 0°에서 시작되었고, 맨 위에 최대 값 지점에서 출발하면 90°가 위상각이 된다. 음향학에서는 음파의 특성을 앞서 제시한 용어와 관계들을 이용하여 다양하게 나타낸다.


1.3 표본추출


소리를 녹음하게 되면 그림 1.5의 파형과 같이 시간축 위의 해당 시간점에서 얼마의 진폭으로 공기가 진동했는지를 나타낸다. 이 때 1초를 몇 등분하여 해당 지점의 소리의 크기(진폭)를 저장하는가를 표본추출속도(sampling rate)라고 부른다. 보통 컴퓨터에 입력하는 소리는 11025 Hz나 22050 Hz의 표본속도를 사용하는데, 이것은 바로 1/11025 s (0.0000907 s)마다 하나의 표본을 뽑아 소리의 크기를 저장함을 뜻한다. 소리 파형을 확대해 보면 그림 1.5와 같은 시간점에서의 소리의 크기로 나타나 있다. 이 때 표본속도의 반에 해당하는 주파수를 나이퀴스트 주파수(Nyquist frequency)라고 하는데 일반적으로 표본추출방식으로 컴퓨터에 저장하는 음성 정보는 표본속도의 반에 해당하는 주파수까지의 모든 정보가 다 들어 있다고 한다. 다시 말해서, CD 음질로 저장하는 44100 Hz의 표본속도는 사람이 들을 수 있는 범위인 20~22050 Hz의 정보를 모두 다 저장할 수 있다. 실제 음성의 중요한 정보들은 8000 Hz범위에 모두 들어가 있기 때문에 그것의 두 배인 16000 Hz의 표본속도나 22050 Hz의 속도를 많이 사용한다. 표본속도 주파수가 두 배가되면 정보량도 두 배가되어 하드디스크의 공간을 더 많이 차지한다. 그런데 전화음성을 녹음할 때는 보다 좁은 범위의 주파수를 나누어 사용하기 때문에(약 300~3400 Hz범위) 표본속도를 8000 Hz로 설정하여 녹음하면 필요한 정보를 모두 포착하게된다. 자동응답전화로 통화한 내용을 그 이상의 속도로 녹음하면 필요 없는 정보로 하드디스크 공간만 차지한다. 또한, 성대의 진동속도인 피치를 측정하여 억양 연구만 할 예정이라면, 8000 Hz의 표본속도로 해도 1000 Hz 이하에 있는 사람의 피치 값을 놓치지 않고 저장하는 것이 된다. 일반적으로 표본속도를 낮게 하면 고주파 영역의 성분이 걸러져 약해지기 때문에 코맹맹이 소리처럼 둔탁한 음성으로 들린다.


1.4 단순음과 복합음


사람의 음성은 매우 복잡한 파형으로 나타난다. 이러한 파형을 이해하기 위해서는 먼저 단순한 파형의 구조와 특성을 살펴보아야 한다. 그림 1.1과 같은 단순한 진동을 나타내는 파형을 단순음이라고 하는데, 두 개 이상의 단순음이 합쳐진 음파를 복합음이라고 한다. 사람의 음성은 복합음에 해당한다. 두 개의 단순음을 합치는 것은 그림 1.8과 같이 두 파형에서 동일한 시간점의 진폭을 더한 것이 된다. 따라서, 복합음의 진폭 값은 단순음 두 개의 파형보다 더 높게 나타난다.

그림 1.8의 두 단순음 파형을 합치면 세 번 째 복합음파형이 나오는 과정과는 정반대로, 세 번 째의 복합음파형에서 각각의 성분이 되는 단순음파형으로 분리하는 과정이 푸리에 변환(Fourier Transformation)이다. 푸리에 변환과정은 기본적으로 음파의 값의 앞 뒤 값의 곱을 통해 곱한 값이 가장 크게 나타나는 지점들을 뽑아서 주기성을 찾아내는 과정이라고 말할 수 있다.

그림 1.9는 실제 음성으로 발음한 모음 ‘아’의 확대된 파형을 보여주고 있다. 앞의 복합음 파형과 유사하나 더욱 더 복잡하다.

그림 1.8 단순음과 복합음 파형



 



그림 1.9 모음 ‘아’의 음성 파형



1.5 스펙트럼․스펙트로그램


그림 1.10에서처럼 복합음은 푸리에 변환을 하면 각각의 성분음으로 나타낼 수 있다. 이 것은 햇빛을 삼각 프리즘에 통과시키면 무지개 색깔의 스펙트럼으로 분리되어 나타나는 과정과 비슷하다.

각각의 성분음의 위상은 청각적으로 느끼지 못하기 때문에 생략하고 주파수와 진폭의 크기만을 나타낸 것을 스펙트럼이라고 한다. 그림 1.11은 100 Hz와 500 Hz로 구성된 두 개의 파형에 대한 스펙트럼을 파형의 진폭만을 표기하여 나타낸 것이다.





그림 1.10 푸리에 변환과정


그림 1.11 정현파와 스펙트럼



그림 1.11의 스펙트럼 정보를 시간점마다 나타내게 되면 아래와 같은 스펙트로그램이 된다. 스펙트로그램에서는 스펙트럼의 정점을 표시하게 되어 시간축에서 해당 주파수의 크기가 얼마나 되는지를 3차원 그림 1.12로 한꺼번에 나타내어 준다.

그림 1.12 정현파와 스펙트로그램

실제 사람의 음성을 푸리에 변환한 스펙트럼을 살펴보면 그림 1.13과 같이 나타난다. 음성파형을 스펙트럼 분석을 한 뒤 시계 반대방향으로 90。 돌려서 주파수축과 진폭축의 위치를 바꾸면 맨 아래 그림처럼 나타나고 스펙트럼 정보에서 진폭 값이 높은 언덕 부분은 진하게 표시하고 낮은 골 부분은 연하게 각 시간점마다 연속하여 표시하면 두 번째 나타나 있는 스펙트로그램이 된다.


그림 1.13 스펙트로그램 생성 과정



이 부분에서 진폭 값의 꼭지점에 해당하는 부분은 진하게 나타내고 골에 해당하는 부분은 연하게 표시한 것이 스펙트로그램이다. 실제 음성의 스펙트럼을 연속해서 나타내면 그림 1.14와 같다.

이 그림에서 에너지 정점에 해당하는 부분을 포먼트라고 하는데 임의의 선으로 연결하여 나타내어 보았다. 각각의 포먼트는 조음기관의 변화를 나타내는데 대체로 주파수축 아래 첫 번째 부분은 턱의 열림 정도를 나타낸다. 턱을 많이 내려서 입을 벌릴수록 값이 높아진다. 두 번 째 띠로 연결된 부분은 주로 혀의 앞 뒤의 위치를 나타낸다. 혀가 앞으로 갈수록 높아지고 뒤로 갈수록 낮아진다. 세  번 째 띠는 입술 둥근 정도를 나타내는데 대체로 입술을 둥글게 하면 낮아진다. 구체적인 값들은 포먼트 분석에서 살펴보도록 하기 바란다.




그림 1.14 연속 포먼트 구조






제 2 장 프라트 설치

2.1 파일 받기


프라트(Praat)는 암스테르담 대학의 Paul Boersma와 David Weenink가 만든 음성분석 및 변형 프로그램 패키지인데 이것은 인터넷 홈페이지 http://www.fon.hum.uva.nl/praat/download_win.html에서 무료로 받을 수 있다.


그림 2.1 프라트 파일 받기



다운로드 과정은 그림 2.1과 같이 이 홈페이지의 두 번 째 줄의 praat4026_winsit.exe를 한번 클릭 하고 저장할 하드디스크의 폴더를 선택하면 된다. 가능하면 별도의 새로운 폴더를 만들고 여기에 저장한다. 이어서 저장된 파일을 찾아 두 번 누르면 자동으로 압축된 파일이 풀리고 실행 프로그램이 설치된다.

설치된 praat.exe를 마우스의 오른 쪽 단추를 눌러 선택하면 그림 2.2와 같은 메뉴가 나타난다.


그림 2.2 바로 가기 만들기


    


이 메뉴 중 [바로 가기 만들기]를 누르면 그림 2.2 옆의 그림과 같은 모양의 아이콘이 생긴다. 이것을 마우스 왼 쪽 단추를 누른 채, 바탕화면 위로 끌고 가서 단추를 놓는다. 다음부터는 바탕화면의 [바로 가기]를 두 번 누르면 프라트가 실행된다. 윈도우 왼 쪽 아래의 시작메뉴에 넣고 싶으면 마우스로 [시작]을 누른 뒤, 이어서 [작업표시줄 및 시작]메뉴를 누르고 시작메뉴의 사용자 정의 대화창에서 [추가]단추를 눌러 저장된 폴더를 찾아 하드디스크의 경로를 입력해 주면 된다. 이어서 [다음]단추를 누르고 저장할 폴더이름을 선택한 뒤 praat.exe라는 이름을 그대로 받아들이고 [확인]단추를 누르면 작업표시줄에 등록이 된다. 다음부터 프라트를 실행할 때는 마우스로 바탕화면의 왼 쪽 아래에 있는 [시작메뉴-->프로그램-->시작프로그램-->praat.exe]를 차례로 눌러 선택하여 실행시키면 된다. 가능하면 바탕화면에서 [바로가기]를 이용하는 것이 시간을 절약할 수 있다.

2.2 작업폴더 구성


파일관리를 편리하게 하기 위해서는 그림 2.3과 같이 하위 폴더를 구성하여 조직적으로 관리하는 것이 바람직하다.


그림 2.3 작업폴더 구성의 예

 

녹음한 음성자료는 각 연구 프로젝트별로 보관하고, 확장자는 파일종류에 따라 .aifc 또는 .wav 등으로 지정한다. 확장자 앞에 들어가는 파일이름은 남녀 화자에 따라 m(남), f(여) 등의 표기를 하고, 다음에 13s(13번 피험자) 등의 이름을 두어 프로젝트에 참가한 피험자의 번호 등을 미리 지정해주면 나중에 설명할 프라트 스크립트의 되풀이 작업으로 파일을 불러올 수 있고 이를 분석하여 하드디스크의 분석결과 폴더에 저장할 때 도움이 된다. 덧붙여, 서로 다른 연구용 음성파일은 폴더마다 별도로 저장해 두는 것이 편리하다. 왜냐하면, 프라트를 열어 분석할 때 제한된 수의 파일을 보이는 파일보기 창을 아래 또는 위로 이동하지 않고 빠른 시간 내에 선택할 수 있다.

분석 결과 폴더에는 해당 프로젝트의 첫 두 세 글자(예를 들어 kr 학술진흥재단, ks 한국과학재단)를 따서 동일한 자료는 쉽게 찾을 수 있도록 하고, 하드디스크에 저장할 때는 .dat는 프라트 분석 결과 파일로, .txt는 텍스트로 저장할 때 사용한다. 텍스트로 저장된 분석 결과는 마이크로소프트 엑셀을 이용하여 그래프로 깔끔하게 그릴 수 있으며, 그림이 포함된 엑셀파일 자체를 .xls로 저장해 주는 것이 파일명만 보고도 쉽게 구분할 수 있게 된다.

스크립트 폴더에는 개발한 스크립트를 저장하되 파일의 이름에 날짜를 일목요연하게 표시하고 간략히 용도를 넣어서 021031포먼트추출.sk 등으로 저장한다. 불러올 때도 스크립트가 많아질수록 복잡하게 되기 때문에 파일이름을 한글이나 엑셀의 페이지에 제시하고, 각 파일이 무엇을 하는지 어떤 기능에 사용되는지 또 주목해야할 사항들을 기록하여 둔다면 프로그램 개발에 매우 편리하다. 스크립트 가운데 공통으로 사용할만한 부분들은 따로 폴더를 만들어 보관해 두었다가 다른 스크립트를 작성할 때 활용한다. 스크립트 파일가운데 작업이 완료되어 실행하는데 어려움이 없는 것에는 파일이름 끝 부분에 특별히 !(완료)나 %(진행중), ?(오류있음)과 같은 문자를 넣어두면 다음 번에 실행하더라도 무한 반복과 같은 오류로 컴퓨터를 다시 시동하지 않아도 된다.




제 3 장 프라트 사용법


3.1 프로그램 실행


프라트 프로그램은 하드디스크에 이미 저장된 실행파일(praat.exe)을 찾아 마우스로 두 번 클릭 하면  실행된다.


그림 3.1 프라트 객체창과 그림창



작업환경은 그림 3.1과 같이 프라트 객체창(Praat objects)과 프라트 그림창(Praat picture)으로 나뉘어진다. 기본적으로 프라트 객체창은 모든 분석 작업을 통제하는 통제실과 같은 역할을 하고, 프라트 그림창은 분석결과를 그림으로 그리고 동시에 필요한 문자와 화살표, 선 등으로 그려 넣은 뒤, 그림 파일을 논문에 실을 수 있다.


3.2 프라트의 메뉴


프라트를 실행하면 화면 맨 위에 나타나는 기본메뉴는 Control, New, Read, Write, Help가 있는데, 기본메뉴 아래층에 나타나는 하위메뉴에 대해 살펴보기로 한다. 객체창에 아무런 파일이 없을 때는 Write메뉴 아래에는 아무 것도 나타나지 않기 때문에, 여기서는 설명을 하기 위해 객체창에 임의의 파일을 불러온 뒤, 메뉴구조를 그림으로 나타내었다.

이들 하위메뉴에 대해 차례로 살펴보면, 먼저 기본메뉴인 Control 아래에는 자동화 스크립트를 만드는 New script 메뉴와 이미 작성하여 하드디스크에 저장해 둔 스크립트를 불러오기(Open script...)가 있다.

그림 3.2 Control의 하위메뉴


          


Goodies메뉴 아래에는 Calculator가 들어있어 대화창에 계산할 공식을 입력하면 그 결과 값을 정보창에 나타내어 준다. 그 아래에는 Stop playing sound가 있는데 긴 시간에 걸쳐 녹음된 음성을 재생하다가 중지시킬 때 사용한다. 이 메뉴를 선택하는 대신 Esc키를 눌러도 된다. 마지막에는 Floating point properties가 있는데 프라트에서 연산되는 부동소숫점에 의한 계산의 정밀도에 대해 설명되어 있다. Preference메뉴 아래에는 Buttons가 있는데 이것을 선택하면 그림과 같은 체크박스가 나타난다.


그림 3.3 Buttons의 선택


  


기본 값은 Objects박스에 체크표시가 되어있는데 여섯 번째의 hidden Objects:Control:Debug...은 기본메뉴의 Control 메뉴 아래에 들어갈 Debug...이란 하위메뉴가 나타나지 않도록 설정되어 있다는 의미이다. 마우스로 hidden을 클릭하면 SHOWN으로 바뀌고 객체창의 Control메뉴를 눌러보면 Debug...이란 하위메뉴가 나타나 있음을 알 수 있다. 즉, 기본메뉴에 자주 사용하는 메뉴만 남기고 별로 쓰지 않는 메뉴는 숨겨둠으로써 작업을 편리하게 할 수 있다. 이 가운데는 숨길 수 없는(unhidable) 메뉴들도 있다. 또한 다음에 설명할 스크립트를 작성하여 연속된 작업을 하나의 메뉴로 만든 다음 원하는 기본메뉴 아래에 덧붙이는 작업도 가능하다. 다음에 있는 Picture박스에 체크표시를 하면 그림창의 모든 메뉴들이 나타나고 임의로 숨기거나 나타나게 할 수 있다. 그 다음에 나와있는 Actions A-M이나 Actions N-Z앞의 선택 박스를 누르면 기본메뉴의 하위메뉴와 객체창의 분석메뉴의 목록이 차례로 나타난다. 목록을 보면 엄청난 프로그램임을 한 눈에 느낄 수 있다. 그 다음 메뉴로 음성입력의 일시 보관 분량을 지정하는 Sound input preference가 있는데 처음에는 보통 5 Mb가 할당되어 있다. 이것은 22050 Hz의 표본속도로 입력할 때 약 1분간 녹음할 수 있는 메모리의 양이다. 오랜 시간동안 녹음을 하려면 컴퓨터 메모리가 허용하는 만큼 이 숫자를 높이면 된다. 예를 들어, 10분 이상을 녹음하려면 그림 3.4와 같이 50 Mb를 할당하면 된다.


그림 3.4 음성입력 메모리 설정



마지막에 있는 Sound output preferences를 선택하면 그림 3.5와 같이 음성을 재생할 때 어떤 방식을 사용하는가를 지정하는 대화상자가 나타난다.


그림 3.5 음성 출력 설정 대화창

음성 출력 설정의 기본 값으로는 Asynchronous가 선택되어 있고 객체창에서 음성파일을 선택한 뒤 Play단추를 누르면 끝까지 재생하게 되며 다른 작업도 동시에 할 수 있게 된다. 바로 위의 interruptable이란 라디오단추(◎)를 선택해두면 긴 음성을 중간에 정지시킬 수 있도록 된다. 맨 위의 단추인 Synchronous를 선택해두면 소리를 끝까지 듣고서야 다른 작업을 할 수 있다. 긴 음성파일을 재생하는 과정에서 연속해서 재생되지 않고 컴퓨터 메모리가 부족해서 중간 중간이 끊어지는 경우에는 맨 위의 단추를 선택하면 된다. 맨 아래의 Quit은 프라트를 종료하는 메뉴이다.


그림 3.6 New의 하위메뉴


       


그림 3.6의 New 메뉴에는 컴퓨터에 마이크로 음성을 직접 녹음하는 것을 통제하는 메뉴와 행렬, 최적성 이론과 신경망 처리과정에 관한 메뉴들이 들어 있다. 먼저 Record mono sound...는 한 채널로 음성을 녹음할 때 사용하고, 두 개의 채널로 녹음할 때는 Record stereo sound...를 사용한다. 음성녹음과정은 따로 상세히 설명하고 있기 때문에 여기서는 생략한다.


그림 3.7 Sound의 하위메뉴


      


 Sound메뉴 아래에는 그림 3.7과 같이 지각실험이나 분석기의 성능을 검사하는데 필요한 정현파 합성음을 만드는 Create Sound... 기능이 있다. 이 기능을 이용하여 원하는 주파수의 음을 만들거나 조합하여 들려주거나 임의로 만든 정현파들의 합을 이용하여 분석프로그램의 성능을 평가할 수 있다. 그 다음에 나오는 Create Sound from tone complex...는 여러 개의 정현파를 합친 복합음을 만들 때 사용한다. gamma-tone은 내이의 기저막이 스펙트럼을 분석하는 것과 같은 진동방식을 시뮬레이션 하기 위해 수학적으로 정의된 파형이다. Shepard tone은 Shepard(1964)가 정의한 것으로 피치 값이 연속해서 계속 올라가는 듯한 청각적 인상을 주지만 실제는 그 자리에서 맴돌고 있는 복합음을 보여준다.


그림 3.8 Matrix의 하위메뉴



Matrix에는 그림 3.8과 같이 두 개의 하위메뉴가 있는데 Create Matrix...를 선택하면 열수와 행수를 지정하고 최대 값, 최소 값, 증가치 등을 지정하여 복잡한 행렬을 만들 수 있다. 단순히 일정한 가로 세로의 셀을 가진 행렬을 만들려면 Create simple Matrix...를 실행한 뒤 행수와 열 수를 지정하고, 공식 입력 칸에 각 값들의 곱이나 합을 입력하면 모든 셀에 그 값이 들어간 행렬객체가 생성된다. 음성분석 결과를 To Matrix...를 실행하여 행렬객체로 변환하면, 각 셀의 값을 불러와 연산에 사용할 수도 있고 지정한 셀의 값을 바꿀 수도 있다. 행렬객체로 하면 그림창에 그릴 때 아주 다양하게 나타낼 수 있는 장점이 있으나, Modify명령에서는 공식에 의해 소폭의 변형만이 허용된다. 셀의 값들을 이용한 그림은 없지만 좀 더 통계적인 합이나 평균 등을 표 아래 표시하려면 다음에 나오는 Tables-->Create Table을 이용하기 바란다. 이 메뉴에서도 행수와 열수를 지정하여 표로 만들 수 있는데, 주성분분석이나 상관계수 등을 계산할 때 편리하다. 여기서도 Modify명령어가 객체창에 나타나는데 이것을 이용하면 다양한 통계자료가 포함된 표를 만들 수 있다.

덧붙여, 음성파형에 발음이나 이름을 표기하고 싶으면, 먼저 객체창에 표기할 음성파일을 불러온다. 여기서는 number라는 파일을 불러왔다고 가정한다. 이 음성파일을 선택한 상태에서 객체분석단추가운데 Label & Segment를 선택한다. To Text grid를 선택하면 그림 3.9와 같은 대화창이 나타난다.

그림 3.9에서, Tier names 다음에 있는 박스 안에 Mary John bell을 지우고 number1으로 입력한다. Tier names는 전체 간격마다 하나씩 이름을 붙여주는 반면 Point tiers는 음성파형의 구체적인 한 시간점에 이름을 붙여준다.

그림 3.9 발음기호 입력창



이어서 OK단추를 누르면 TextGrid number라고 객체창에 올려진다. 컨트롤(Control) 키를 누른 채, 객체창에 올라와 있는 Sound number를 마우스로 클릭 하면 두개의 객체가 동시에 선택되고 이어서 Edit 단추를 누르면 그림 3.10과 같이 나타난다.


그림 3.10 발음한 단어 입력 창



이 그림에서 첫 번째 부분은 음성파형을 나타내고 있고 두 번째에는 발음 단어를 넣을 TextGrid부분이 된다. 마우스로 첫 번째 소리가 끝나는 지점을 클릭 하고 빈칸에 ‘pa'라고 입력한 뒤 엔터키(Enter)를 누르면 그림과 같이 입력된다. 이어서 두번째 음성의 끝자락에 마우스를 두고 그림과 같이 박스 안에 ‘ppa’라고 입력하면 빨간색으로 마우스 뒷부분에 글자가 나타나며 엔터키를 누르면 자동으로 입력된다. 이렇게 음성파형에 해당되는 부분의 끝자락을 찾아서 발음 표시를 할 수 있고 긴 음성파일이라면 Query에서 검색 단어를 입력하여 찾아갈 수 있다.



그림 3.11 Read의 하위메뉴


 

Read 메뉴에는 다양한 형태의 음성파일을 불러들일 수 있으며, 너무 긴 음성이라서 메모리가 부족한 경우에는 Open long sound file... 기능을 이용해서 전체파일을 불러온다. 이어서, 객체창의 분석단추 가운데 사용자가 지정한 시작시간과 끝시간(time range)의 일부 음성만 재생시켜주는 Play part나 일부 음성만 뽑아서 객체창에 올려주는 Extract part단추를 이용할 수 있다. Read two sounds from stereo file...메뉴를 이용하면 스테레오 파일에서 좌우 각 마이크로 들어온 음을 따로 객체창에 불러내 준다. 다음에 있는 Read from special sound file메뉴에서는 A-law방식이나 16-bit Little Endian file 등을 불러올 수 있다. 또한 다음 블록에 있는 행렬이나 실수로 되어있는 음성분석 데이터자료를 불러올 수 있다. Read from special tier file...아래에는 x-Waves에서 작업한 음성기호나 분절음 표시위치 등의 정보를 불러올 수 있다.


그림 3.12 Write의 하위메뉴

     

그림 3.12의 Write 메뉴에는 녹음한 음성을 단순한 숫자의 배열로 나타낸 텍스트 파일, 이진파일 등 여러 가지 형태의 파일로 저장할 수 있다. 맨 위에 나오는 Write to text file...로 저장하면 다음과 같이 하드디스크에 저장된다.


File type = "ooTextFile"

Object class = "Sound"


xmin = 0.20000000000000001

xmax = 1

nx = 17640

dx = 4.5351473922902495e-05

x1 = 0.20002267573696148

ymin = 1

ymax = 1

ny = 1

dy = 1

y1 = 1

z[][] :

  z [1]:

        z [1][1] = -0.0010681152

        z [1][2] = -0.0010070801

        z [1][3] = -0.00094604492

        z [1][4]= -0.0010070801

        z [1][5] = -0.00091552734 <이하 생략>


여기서 음성에 대한 정보를 맨 앞에 포함하여 z[1][2]= -0.0010070801 첫 번째 줄의 두 번째 열의 값과 같이 차례로 열거해 준다. 음성파일을 저장한 뒤 이들 값을 임의의 순서로 불러와 작업을 할 때 편리하다. 이런 음성 정보의 단서가 되는 부분을 모두 제거하고 아래와 같이 정보 값만 저장하려면 Write to short text file...을 실행하면 된다.


File type = "ooTextFile short"

"Sound"

0.20000000000000001

1

17640

4.5351473922902495e-05

0.20002267573696148

1

1

1

1

1

-0.0010681152

-0.0010070801

-0.00094604492

-0.0010070801

-0.00091552734 <이하 생략>


이렇게 Short text file 형태로 저장하면, 객체창에 올려진 피치분석이나 포먼트 분석의 결과를 저장한 뒤, 자신이 즐겨 쓰는 엑셀에 불러와 그래프로 그릴 수 있다. 다음에 오는 Write to AIFF file...은 파일을 Audio Interchangeable File Format으로 저장하는데 윈도우즈나 맥킨토시, 리눅스 등에서 쉽게 읽혀지는 파일 형태이다. 프라트에서는 AIFC형태로 저장하고 읽는데, 이런 여러 가지 종류는 주로 파일의 정보를 나타내는 시작 부분(Header)에 차이가 있다. WAV는 윈도우즈의 음성파일 형태이고, Next/SUN은 워크스테이션에 사용되는 파일 형태이고, NIST는 일본에서 음성 데이터베이스로 저장할 때 사용하는 형태이다.


그림 3.13 Help의 하위메뉴



마지막으로 기본메뉴의 끝에는 그림 3.13과 같이 Help 메뉴가 있는데 여기에는 프라트를 사용하는데 필요한 자세한 도움말과 검색기가 있다. 첫 번째 하위메뉴인 Object window를 선택하면 기본메뉴를 비롯하여 객체창에 나타나 있는 각각의 메뉴들을 한꺼번에 보여준다. 더 알고싶은 메뉴를 선택하면 상세한 정보를 보여준다. Introduction to Praat에는 프라트 프로그램을 시작하기와 음성녹음하기, 스펙트로그램, 피치, 포먼트, 강도 분석하기, 음성조작 등 주제별로 정리가 되어있고, 원하는 주제를 누르면 더 상세한 정보가 나타난다. Praat program은 각 객체별로 프로그램 전반에 대한 소개를 하고 있으며, 각각의 내용을 마우스로 누르면 하이퍼링크에 의해 바로 필요한 정보를 얻을 수 있다. Scripting tutorial은 스크립트를 만드는 예제, 각 변수의 지정, 되풀이되는 작업을 자동화하기 위한 repeat 구문 등에 대한 내용이 주제어별로 정리되어 있다. Numerical expressions는 사칙연산에 사용되는 특수기호와 pi 값과 같은 상수 값, 절대 값이나 반올림, 멜 또는 바크와 같은 청각 척도로의 변환 등을 하기 위해 설정된 함수 용어들이 정의되어 있다. Go to manual page...는 지침서 내용의 표제어를 알파벳순으로 정렬하여 보여주고 있다. Search manual을 누르면 구람 3.14와 같은 대화창이 나타나는데, 필요한 용어를 입력하고 OK단추를 누르면 관련된 항목을 차례로 보여준다.


그림 3.14 검색어를 이용한 정보 찾기



3.3 객체창의 분석단추


프라트를 실행한 다음 Read메뉴의 Read from file...을 이용하여 앞서 저장한 1234라는 이름의 음성을 불러오면 그림 3.15와 같이 객체창의 오른 쪽에 여러 개의 분석단추가 나타난다.

이들 분석 단추들에 대해 설명해 놓은 내용을 보려면, 맨 위에 있는 Sound help 단추를 누르면 된다. 이렇게 열려진 창에서 알고 싶은 부분을 선택하면 더 많은 정보를 보여준다. 음성파일을 선택한 채 Edit단추를 누르면 편집할 수 있는 창문이 나타나는데 원하는 구간의 음성을 들어보거나, 자르거나 붙이기 또는 일부분을 다른 이름으로 저장하는 등의 다양한 편집 작업을 할 수 있다.


그림 3.15 객체창의 분석단추



 또한 음성파형과 스펙트로그램을 동시에 보면서 포먼트, 피치, 강도 값 등을 구할 수 있다. Play단추를 누르면 선택된 음성을 재생시켜준다. Draw단추는 선택한 음성을 그림창에 그려준다. Query 단추는 선택된 음성에 대하여 시작 시간점(Get starting time) 끝 시간점(Get finishing time), 지속시간(Get duration), 표본속도(Get sample rate), 지정 시간점에서의 진폭 값(Get value at time), 표본번호로 지정한 지점의 값(Get value at index), 최대 값(Get maximum), 최소 값(Get minimum), 평균 값(Get mean) 등 다양한 정보를 구할 때 사용한다. 이것을 사용한 뒤에 생긴 작업일지(history)를 살펴보고 스크립트로 작성하면, 음성파일이나 분석결과파일에서 원하는 정보만을 하드디스크에 따로 저장할 때 매우 편리하다. Modify단추는 선택된 음성의 일부 정보를 변경하거나 곱하기, 더하기 등을 통해 한꺼번에 바꿀 때 사용한다. Label & segment는 음성파일의 각 부분을 분절하여 발음기호를 적어 넣는데 사용한다. 이렇게 자음, 모음 등 각각의 음성별로 분리된 파일을 이용하여 음운규칙이나 통계적인 분석결과를 얻을 수 있다.

Analyse 아래에 있는 다섯 개의 단추들은 음성분석에 사용한다. Periodicity는 성대의 진동인 기본주파수 또는 피치 값을 구할 때 사용한다. Spectrum은 스펙트로그램과 Wavelet, 청각척도로 변환한 Cochleagram 등을 나타내준다. Formants & LPC는 음성파형의 포먼트와 선형예측계수(Linear Predictive Coding)를 구할 때 사용한다. MFCC는 물리적인 주파수 단위를 사람의 청각척도로 변환한 예측계수를 나타내준다. Points는 성대의 진동이 큰 지점에 하나씩을 자동으로 추정하여 제시해준다. 피치간격을 기준으로 음성을 분석할 때 해당 부분에 대한 시간점 값을 이용할 수 있다. To Intensity...단추는 선택된 음성에서 진폭 값의 변화를 지정한 시간 간격마다 구해준다. 이것은 음성파형의 전체적인 에너지 변화를 구하는데 도움이 된다. 예를 들어, 이 값들 가운데 일정 크기 이상의 값들이 연속적으로 나타나는 구간을 음성이 있는 구간으로 판단하고, 일정 크기 이하의 값들이 나타나는 구간을 소리가 없는 구간으로 자동으로 분류하는데 사용할 수 있다.

To Manipulation...은 선택된 음성을 피치와 포먼트 등으로 분석한 뒤 이를 임의로 조작하여 들어 볼 수 있는 기능이다. 포먼트 합성기와 같이 복잡한 분석결과를 구하지 않고서도 억양의 변화에 따른 지각실험이나 심리음향학적인 실험을 할 수 있는 매우 좋은 기능을 가지고 있다. 이 책에서도 제시하고 있지만, 프라트에서 분석한 여러 가지 음향 파라미터를 이용하면 SenSyn과 같은 포먼트 합성기를 이용해서 보다 다양한 지각실험을 할 수 있다.

마지막으로 Synthesize아래에 있는 4개의 분석 단추들은 음성변환 또는 여러 개의 음성파일을 합치는데 사용할 수 있다. 첫 번째 Convert 단추를 이용하면 필요한 음성의 부분을 정확히 여러 가지 분석창을 통해 열어볼 수 있고, 선택된 음성을 다른 표본속도로 변환하거나 행렬로 저장하는데 사용한다. Filter단추는 선택된 음성의 주파수대역별로 다양하게 통과시키거나 걸러줄 수 있고, 일정한 크기로 고주파대역을 증폭시키거나 감폭시킬 수 있다. Enhance단추에는 선택된 음성을 PSOLA 방식으로 재생시간을 빠르게 하거나 느리게 할 수 있고, 지정한 주파수대역의 음성을 Bark척도 간격으로 증폭하여 스펙트럼 계곡부분의 진폭을 더 낮게 하고 음성부분을 더 강하고 뚜렷하게 나타내준다. 마지막으로 Combine sounds단추를 이용하면 동시에 선택된 두 개 이상의 소리의 진폭을 각각 더하여 하나의 복합음으로 만들거나 (Convolve), 차례로 더하여 하나의 연속된 파일로 만들 때 (Concatenate) 사용한다.


3.4 그림창의 메뉴


그림창의 기본메뉴에는 그림 3.16에서 보듯이 File, Edit, Margins, World, Select, Pen, Font 등이 있다.


그림 3.16 그림창의 기본메뉴


     


File 메뉴 아래에는 프라트 그림파일을 하드디스크에서 불러오거나(Read from praat picture file...), 저장하는(Write to praat picture file...) 메뉴가 있고, 윈도우즈 메타파일로 저장하기(Write to Windows metafile), 그림을 클립보드에 복사하여(Copy to clipboard) 한글과 같은 다른 프로그램의 창으로 붙여넣기를 할 수 있다. 그림창에 있는 그림을 선택한 뒤 Write to EPS file로 저장하여 아래아한글이나 영문워드의 Insert 메뉴아래의 File이나 Picture를 선택하여 입력할 수 있다. 인쇄(Print)메뉴는 연결된 프린트로 인쇄하게 한다.


그림 3.17 그림창의 Edit 하위메뉴


          


 Edit메뉴에는 그림 3.17과 같이 객체창의 파형이나 분석결과를 그림창에 붙인 뒤 이 동작을 취소할 때 Undo를 사용하고, 모두 지울 때는 Erase all을 선택한다. 물론 여러 개의 분석결과나 파형을 그림창에 겹쳐서 차례로 그려갈 수 있는데 그려진 차례와 역순으로 취소해 나갈 수 있다.

Margins메뉴 아래에는 마우스로 선택한 영역의 안쪽에 지정한 두께로 직사각형의 박스 만들기(Draw inner box), 좌측, 우측, 위, 아래에 문자 넣기(Text left/right/top/bottom...), 일정한 간격마다 좌측, 우측, 위, 아래에 눈금자표시하기(Marks left/right/top/bottom every...), 로그자 방식으로 눈금자표시하기(Logarithmic marks left/right/top/bottom...), 한 개만 표시하기(One logarithmic marks left/right/top/bottom...) 등을 사용한다. 마지막의 Axes...메뉴는 마우스로 선택한 공간의 수평축과 수직축의 최소 값과 최대 값을 임의로 지정하는데 사용한다. 이렇게 지정된 공간에서 앞서의 눈금자 표시나 문자표시 등을 원하는 위치에 쉽게 넣을 수 있다.


그림 3.18 그림창의 World 하위메뉴

     


그림 3.18의 World메뉴 아래에는 Axes...로 지정된 수평축과 수직축 상의 좌표 값에 임의의 숫자나 문자(Text...)를 넣을 수 있다. Text special...은 글자체를 다르게 택하여 원하는 각도로 기울여서 그려준다. 또한 선(Draw line...)이나 한쪽 방향의 화살표(Draw arrow)나 양방향의 화살표(Draw two-way arrow...)가 있고, 직사각형(Draw rectangle...), 반원(Draw arc...), 찌그러진 원의 일부(Draw ellipse...), 원(Draw circle...)도 그려 넣을 수 있다. Paint circle...을 선택하면 지정된 크기의 원을 지정한 색깔로 그려준다. 마지막에 있는 Measure는 Axes...로 지정된 좌표 값(wc: world coordinate)에서 실측치(mm단위)가 얼마로 나타나는지(Horizontal mm to wc...) 또 그림에 입력할 문자의 길이가 좌표 값에서 얼마를 차지하는 지를 나타내준다.

Viewport...메뉴는 그림을 그리기 위한 영역을 지정한다. 마우스로 그림이 시작될 위치를 클릭 하여 누른 채 원하는 크기만큼 끌고 가서 놓으면 분홍색 선으로 된 사각형 틀이 만들어진다. 물론 그림 3.19의 대화창을 불러와 좌표 값을 지정하면 보다 더 정밀하게 또는 같은 크기의 창을 선택하여 그림을 만들 수 있다. 대화창에는 시작 부분의 좌표 값 (0, 0)과 끝 부분의 좌표 값(6, 7)을 지정하게 되어 있다.



그림 3.19 Viewport 대화창




이 메뉴의 명령어를 이용하여 좌표값이 임의의 간격으로 증가하도록 스크립트를 작성하여 실행하면 그림창에 원하는 크기로 그림을 연속적으로 그려나갈 수 있다. Viewport text...는 그림 영역의 한 지점에 필요한 문자를 넣을 때 사용한다.

그림 3.20의 대화창에서 선택된 사각형의 수평축에서 왼 쪽(Left), 가운데(Centre), 오른 쪽(Right)의 위치를 라디오 단추에 체크하여 정하고, 수직축에서 바닥(Bottom), 반(Half), 맨 위(Top)가운데 하나를 선택하면 된다. Rotation(degrees)은 글자의 기울기 각도를 말한다. 그 아래에 있는 박스에 나타낼 용어를 입력하면 된다.



그림 3.20 문자 입력 대화창




그림 3.21 Pen의 하위 메뉴


           


그림 3.21의 Pen메뉴에는 선의 유형과 색깔을 지정할 수 있어서 객체창에서 선택한 파형이나 분석결과를 다양한 색깔과 굵기로 나타낼 수 있다. 선의 종류로는 실선(Plain), 점선(Dotted), 긴 점선(Dashed)이 있고, 선의 굵기(Line width...)를 지정할 수 있다. 색깔별로 선택하여 여러 가지 분석된 자료를 구분되게 인쇄할 수 있다.


그림 3.22 Font의 하위메뉴


       


마지막의 Font메뉴에는 그림 3.22와 같이 글자체의 크기와 종류를 지정한다. 글자의 크기를 임의로 바꿀 때는 Font size...를 클릭 하여 필요한 값을 입력하면 된다. sure의 첫 발음을 IPA(국제음성문자)로 입력하려면 Text special...을 선택하고 대화창의 입력상자에 \sh를 입력하면 된다. 각각의 IPA문자에 대한 표기방식은 Help메뉴 아래의 네 번째에 있는 Phonetic symbol chart를 선택하면 된다. 음성을 분석하여 음성파형은 물론 분석결과를 그림 파일로 나타낼 때는 하나하나 마우스로 메뉴를 선택하여 처리하기보다는 스크립트 기능을 이용하여 자동으로 나타내는 것이 편리하다.


3.5 음성 녹음 환경 설정


컴퓨터에 음성을 녹음한 뒤 저장하려면 먼저 컴퓨터 자체의 오디오 입출력에 관한 환경설정을 해 줘야한다. 녹음오디오 설정은 다음과 같은 순서로 한다.


마이크로 녹음하기


1. 컴퓨터 시작메뉴에서 [설정-->제어판-->멀티미디어-->오디오]를 차례로 선택한다.

2. 그림 3.23과 같이 멀티미디어 등록 정보가 나타나면 [재생] 밑의 스피커를 누른 뒤 음소거란이 체크되어 있지 않도록 한다.


그림 3.23 멀티미디어 설정


.


3. 각 장치들의 선택사항을 보이는 그림 3.24에서 세 번째에 해당하는 마이크의 맨 아래 선택 박스에 마우스로 클릭 하여 체크 표시가 나타나도록 한다.


그림 3.24 녹음 조절 설정



이 그림에서 볼륨(음의 크기) 막대를 마우스로 선택하여 입력음성의 크기를 조절할 수도 있다.

4. 오른 쪽 맨 위의 를 눌러 녹음조절과 멀티미디어 등록정보 창을 모두 닫는다.


웹페이지 음성 녹음하기

인터넷에는 영어학습자료 등을 포함하여 많은 음성들이 있는데 이것을 프라트에 저장하려면 다음과 같은 순서로 한다.

1. 인터넷의 음성파일을 클릭 하여 윈도우웨이브 파일로 불러오게 한다.


그림 3.25 인터넷 음성파일 받기


            


2. [시작-->설정-->오디오-->녹음조절] 부분에서 Stereo Mix체크박스를 선택하고 [확인]단추를 누른다.

3. [New-->record stereo(mono) sound...]를 택한 뒤 녹음 대화창이 열려졌을 때, Record단추를 눌러놓고

4. 열려진 윈도우용 웨이브 파일로 가서 play단추를 누른다.

5. 프라트로 돌아와 stop단추를 누른 뒤 이어서 play단추를 누르면 녹음이 되었음을 확인할 수 있다.

만약 두 대의 컴퓨터가 있다면 한 컴퓨터에 소리를 실행하고 컴퓨터 뒷면의 사운드카드의 헤드폰 잭을 꼽는 곳에 양쪽이 스테레오 잭으로 된 연결 장치의 한 쪽을 연결하고, 반대 쪽은 다른 컴퓨터의 라인 인에 꽂은 뒤 프라트에서 녹음할 수도 있다.

 

녹음기 음성 녹음하기

이미 녹음기에 분석할 음성을 녹음해 두었을 경우에는 그림과 같이 양쪽이 스테레오 신호를 받을 수 있는 선으로 된 전선을 이용한다. 이 때 한쪽은 녹음기의 헤드폰의 잭에 다른 쪽은 컴퓨터의 뒷면 음성카드 입력 구멍 가운데 Line이라는 곳에 끼워 넣는다. 다음으로는 앞서의 마이크녹음 설정 과정에서 3번을 다음과 같이 선택한다.


3. 각 장치들의 선택 사항을 보이는 그림에서 네 번째에 해당하는 라인 인의 맨 아래 선택 박스에 마우스로 클릭 하여 체크모양이 나타나도록 한다.


전선 연결은 양쪽이 스테레오 잭으로 되어 있는 장치를 사용하여, 일반 녹음 데크에서 컴퓨터로 입력할 때와 마찬가지로 헤드폰 잭으로 나오는 음성을 컴퓨터에 입력되도록 연결하면 된다. 일반 녹음용 마이크의 선이 짧다면 확장코드를 구하여 컴퓨터와 마이크의 거리를 멀리하면 컴퓨터 내부 환풍기의 소음을 피할 수도 있다.

이와 반대로 컴퓨터에서 녹음기로 보내려면 컴퓨터 사운드 카드의 헤드폰 잭에 연결하고 반대쪽은 녹음기의 AUX (보조입력장치 auxilliary)에 연결한 뒤 녹음을 시작하면 된다. 음성카드에 따라 다르지만, 마이크로 입력이 되지 않을 경우에는 마이크의 신호가 너무 작기 때문인 경우가 많다. 따라서, 별도의 음성 마이크를 사용할 수 있는 녹음기에 저장된 음성을 컴퓨터에 라인 인으로 연결하여 저장하는 것이 훨씬 깨끗하게 녹음할 수 있다. 또 다른 방법은 오디오 세트에서 앰프 부분만 따로 구입하여 마이크 신호를 크게 증폭시킨 뒤 컴퓨터에 입력하면 된다. 음성신호가 작으면 주위 잡음에 비해 상대적으로 낮아지기 때문에 분석과정에서 종종 오류가 생기기도 한다.


녹음용 마이크

녹음용 마이크는 컴퓨터 상가에서 2~3만원대의 음성 입력용 마이크를 구하면 된다. 사정이 여의치 않다면 보다 적은 비용으로 구입해도 된다. 10만원대의 음성용 마이크를 구입하면 컴퓨터에 입력되는 소리가 어느 정도 걸러지기 때문에 깨끗한 분석결과를 보여준다. 하지만 수백 만원대의 마이크를 구입한다고 해서 항상 깨끗한 음성이 입력되고 결과가 좋은 것은 아니다. 비싸고 좋은 마이크를 사용할수록 대체로 깨끗하고 선명한 입력 파형을 보이긴 하지만, 분석 결과에는 통계적으로 유의미한 큰 차이를 보이지 않는다. 오히려 녹음환경을 조용한 곳으로 하고 주위에 잡음을 내는 선풍기와 같은 전기기구를 모두 끈 상태에서 신호대 소음비가 높은 깨끗한 음성이 포착된다. 마이크 가운데 마이마이와 같이 휴대용 워크맨 등에 사용되는 다이내믹 마이크와 녹음기는 입력음의 크기에 따라 작은 소리면 증폭하고 큰 소리면 감폭시키는 자동 조절기능(Automatic Gain Control:AGC)이 설정되어 있어 주의해야한다. 이렇게 입력된 음성의 여러 지점에서 분석된 강도 값은 서로 비교할 수 없다. 그림 3.26의 파형은 동일한 음성을 세 가지 다른 마이크로 입력한 자료이다. 첫 번째 AKG마이크로 녹음한 음성의 진폭이 약간 낮기는 하지만, 깨끗하게 시작된 것을 실선으로 볼 수 있고, 이어서 2만원 하는 SONY음성용 마이크도 대체로 깨끗하며, MD녹음용 AIWA핀 마이크도 주위 잡음을 약간 포착하긴 하지만 대체로 깨끗한 음성을 보여준다. 물론 피치 값이나 포먼트 진폭 등의 측정 값에는 큰 차이가 없었다.


그림 3.26 마이크별 입력 음성 특성


     AKG마이크    SONY마이크      AIWA핀마이크


마이크를 손으로 들고 녹음하게 되면 손으로 만지는 소리도 전달이 되므로 가능하면 마이크를 옷핀으로 고정시키거나 거치대를 구입하여 고정시켜두는 것이 좋다. 또한 마이크에서 입술 사이의 거리는 약 15 cm전후로 하여 거친 파열부의 목소리가 강하게 입력되지 않도록 유의한다. 입력 감도는 주위 잡음이 함께 수집되지 않도록 적절히 조정한다. 아무런 발성을 하지 않고 녹음을 한 뒤, 객체창에 불러와 Modify-->Multiply에서 곱하는 값을 100배로 증폭을 시켜서 살펴보면 주위 잡음이나 마이크의 음향 특성을 쉽게 파악할 수 있다. 그림 3.27의 증폭된 신호와 스펙트로그램에서 보면 약 2500, 4000, 6000 Hz에서 인접한 전기장치에서 발생하는 소음이 띠 모양을 이루고 있음을 발견할 수 있다. 이러한 주위잡음은 포먼트 값을 구할 때는 유의해야한다.


그림 3.27 잡음의 확대



녹음환경

녹음하는 환경은 가능하면 조용한 사무실을 택한다. 너무 시끄러운 주위 잡음이 섞인 음파를 분석하게 되면 잡음을 음성신호로 처리하여 많은 오류가 발생한다. 특히, 처음 단계에서는 깨끗한 방음실에서 녹음된 음성을 분석하여 어느 정도 자음과 모음의 음향적 특징을 파악한 뒤에 소음이 섞인 음성을 분석하는 것이 좋다. 사무실 안의 컴퓨터나 선풍기, 에어콘 등의 모터 소리도 저음으로 입력되기 때문에 가능하면 마이크에서 먼 곳에 소리가 나는 물체를 옮기거나 꺼둔 채 녹음하는 것이 좋다.


3.6 음성 녹음의 실제


처음 음성을 녹음하려면 먼저 프라트를 두 번 클릭 하여 실행한 뒤 다음의 순서로 한다.

1. 기본 메뉴의 New를 선택한다.

2. 하부메뉴 Record mono Sound...를 클릭 한다. 만약 스테레오로 녹음하려면 Record stereo Sound...를 누르면 된다. 모노나 스테레오로 저장한 음성 파일의 분석 결과는 차이가 없기 때문에 하드디스크를 절약하기 위해서는 모노로 하기 바란다. 물론 청각 실험을 하기 위한 정현파음이나 스테레오 음성파일을 녹음기에 저장할 때는 스테레오로 해야 찌그러짐이나 변형이 없다.


그림 3.28 녹음기 대화창


   


3. 그림 3.28의 대화창에서 표본속도를 22050의 라디오 단추에 맞추고, 왼 쪽 아래에 있는 Record단추를 누른다.

4. 마이크를 향해 발성한다. 이 때 컴퓨터에 입력되는 음량의 크기를 나타내는 막대기(Meter)가 빨간색이 나타나지 않도록 마이크에 입을 너무 가까이 하지 않도록 주의하고 동시에 너무 작은 신호가 되지 않도록 크게 발음한다.

5. Stop 단추를 누른다.

6. Play 단추를 눌러 녹음한 발음이 적절한지 들어본다. 음성이 너무 작거나 커서 잡음이 날 경우에는 다시 3번부터 되풀이한다.


음성 파일로 저장하기

녹음기에 저장된 음성을 프라트를 이용해 컴퓨터에 저장하려면 다음 순서로 한다.

1. 음성을 모노로 녹음한다.

2. 그림 3.28의 대화창의 왼 쪽 위의 File메뉴에서 Write to AIFC file...을 누른다. 윈도우즈용 Wave파일로 저장하려면 두 번 째에 있는 Write to WAV file...을 선택한다. 워크스테이션에서 불러와 작업하려면 세 번 째에 있는 Write to NeXT/Sun file...으로 저장하면 된다.


그림 3.29 파일저장 대화창


      


만약 스테레오로 녹음했다면 대화창의 왼 쪽 위의 File메뉴에서 Write left channel to AIFC file...을 눌러 왼 쪽에 들어온 음성을 저장한다. 이어서, Write right channel to AIFC file...도 실행한다. 각 채널의 정보는 좌우측의 마이크에 별도의 입력장치를 사용하지 않았다면 동일한 분석결과를 나타내기 때문에 하나의 채널만 저장해도 된다. 두 채널을 사용하면 한 채널에는 음성신호를 받아들이고 다른 채널에는 라링고그라프(laryngograph)나 비음성을 측정하는 마이크에서 들어오는 신호를 동시에 녹음할 때 편리하다. 더 많은 채널의 자료를 저장하려면 여러 채널의 음성신호를 수집할 수 있는 소프트웨어를 구입해야하지만, 3채널이라면 오히려 두 대의 컴퓨터를 동시에 틀어놓고 기준이 될 수 있는 음성신호를 양쪽에 다 넣으면서 라링고그라프나 추가된 음성정보채널을 스테레오로 입력하면 된다.

4. 저장하고자 하는 폴더를 선택한 뒤, 빈칸에 파일이름을 입력하고 엔터 키를 친다.

5. 마지막으로 대화창의 Close버튼을 눌러 닫는다.


3.7 음성파일 편집


저장한 음성파일을 불러와 필요한 부분만을 다른 이름으로 저장하거나 필요없는 부분을 삭제하는 편집과정을 거치려면 다음과 같이 진행한다.


1. 객체창에 불러온 음성파일을 선택하고 오른 쪽 분석메뉴 단추가운데 play를 한번 클릭 하면 전체 음성을 들을 수 있다.

2. 저장된 음성의 부분만을 듣고 싶다면 음성 파일을 선택하고 객체창의 오른 쪽 분석 메뉴 단추가운데 Edit을 클릭한다.


그림 3.30 음성 편집창




그림 3.30의 불러온 편집창의 구성을 살펴보면 위에는 음성파형이 나타나고, 아래는 스펙트로그램, 포먼트, 피치, 강도 값이 그래프로 자동으로 추정되어 나타나있다. 편집창의 각각의 메뉴를 살펴보면 일정한 음성구간을 선택한 뒤 기본메뉴의 File메뉴를 눌러보면 그림 3.31과 같이 나타난다.


그림 3.31 편집창 File의 하위메뉴


     


Preferences는 음성파형을 확대하거나 축소시킬 때 다른 음성파일과 같이 움직일 것인지를 선택한다. 오른 쪽 아래의 Group부분을 클릭 하여 체크표시가 되어 있으면 동시에 움직이므로 포먼트 분석, 피치 분석, 강도 분석과 음성파형의 여러 가지 음성분석 결과창의 객체를 동시에 보면서 작업할 수 있다. 음성파형의 한 지점에서 마우스 왼 쪽 단추를 누른 채 끌고 가면 선택이 되는데, 그 선택된 부분만 따로 음성파일로 객체창에 올려서 작업하려면 선택된 상태에서 Extract selection메뉴를 선택하면 된다. 그 부분만을 하드디스크에 저장하려면 Write selection to AIFC file...을 선택하면 된다. 나머지에 나타나 있는 New Script는 음성파형에서 필요한 정보를 찾을 때 스크립트로 자동 실행하여 볼 때 사용하면 된다.

Edit메뉴를 누르면 그림 3.32와 같은 하위메뉴가 나타난다.


그림 3.32 편집창 Edit의 하위메뉴


     


첫 번 째 Cannot undo는 아무런 동작을 하지 않았기 때문에 이렇게 나타난다. 만일 다음에 나오는 Cut메뉴를 사용하여 일부 음성을 끊었을 때는 Cut undo로 나타난다. 즉, 어떤 작업을 실행한 뒤 이를 바로 취소할 때 이 메뉴를 사용하면 된다. 음성파형의 일부구간을 선택한 뒤 Copy selection to Sound clipboard를 누르면 컴퓨터 임시메모리 공간에 저장되어 있다가 다른 편집창에 불러온 음성에 Paste after selection메뉴를 선택하여 붙여넣을 수 있다. 다음에 나오는 Set selection to zero메뉴는 선택된 부분의 진폭 값을 전부 0으로 하여 묵음구간으로 만들 때 사용한다. Reverse selection을 선택하면 음성파형의 값이 -인 것들은 +로 +는 -값으로 바뀌어 지게 된다. 라링고그라프의 +/-전극이 바뀌어져 있을 때, 이 기능을 이용하면 편리하다.

Query메뉴를 선택하면 그림 3.33과 같은 하위메뉴가 나타난다.


그림 3.33 편집창 Query의 하위메뉴


       


각각의 메뉴를 설명하면 첫 번째 메뉴 그룹에서는 먼저 음성의 시작부분은 Get begin of selection을 선택하면 되고, Get cursor를 누르면 현재 커서가 위치한 곳의 시간 값을 나타내준다. 음성파형이나 스펙트로그램에서 이 기능을 사용하여 원하는 위치의 정확한 시간 값을 정보창에 나타내어 이것을 마우스로 선택하여 복사한 뒤 스펙트럼 조각을 구하는 대화창에 붙여넣기를 실행할 수 있다. Get end of selection은 끝 부분의 시간 값을 보여준다. 두 번째의 메뉴 그룹에서는 주파수(frequency), 피치(pitch), 지정한 영역의 최소 피치 값(minimum pitch), 최대 피치 값(maximum pitch), 음의 강도(intensity) 등을 구할 수 있다. 세 번째 메뉴 그룹에서는 Formant report를 선택하면 아래와 같이 커서로 지정한 지점의 포먼트 값을 차례로 정보창에 나타내어준다. 여기서는 편의상 소숫점 이하 세자리 까지만 반올림하여 나타내었다.



Time         F1           F2           F3          F4

1.587      785.559     1412.824     3439.638    4342.579



그 다음에 나오는 제1포먼트(first formant)와 제1포먼트의 강도를 나타내는 대역폭(bandwidth)을 정보창에 하나씩 차례로 나타낼 때 사용한다.

네 번째 메뉴 그룹에서 Log settings를 선택하면 그림 3.34와 같은 대화창이 나타난다. 그림 3.34에 나타나있는 대화창의 Log file 1은 자동으로 지정된 경로의 지정된 이름의 파일(Pitch Log.txt)로 저장되며, 나타내는 방식은 Log 1 format에서 지정한다. 이 그림의 Log 1 format에서는 시간점을 소숫점 이하 6자리까지 나타내고('time:6') 피치는 두 자리까지 나타내도록('f0:2') 되어 있다. 실제 음성분석에서 소숫점 이하 세 자리까지만 하는 것이 보기에도 좋고 청각적으로도 유효한 범위이므로 설정을 'time:3', ‘f0:0'으로 바꾸어 사용하는 것이 좋겠다. 두 번째 Log file의 이름은 Formant Log.txt로 저장하고, 마우스가 있는 지점의 시간 값과 포먼트 값을 차례로 나타내게 되어 있다. 마우스와 키보드의 동작들을 하나씩 기록하고 있는 Log script는 각각 Log script 3.praat과Log script 4.praat에 저장된다. 이렇게 기록된 자료를 이용하면 음성분석 결과를 통합하는데 매우 편리하다. 이미 저장된 내용을 지우려면 앞의 그림에 나타나 있는 Delete log file을 선택하면 된다.


그림 3.34 자동 분석 기록 설정




다음에 나오는 View메뉴에는 그림 3.35와 같은 하위메뉴들이 있다. Sound autoscaling은 음성파형을 그림으로 나타낼 때 자동으로 최대 값과 최소 값을 중심으로 적절히 그림으로 나타내어 준다. 이 기능을 켜둔 채  진폭이 낮은 음성파형의 일부만 선택하여 확대하면 자동으로 진폭 값의 y축이 확대된다. 만약 자동 기능을 끄면 전체의 파형에서 일부를 확대하거나 축소하더라도 동일한 모양을 보여준다. 상대적인 진폭의 차이를 보면서 분석할 때는 이것을 끈 상태에서 작업하는 것이 좋다.


그림 3.35 편집창 View의 하위메뉴


       

 

Show analyses... 메뉴를 실행하면 그림 3.36과 같이 대화창이 나타나는데 네모박스에 체크표시가 되어 있으면 음성파형 아래 창에 스펙트로그램(spectrogram), 피치(pitch), 강도(intensity), 포먼트(formant) 등 선택된 분석 결과가 그래프로 나타난다.



그림 3.36 편집창의 Show analyses 대화창


각각의 분석 파라미터를 수정하기 위해서는 그 아래에 따라오는 settings를 바꾸면 된다. 스펙트로그램을 변경하기 위해 Spectrogram settings를 선택하면 그림 3.37과 같은 대화창이 나온다.


그림 3.37 스펙트로그램 설정 대화창



이 대화창의 맨 처음에 있는 네모 박스에 체크표시를 하면 음성파형 밑에 스펙트로그램이 나타난다. 시간간격(Time steps)은 얼마나 촘촘하게 스펙트로그램을 그리는 가를 나타내며 숫자가 클수록 시간축 해상도가 높은 스펙트로그램이 된다. Frequency steps는 주파수의 간격을 지정하는데, 이 값이 높을수록 주파수축이 세밀한 그림이 된다. 그림으로 나타내는 범위를 나타내는 View range에서 주파수를 나타내는 y축의 최소 값과 최대 값을 지정할 수 있다. 분석방법(Method)에는 여러 가지가 있는데 그 가운데 Fourier를 선택하면 되고 선택 방식에 따라 큰 차이라기보다는 미세한 차이를 보여준다. 창문길이(Window length)는 0.029이면 45 Hz간격의 좁은대역(narrow-band) 분석이 되고, 0.007이면 150 Hz의 넓은대역(wide-band)이 된다. 여성이나 아이인 경우에는 0.005 전후 값을 입력해야 포먼트가 덩어리져 보인다. 여성의 발음을 0.007로 하면 포먼트 보다는 좁은대역의 분석과 같은 배음구조가 나타나 어느 곳을 포먼트 정점으로 판단해야할지 어려움이 있다. 창문모양(Window shape)은 다양한 창이 있으나 보통 Gaussian으로 지정하면 된다. 스펙트로그램의 농도를 높이려면 Dynamic range의 값을 50 이상으로 하면되고, 농도를 옅게 하여 포먼트 구조와 음성부분을 쉽게 보려면 20이나 30을 넣어야 한다. Pre-emphasis는 스펙트럼 정보에서 고주파 영역을 확대하는데 사용하며 보통 6을 그대로 두면 되고 고주파 부분의 강도가 약하면 이 값을 12와 같이 올려본다. Dynamic compression은 1을 주면 모든 시간점의 스펙트럼 프레임을 같은 크기로 그려주며 0.4를 주면 모든 스펙트럼의 진폭 값의 최대 값이 80 dB라면 그보다 낮은 20 dB의 스펙트럼은 이 값이 0일 때 흰색으로 전혀 표시가 나지 않겠지만, 이것을 0.4*(80-20)=24 dB를 더하여 44 dB로 그려 준다.

다음으로는 피치설정에 대해 알아본다. 앞 메뉴의 Pitch settings를 선택하면 그림 3.38과 같은 대화창이 나온다.


그림 3.38 피치 설정


피치설정에서도 Time steps 값을 높일수록 단위시간 안에 더 많은 피치 값을 구해준다. 이 값을 너무 높게 주면 피치 값을 계산하는 동안 컴퓨터가 잠시 중단하고 편집창에 피치궤적을 그려주기 때문에 시간이 걸린다. 보통 성대의 진동은 짧은 시간동안 급격히 변하지는 않고 완만하게 바뀌기 때문에 가능하면 기본 값(100)을 그대로 두는 것이 좋다. View range는 최소 값과 최대 값을 지정하면 그 범위 내에서 확대하여 나타내어준다. 단위는 Hz와 Hertz logarithmic과 Semitone, Mel, Erb 등이 있는데 이것들은 청각척도로 표현하는 방식이다. 구체적인 변환 공식은 기본메뉴 가운데 하나인 Help에 해당 용어를 입력하면 공식을 볼 수 있다. 주파수 값을 청각척도로 자동 변환하기 위한 스크립트 함수도 Help-->Numerical expressions에 hertzToBark, hertzToMel, hertzToErb, barkToHertz, melToHertz, erbToHertz와 같이 내장함수로 지정되어 있으므로 사용하기 바란다. Speckle박스에 체크하면 연속된 선이 아닌 점으로 나타내어 준다. 분석범위(Analysis range)는 이 값을 지정한 범위 안에 해당하는 피치 값만 처리하여 화면에 나타내어 준다. 편집창의 피치분석방법(Method)에는 두 가지가 있는데, 흔히 자기상관계수에 의한 Autocorrelation 방법을 사용한다. 객체창의 분석 단추에는 더 많은 처리과정이 있으므로 참고하기 바란다. 다음에 있는 아주 정확하게(Very accurate) 박스에 체크하면 그 아래에 나오는 여러 가지 숫자 값을 반영하여 피치 값의 유효성을 점검한 뒤 걸러서 나타내어 준다. 구체적인 내용은 피치 값 분석설명에서 논의하기로 하고 만약 피치 값의 시작 부분과 끝 부분에 갑작스럽게 변하는 부분을 줄이려면 유성문턱 값(Voicing threshold)을 기본 값인 0.45에서 0.7정도로 바꾸어 보기 바란다.

  음성의 강도를 나타내는 Intensity settings를 선택하면 그림 3.39와 같은 대화창이 나온다.


그림 3.39 강도 설정 대화창



Time steps를 크게 하면 시간축에 매우 촘촘하게 그려주고, 작게 하면 듬성듬성하게 값을 표시해준다. 보기범위(View range)의 값을 0~~~, 120으로 하면 강도의 변화를 쉽게 파악하기 힘들다. 조금 더 확대해 보려면 이 간격을 좁혀주면 된다.

다음의 포먼트 보기 설정(Formant settings)을 선택하면 그림 3.40과 같은 파라미터 설정창이 나타난다.


그림 3.40 포먼트 설정 대화창


포먼트 측정항목에서 더 상세히 설명하겠지만 우선, 시간간격(Time steps)은 얼마나 자주 포먼트 값을 화면에 표시하는가를 나타낸다. 최대지속시간(Maximum duration)은 음성파형에서 최대한 연속된 포먼트의 길이를 지정하는 것이다. 일반적으로 성대의 진동이 있는 유성음에서 포먼트 값이 유효한데, 사람의 발성은 보통 2초 이상 연속해서 성대가 진동되지 않으므로 이 값을 주면 부자연스런 포먼트 값을 걸러낸다. Dot size는 점으로 표시할 때 몇 mm의 크기로 나타낼 것인지를 설정하고, Dynamic range는 몇 데시벨 범위의 값에서 포먼트를 표시할 것인지를 지정한다. Number of poles는 몇 개의 포먼트 차수를 지정하여 분석할지를 나타내는데 이 값을 높게 입력하면 너무 많은 포먼트를 찾아주고, 이 값이 낮으면 모음 ‘오’나 ‘우’와 같이 두 개의 포먼트가 서로 가까이 접근한 경우에 한 개의 포먼트만 구해주는 오류를 보인다. 또한 피치 값이 높은 여성이나 어린이 화자의 경우에는 14차나 15차의 값을 주어야 정확한 포먼트 값을 나타내어 준다. 차수지정은 자기상관계수의 차수를 말하며 예상 포먼트 수마다 2개씩 할당하고 추가로 2, 3을 더해준다. 일반적으로 표본추출속도 주파수의 반에 해당하는 유효주파수 범위 내에서 1 kHz당 남성일 경우에는 2개의 포먼트가 나타나고 여성일 경우에는 1개씩이 나타난다. 11025 Hz의 표본속도일 때는 5 kHz가 유효범위가 되고 5*2=10이 되고 여기에 2-3을 더한 12, 13차수가 적절하다. 물론 모음에 따라 총 포먼트 갯수가 조금씩 달라질 수 있으므로 믿을 만한 기존의 연구논문에 나타난 포먼트 값을 참고할 필요가 있다. 분석의 최대 포먼트 값(Maximum formant)에 어떤 값을 지정하느냐에 따라 그 범위 안에서 지정한 차수의 포먼트를 분리하여 준다. 예를 들어, 원순모음 ‘오’나 ‘우’의 제 1, 2 포먼트가 하나로 뭉쳐져 하나로만 나타날 때는 1000 Hz를 최대로 하고 그 범위 안에서 두 개의 포먼트를 찾아야 하므로 차수 값을 4 또는 5로 지정하면 두 개의 포먼트 띠를 정확히 구할 수 있다.

창문의 크기는 25 밀리초가 보통 기본 값으로 정해져 있고, 이 시간 간격의 음성파형의 값을 처리하여 포먼트를 구해준다. 그 값보다 크면 포먼트 값이 듬성듬성하게 나타나고 그 보다 적으면 시간축마다 매우 촘촘하게 분석한 결과로 나타난다. 고주파대역강조(Pre-emphasis from)는 시작 주파수를 입력하면 된다. 50 Hz가 기본으로 설정되어 있는데 이 값을 높이면 그 지점부터 배음에 해당하는 주파수의 진폭 값이 빈칸에 입력한 만큼의 숫자 값이 더해져서 나타나게 되고, 그 값을 근거로 포먼트 측정이 된다. 고주파 부분의 진폭이 약할 경우에는 이 기능을 되풀이하면 정확한 포먼트를 찾는데 도움이 된다. 편집창에서의 측정방식은 Burg로 정해져 있는데 객체창의 분석단추에는 Sl방식과 LPC선형예측계수를 이용한 방식으로 더 정밀하게 측정할 수 있다.


그림 3.41 편집창 보기 메뉴

   


View 메뉴 아래의 두 번째 메뉴 그룹은 그림 3.41에서처럼 시간축 상에서 파형을 확대(Zoom in), 축소(Zoom out), 선택한 부분 확대(Zoom to selection), 화면에 나타난 창을 뒤로 이동하게 하거나 앞으로 이동하게 할 수 있다.


그림 3.42 편집창 재생 메뉴

   


세 번 째 메뉴 그룹은 그림 3.42와 같이 음성을 재생하는데 사용할 수 있다. 실제로는 메뉴에서 재생하기보다는 마우스로 편집창에서 음성파형의 일부를 선택하여 재생 막대 모양이 분할이 되면 그 부분을 눌러서 들어보면 된다. 물론 선택한 부분만을 들어보려면 Tab키를 누르거나 전체의 음성을 들을 때는 Shift-Tab을 동시에 눌러주는 기능키를 이용하면 더 빠르고 쉽게 재생할 수 있다. Esc키는 재생중인 음성을 중단시키는 기능인데 객체창 메뉴의 Control-->Preferences-->Sound output pref...에서 Interruptable의 라디오 단추가 선택되어 있어야 작동한다.

편집창의 마지막 메뉴인 Select를 선택하면 그림 3.43과 같은 하위 메뉴가 나타난다.


그림 3.43 편집창 선택 메뉴


첫 번 째 메뉴 그룹은 커서의 위치를 시간 값을 주어 Move cursor to... 정밀하게 이동하거나 커서 위치에서 일정한 시간 거리를 두고 다음 지점을 찾는 Move cursor by... 메뉴를 보여주고 있다. 음성 분석을 할 때 일정한 시간점을 선택할 때 매우 편리하다. 두 번 째 메뉴 그룹은 마우스로 선택한 부분의 처음 또는 마우스 위치, 끝 부분에 가장 가까운 영점교차지점을 찾아내어 준다. 이 기능은 음성을 영점교차지점을 경계로 잘라서 저장하거나 분석할 때 도움이 된다. 마지막 메뉴 그룹은 커서를 피치 값을 기준으로 최소 값, 최대 값 지점으로 이동하게 한다.

마지막으로 음성편집 창의 왼 쪽 아래에 있는 all단추는 모든 소리를 들을 때 사용하고, in은 파형 확대, out는 파형 축소의 기능을 가지고 있으며, sel은 마우스로 선택한 부분만을 편집창에 보일 때 사용한다. 오른 쪽 위에 있는 네모박스를 클릭 하면 편집창이 닫힌다.


3.8 음성 파일 편집의 실제


한번 녹음한 긴 음성의 일부를 잘라서 들어보고 별도의 이름을 붙여 저장할 때는 편집 기능을 최대한 활용하는 것이 좋다. 동시에 필요 없는 부분을 삭제하거나 붙여넣기를 하는 방법도 깨끗한 음성파일을 만드는데 도움이 된다.


저장한 음성파일 불러오기


컴퓨터에 저장한 파일을 불러오려면

1. 기본메뉴의 하나인 Read메뉴에서 Read from file을 실행한다.

2. 불러온 파일의 파형을 보려면 객체 창에서 그 음성을 선택한 상태에서 오른 쪽에 나타난 여러 개의 분석메뉴 단추가운데 Edit단추를 누르면 된다.


저장된 음성의 일부를 잘라서 저장하기


연속된 긴 문장으로 녹음된 자료를 컴퓨터에 입력했거나 여러 개의 발성을 한꺼번에 하나의 파일로 저장해 두었다면, 프라트 편집창에서 열어서 필요한 부분들을 이름을 붙여 저장할 수 있다. 물론 그림으로 분석 결과를 논문으로 붙여야할 때는 이렇게 짧은 시간 발성된 부분을 분석하여 나타냄으로써 보다 정확한 결과를 나타낼 수 있다.

1. 앞서 저장한 음성파일을 들어보기에서 해당 부분을 마우스로 클릭 하여 시작부분을 선택한 뒤 마우스를 누른 채로 끌고 가면 선택이 된다. 끝 부분에 해당하는 곳에서 마우스를 놓으면 일정한 영역이 선택된다.

2. 해당부분의 음성을 편집창 아래 막대를 클릭 하여 들어본 뒤, 쉬프트 키를 누르며 일부를 더 첨가하거나 줄인 뒤 다시 들어본다.

3. 편집창의 File메뉴에서 Write selection to AIFC file...을 클릭 하면 저장대화상자가 나타난다. 저장할 파일의 양쪽에 50 ms의 묵음을 넣으려면 바로 아래 메뉴인 Write selection to AIFC file with 50 ms margins...를 실행하면 된다. 가능하면 음성파일 전체를 다 분석하기보다는 관심이 있는 부분만 따로 저장하여 나타내는 것이 보다 더 정밀한 분석을 하는데 도움이 되고 아울러, 그림으로 인쇄하기가 편리하다.

4. 저장하고자 하는 폴더를 선택한 뒤, 빈칸에 파일이름을 입력하고 엔터 키를 친다.

5. 마지막으로 대화창의 Close버튼을 눌러 닫는다.


한 파일의 일부를 복사하여 다른 파일 창에 붙여 넣기


1. Read 메뉴에서 두 개 이상의 음성을 불러온다.

2. 객체창의 분석메뉴가운데 Edit단추를 눌러서 하나씩 차례로 파일을 연다.

3. 각각 열려진 창에서 필요한 음성을 마우스로 선택하여 Edit메뉴의 Cut을 선택하면 잘라지고 옮기고자 하는 다른 음성창의 부분에 Edit메뉴의 Paste after selection을 선택한다.

4. 이 때 각 음성은 같은 표본추출속도로 저장되어 있어야한다. 만일 다른 표본추출속도일 때는 서로 다른 표본추출속도의 파일을 붙일 수 없다는 메시지가 나온다. 서로 다른 표본추출속도를 같이 만들려면 해당음성을 선택하여 프라트 객체창의 분석단추가운데 Convert-->Resample...을 선택하고 대화창에서 동일한 표본추출속도를 지정하면 서로 복사하여 붙일 수 있게된다.


한 개의 파일에 대한 피치와 스펙트로그램 동시 비교하기


그림 3.44와 같이 한 개의 파일에 대해 두 가지 분석한 결과를 겹쳐 보이게 하려면 다음과 같이 실행하면 된다.


1. 음성파일을 하드디스크에서 불러온다.

2. 여러 개의 파일을 동시에 선택하여 분석하려면 첫 번 째 음성파일을 선택한 뒤 쉬프트 키를 누른 채 마지막 선택할 파일을 클릭 하면 그 사이에 있는 모든 파일이 동시에 선택된다.

3. 분석메뉴 가운데 Periodicity-->To Pitch...단추를 누른다.

4. 피치 분석된 객체창의 파일을 마우스로 선택한 뒤 객체창의 Edit단추를 눌러 연다.

5. 또 다시 첫 번 째 음성파일을 선택한 뒤 쉬프트 키를 누른 채 마지막 선택할 파일을 클릭 하여 그 사이에 있는 모든 파일을 동시에 선택한다.

6. 분석메뉴 가운데 Spectrum-->To Spectrogram...단추를 누른다.

7. 분석된 스펙트로그램 객체 파일을 마우스로 선택한 뒤 객체창의 View단추를 눌러 연다.

8. 각각의 창문의 오른 쪽 아래에 있는 Group을 체크 표시하면 피치분석이나 스펙트로그램 분석한 결과객체에서 동일한 시간점에서의 값을 구할 때 편리하다.

그림 3.44 스펙트로그램과 피치를 동시에 작업하는 그림


그림 3.45 두 개의 피치 분석 파일을 비교하기




두 개 이상의 파일을 동시에 분석하여 비교하기


그림 3.45와 같이 두 개 이상의 파일에 대한 피치 값을 동시에 분석하여 비교하려면 다음과 같은 순서로 처리한다.


1. 두 개 이상의 음성파일을 하드디스크에서 불러온다.

2. 객체창에 올려진 음성파일을 쉬프트 키를 누른 채 마우스로 선택한다.

3. 분석메뉴 가운데 Periodicity-->To Pitch...단추를 누른다.

4. 피치 분석된 파일을 차례로 마우스로 선택한 뒤 객체창의 Edit단추를 눌러 하나씩 연다.

5. 각각의 창문의 오른 쪽 아래에 있는 Group을 체크 표시를 해제하면 피치분석이나 스펙트로그램 분석한 결과를 Edit로 선택한 창들과 별도로 확대 또는 축소되기 때문에 각각의 피치 값을 비교할 때 도움이 된다.


객체창에서 음성파일의 이름 바꾸기


1. 객체창에 불러온 음성파일의 이름을 바꾸려면 객체창의 왼 쪽 아래에 있는 Rename단추를 눌러 원하는 이름을 입력하면 된다.

2. 객체창에 불러온 음성파일의 표본속도나 전체 지속시간, 또는 분석한 피치 값 객체의 최대 값 최소 값 분포, 분석한 포먼트 객체의 프레임 수와 각각의 시간 간격 등을 알려면 객체창의 왼 쪽 아래에 있는 Info단추를 누르면 정보창에 내용이 나타난다.

3. 객체창에 불러온 음성을 하나 선택한 뒤 객체창의 왼 쪽 아래에 있는 Copy...단추를 누르면 동일한 음성파일을 복제하여 다른 이름으로 객체창에 올려준다. 이 기능은 객체창의 분석단추인 Modify를 눌러 원래의 음성파일 자체의 값들을 변화시키는 작업을 한 뒤 또 다시 원래의 파일을 불러오지 않고 객체창에 올려져 있는 원래 파일을 참고하거나 다른 분석을 할 때 편리하다.

4. 객체창의 왼 쪽 아래에 있는 Remove 단추는 더 이상 분석할 필요가 없는 파일을 객체창에서 제거할 때 사용한다. 일반적으로 프라트에 할당된 컴퓨터 메모리나 불러올 파일의 크기에 따라 불러올 수 있는 파일의 수가 정해진다. 따라서 분석작업을 수행하고 난 뒤 객체창에서 제거하는 것이 메모리 확보와 더 많은 작업을 하는데 도움이 된다.

5. 객체창에 불러온 음성을 하나 선택한 뒤 객체창의 왼 쪽 아래에 있는 Inspect 단추를 누르면 그림과 같이 음성에 대한 개별 정보가 나타난다. 이 대화창의 각각은 음성에 대한 기본적인 정보를 보여준다. 2번에 제시된 정보창의 결과와 비교해 보면 xmax는 시간 값의 끝점을 나타내고, nx는 표본 수, dx는 표본간의 시간 간격을 x1은 첫번째 표본의 시간점을 보여준다. ymin, ymax는 음성파일을 매트릭스로 나타낼 때 열과 행의 시작 값을 말하고 ny는 총 열의 수, dy는 열 사이의 차이 값, y1은 첫번째 줄과 열의 초기 값을 보여준다. 그 아래에 있는 Open 단추를 누르면 각 열과 행에 해당하는 셀(cell)의 진폭 값을 구체적으로 보여준다. 이 때 z[3][9]는 3번째 줄의 9번째 열의 값을 나타낸다. 이 값들을 편집창에서 직접 바꾸려면 왼 쪽 위에 있는 Change 단추를 눌러 변형할 수 있고, 이렇게 수작업으로 하나씩 바꾸지 않고 자동으로 변환하기 위해서는 프라트 객체창에서 Modify단추를 눌러 해당 열과 행을 지정하여 바꾸는 스크립트를 만들어서 셀 값을 차례로 되풀이하여 불러온 뒤 변환할 수 있다.


음성파일이나 분석결과를 그림으로 나타내기


프라트 그림창에 음성파일을 그림으로 나타내려면 다음 순서로 실행한다.


1. 프라트 객체창에 나타낼 음성 분석 결과 객체를 선택한다.

2. 프라트 그림창을 선택하고 그림을 나타낼 시작 지점에 마우스의 왼 쪽 단추를 누른 채 끌고 가서 오른 쪽 모서리를 선택한다.

3. 객체창의 네 번 째 분석메뉴인 Draw-를 선택한다.

4. 대화상자에 그림 범위를 지정하는 값들을 입력한다.

5. 그림창에 분석결과가 나타난다.


제 4 장 피치 분석


4.1 피치분석 설정


  사람의 목소리의 높이는 음향적으로는 f0 값으로 나타낸다. 보통 청각적으로 느끼는 음의 높이를 염두에 두고 피치가 높다 낮다라고 표현하기도 한다. f0는 기본주파수(fundamental frequency)라고 부르기도 하는데 말하는 사람의 감정과 정서의 변화에 따라 달라진다. 피치 값은 성대의 진동이 1초에 몇 번 있는가를 나타내는 것으로 성대의 크기와 길이, 질량 등에 영향을 받는다. 성대의 크기가 클수록 진동하는 속도가 느리기 때문에 여성보다 상대적으로 큰 성대를 가진 남성의 피치 값은 약 120 Hz가 된다. 여성은 평균 약 230 Hz로 진동하며 어린아이는 300 Hz전후로 매우 높다. 피치분석 알고리즘은 여러 가지가 나와 있으나 아직까지 소음이 섞인 음성이나 자음부분에 대한 측정상의 오류가 많이 나기 때문에 구한 값을 해석할 때 매우 주의해야 한다. 특히, 성대 진동의 변화는 신체구조 상 서서히 변하는 데 비해, 음성분석은 지정한 크기의 창안에 있는 자료를‥ 앞뒤와는 별개로 분석하여 급작스럽게 변하는 오류 값을 나타내는 경우가 많기 때문에 주의해야한다.

 피치를 분석하는 방법은 File의 Read from file...메뉴를 선택하여 분석하고자 하는 파일을 불러낸다. 이어서 객체창에서 음성을 선택하고 오른 쪽 분석 단추 가운데 Periodicity 단추를 누르면 다양한 피치 분석 방법을 그림 4.1과 같이 볼 수 있다. 각각의 메뉴를 이용하여 정확한 피치측정을 위한 다양한 실험을 직접 해볼 수 있다.


그림 4.1 객체창의 피치분석 하위메뉴

         


각각의 분석방식에 대한 구체적인 방법을 살펴보면, 맨 처음의 To Pitch...를 선택하면 그림 4.2와 같이 분석에 필요한 파라미터 값을 지정하는 대화창이 나타난다.


그림 4.2 피치분석 파라미터 설정 대화창



이 창에서 Time step은 몇 초 간격으로 필요한 피치 값을 구할 것인가를 지정한다. 이 간격이 좁아질수록 더 많은 피치 값을 구할 수 있고 세부적인 변화를 포착할 수 있다. 이 때 분석할 양이 많아질수록 처리 속도는 그만큼 오래 걸리게 된다. 그러나 너무 긴 간격마다 측정하면 처리속도는 빠르지만, 피치 값의 변화를 제대로 포착하지 못하게 되므로 주의해야한다. 기본 값은 0.01초로 되어 있는데 시간 축에서 10 밀리초마다 하나의 피치 값을 구하여 나타내어 준다. 보통 5 밀리초마다 분석을 하면 되는데, 모음 구간에서는 피치변화가 그렇게 크지 않기 때문에 이 간격을 조금 더 넓혀도 분석 결과에는 크게 영향을 미치지 않는다. 음성합성에 사용할 때는 약 5 밀리초마다 측정하여 사용하면 자연스럽게 된다. 다음의 Minimum pitch(Hz)는 피치 값으로 허용해줄 범위 가운데 최소 값을 지정하는 것이 되고 Maximum pitch(Hz)는 최대 값을 지정하여 이 범위 밖에 있는 값들은 피치 값으로 받아들이지 않게 된다. 기본 값으로는 75~~~-600 Hz로 지정되어 있는데 여성화자나 어린이의 발음을 분석할 때는 최대 값을 더 높여야 한다. 일반적으로 성인 남자의 피치 값은 120 Hz 전후이고, 성인 여자의 피치 값은 230 Hz, 어린아이는 300 Hz가 넘기 때문에 이들 범위의 값들이 들어가도록 하고 분석하는 사람의 평균 값이 y축의 중심에 위치하도록 지정하면 좋다. 그러나 감정의 변화가 많은 연극 대사와 같은 경우에는 이들 범위의 두 배 이상을 오르내리기 때문에 범위를 지정할 때는 매우 주의해야 한다.

To Pitch(ac)...는 자기상관법(autocorrelation method)을 이용하여 피치분석을 하는 방식인데 구해진 피치 값을 한번 더 걸러서 오류를 없애주는 기능이 덧붙여져 있다. 파라미터 설정 대화창은 그림 4.3과 같다.



그림 4.3 자기상관법 파라미터 설정 대화창


이것은 음성이 아닌 다양한 피치의 소리를 분석할 때 분석 파라미터를 보다 정밀하게 지정하여 결과를 얻는 방식이다. 이 방식에 대한 구체적인 설명은 Boersma(1993)의 논문에 상세히 제시되어 있다. 그의 논문에 따르면 이 방법은 기존의 자기상관법이나 켑스트럼(Cepstrum: 스펙트럼을 다시 파형으로 간주하여 한번 더 FFT를 실시한 것) 방식보다 정확하고 소음에 영향을 덜 받는다고 한다.

 대화창에는 여러 가지 파라미터의 값을 지정해 주어야 한다. 후보찾기(Finding the candidates) 항목으로는 분석시간 간격(Time step), 최소피치 값(Minimum pitch), 최대 피치후보 값 수(Max. number of candidates)를 지정할 수 있다. 먼저 Time step은 음성파형의 시간축에서 얼마의 간격으로 분석 값을 구해내는지를 지정한다. 최소 피치 값(Minimum pitch)을 지정하면 그 값 이하는 피치로 인정하지 않는다. 병적인 성대를 가진 사람들의 피치 값은 75 Hz보다 낮은 경우도 있기 때문에 이 값을 50이나 그 이하로 조정할 필요가 있다. 최대 후보 값수는 15로 기본 값이 주어져 있는데 이 값으로 몇 개까지를 피치 값의 후보로 인정할 지를 정한다. 그 다음에 있는 정확도(Very accurate) 박스에 체크표시가 되면, (6/최소 피치 값)의 길이에 해당하는 가우시안(Gaussian)창을 사용하고, 빈칸으로 두면 (3/최소 피치 값)의 길이에 해당하는 해닝(Hanning)창을 사용하여 분석해준다. 후보 값 가운데 최적의 값을 찾기 위한 경로찾기(Finding a path) 항목으로는 분석하고자 하는 음성 전체에서 최대 진폭 값의 3%에 해당하는 값 이하는 묵음으로 처리하는 묵음문턱 값(Silence threshold)으로 처리하거나, 최대 자기상관계수 값에 비하여 무성후보 값의 강도를 지정하는 유성문턱 값(Voicing threshold)이 있는데, 소음으로 인한 피치 값의 오류가 많을 때 기본 값인 0.45를 0.7이나 0.8로 해보면 모음의 시작과 끝 부분의 피치 오류 값들이 걸러지게 된다. 이어서 자기상관처리후 보다 높은 주파수를 더 선호하도록 처리하는 옥타브비용(Octave cost)이 있는데, 이 값을 높일수록 보다 높은 주파수 값이 선택된다. 최대 자기상관계수 값에 비하여 피치의 변화가 적은 쪽으로 가도록 하는 옥타브도약비용(octave-jump cost)은 값이 높을수록 갑작스런 피치변화를 줄여준다. 유무성비용(Voiced/unvoiced cost)은 최대 자기상관계수 값에 비하여 유성에서 무성으로 또는 그 반대로 변해갈 때 갑작스럽게 변하지 않도록 해준다. 이 값이 높을수록 유무성의 변화가 서서히 나타나도록 값을 걸러준다. 마지막으로 Maximum pitch(Hz)는 최대 값을 지정하여 이 범위 보다 높은 값들은 피치 값으로 나타내지 않는다.

To Pitch(cc)...는 전진상호상관계수분석(forward cross-correlation)에 의해 주기성을 분석한다. 파라미터 설정 대화창은 앞의 To Pitch(ac)...와 동일하다.

To Pitch(shs)...는 Hermes(1988)의 스펙트럼압축 모델(spectral compression model)에 근거를 두고 분석한다. 스펙트럼 분석을 할 때 피치 값의 정수배에 해당하는 배음의 진폭이 높다는 점을 이용하여, 임의의 주파수 값의 정수배에 해당하는 주파수의 진폭 값을 차례로 더하여 최대 값이 되는 배열의 초기 값을 피치 값으로 지정한다. 파라미터 설정 대화창은 To Pitch...에 첨가하여 피치가 되는 최대 배음 개수(Max. number of subharmonics), 연속적으로 압축한 스펙트럼을 곱하는 압축계수(Compression factor), 옥타브 당 포인트 수(Number of points per octave) 지정 등이 있다.

To harmonicity(ac)...는 단기간에 걸친 배음 대 소음비율(HNR:Harmonics to noise ratio)을 구해준다. 파라미터 설정대화창에서 분석구간 간격, 최소 피치 값, 묵음 문턱 값 등을 지정하도록 되어 있고, 창문당 주기수(Number of periods per window)는 음성에는 4.5를 지정해두고 있으며 개발자에 따르면 37 dB이상의 값을 모두 탐지한다. 또한 주기수가 6개가되면 60 dB이상의 값들을 정확히 처리하지만 신호내의 동적인 변화에 매우 민감하다. 이것보다는 To harmonicity(cc)를 사용하면 시간해상도가 더 높게 나타난다고 한다. HNR을 구하면 음성에 소음이 섞여있는 정도를 파악할 수 있다. 예를 들어, 분석하고자 하는 음성에서 주기적인 음성부분이 99이고 소음에 해당하는 부분이 1이라면 HNR은 10*Log10(99/1)=20 dB가 된다. 반면에 소음과 음성이 동일한 값이 되면 HNR은 0이 된다. 주기적인 음성부분이 100000이고 소음이 1이라면 50 dB가 된다. 건강한 사람이 발성한 ‘아’ 또는 ‘이’발음의 HNR은 약 20 dB이고 ‘우’는 40 dB가 되는데 이것은 모음 ‘아’와 ‘이’의 스펙트럼에서 고주파 부분의 진폭이 높아서 HNR이나 Jitter 값이 민감하게 반응하기 때문이다. 따라서, 목이 쉬거나 병적인 음성으로 발음한 모음 ‘이’의 HNR은 20 dB보다 훨씬 낮다. HNR에 대한 값의 관계를 확인해보기 위해서는 다음 순서대로 소음이 섞인 정현파를 만들어 비교해보면 쉽게 알 수 있다.


1. 프라트 기본메뉴의 New에서 Sound를 선택하고 Create Sound...를 클릭한다.

2. 대화창에서 파일이름과 다른 파라미터 값을 그대로 두고 OK를 하여 sineWithNoise파일이 객체창에 올라가게 한다.

3. 다시한번 1을 되풀이하되 이번에는 2의 대화창에서 파일이름을 noNoise로 하고 공식항에 지정되어 있는 “+ randomGauss(0, 0.1)” 부분을 모두 지우고 1/2 * sin(2*pi*377*x)만 남긴 채 OK를 하여 noNoise파일이 객체창에 올라가게 한다.

4. 객체창에 올려져 있는 Sound sineWithNoise와 noNoise파일을 선택하여 분석단추가운데 Periodicity를 누르고 그 아래 To harmonicity(cc)를 클릭한다.

5. 마우스로 Sound sineWithNoise를 선택하여 분석된 두 개 파일의 선택을 해제한다.

6. 다시 마우스로 Harmonicity sineWithNoise를 선택하고 객체창의 분석단추가운데 Query를 눌러 마지막에서 둘째 번에 있는 Get mean... 메뉴를 누르면 정보창에 11.4 dB로 나타난다. 이어서 Harmonicity noNoise파일을 선택하고 객체창의 분석단추가운데 Query를 눌러 마지막에서 둘째 번에 있는 Get mean...을 누르면 정보창에 89.63 dB로 나타난다. 즉, 소음없는 파형에서는 소음이 섞인 파형보다 높은 배음성 값을 나타낸다.

To PointProcess(periodic)...는 To Pitch(ac)...와 To PointProcess를 결합한 형태이다.


4.2 Jitter 값 구하기


Jitter란 단위시간 안의 발음에서 성대의 진동인 피치의 변화가 얼마나 많은지를 나타내준다. 정상적인 음성에서는 변화율이 높지 않는데, 성대에 결절이 있거나 암조직이 있으면 변화가 많게 된다. 따라서, 이 값을 이용하여 성대의 질병여부를 판단하는데 흔히 사용한다. 구하는 순서는 다음과 같다.


1. 객체창에서 분석할 음성을 선택한다.

2. 객체창의 분석단추 가운데 Periodicity를 선택하고 그 아래에 있는 PointProcess(periodic)...을 클릭한다. 대화창은 기본 값을 그대로 받아들이고 OK단추를 누른다.

3. 객체창에 PointProcess 파일이름이 나타나면 앞서 분석한 파일을 마우스로 선택하고 쉬프트 키를 누른 채 객체창 바로 위에 있는 음성파일을 클릭 하면 두 개의 파일이 한꺼번에 선택된다. 이어서 객체창의 오른 쪽에 있는 분석단추 가운데 Edit을 누르면 음성파형과 함께 피치간격으로 막대기가 함께 나타난다. 만일 앞서 분석한 음성파일과 PointProcess한 결과가 떨어져 있다면 음성파일을 마우스로 선택하고 객체창의 왼 쪽 아래에 있는 Copy...단추를 눌러 해당 음성파일을 복사한 뒤 PointProcess된 결과와 음성파일이 나란히 배열되게 한 뒤 쉬프트 키를 누른 채 두 개의 파일을 동시에 선택한 뒤 객체창의 분석단추 가운데 Edit단추를 누른다. 그러면 그림 4.4와 같은 편집창이 나타나는데 시간축 위에 촘촘하게 일정한 간격으로 그려져 있는 것이 피치펄스를 나타내고 있고, 그 안에 음성파형이 나타나 있다.


그림 4.4 점처리후 편집창


4. 분석하고자 하는 부분을 마우스로 선택한 뒤 그림 4.5에서 보듯이 Edit창의 Query메뉴에서 Get jitter를 클릭 한다.

이 때 나온 Jitter 값은 소숫점으로 표시되는데 0.01은 1%의 변화량을 나타내고 병적인 발음의 문턱 값이 된다. 모음 발음가운데서도 ‘아’나 ‘에’ 발음을 5초 이상 길게 발음했을 때 시작 지점과 끝 지점에서 중심점으로 약 50 ms를 제외한 안정된 구간에서 측정해야한다.


그림 4.5 편집창의 Query메뉴

       


 RAP 값은 프라트 Jitter 값의 약 1/3로 되어있다. 한가지 주의할 것은 Jitter 값은 피치 값이 정확히 측정되었을 때만 의미가 있는 결과를 얻을 수 있다. 피치 값에 오류가 많을 때 측정된 지터 값도 오류가 많아 믿을 수 없을 것이다. 예를 들어, 후두암 환자와 같이 장애음성인 경우에는 피치값의 측정이 부정확한 경우가 많기 때문에 그 결과값도 오류가 있을 때가 많다.


4.3 Shimmer 값 구하기


Shimmer란 음성파형에서 각 지점의 진폭 값의 변화가 얼마나 규칙적인지를 나타내준다. 성악가들은 음의 크기를 훈련에 의해 서서히 증가시키거나 감소시키는 조절을 할 수 있다. 보통 후두암과 같은 환자의 경우에는 성대의 진동이 불규칙적이면 각 시점의 진폭 값도 일정하지 않게 된다. 각 시간점의 진폭 값을 제곱하여 제곱근(root-mean-square)을 구하여 분석한다. 분석하는 순서는 앞의 Jitter구하기에서 제시한 1-3번까지를 시행한 다음 쉬프트 키를 누른 채 음성파일과 PointProcess결과파일을 동시에 선택하면 객체창의 분석단추가운데 Get shimmer가 나타나는데 이것을 클릭 한다. 대화창은 그림 4.6과 같이 나타난다.

이 대화창에서 Time range는 음성파형의 어디에서 어디까지를 분석할지를 지정한다. Shortest period는 PointProcess된 간격에서 얼마나 짧은 간격으로 된 것까지 분석에 포함시킬지를 지정한다. 기본 값으로는 0.1 ms와 같이 아주 작은 간격을 포함하도록 설정되어 있다.


그림 4.6 Shimmer 구하기 대화창

Longest period는 PointProcess된 간격가운데 최대로 긴 것을 수용할 범위를 지정한다. 기본 값으로는 0.02 초가 되어 있는데 이것은 1/0.02=50이 되어, PointProcess된 자료가운데 50 Hz까지 피치 값의 범위에 해당하는 자료를 모두 포함한다는 뜻이 된다. 그 보다 긴 간격부분은 무성음 구간으로 처리된다.

 Shimmer와 Jitter를 모두 측정하여 병적인 음성을 조사할 때는 앞서 Jitter를 구하는 과정의 4번의 편집창에서 분석하고자 하는 구간을 마우스로 선택한 뒤 Edit창의 Query메뉴에서 Get shimmer와 Get jitter를 차례로 클릭 하면 된다.


4.4 피치분석의 실제


필자가 “아버지”라고 발음한 음성의 녹음과 피치분석 전 과정을 차례로 살펴보자. 이 과정을 따라하면서 자신의 음성에 대한 피치분석을 해보길 바란다.

1. 프라트 프로그램을 실행한다.

2. 화면 위 기본메뉴의 New를 선택하고 Record mono Sound...를 클릭 한다.

3. SoundRecorder화면이 나타나면 Sample rate를 22050으로 지정한다.

4. 왼 쪽 아래의 Record단추를 누른 뒤 마이크에 가까이 대고 “아버지”하고 발음한다.

5. 왼 쪽 아래의 Stop단추를 누른다.

6. 왼 쪽 아래의 Play단추를 눌러서 녹음한 음성을 들어본다. 녹음 중에 음량막대에 빨간 표시가 나타났거나 녹음된 음량이 너무 낮을 때는 다시 4, 5번을 되풀이한다.

7. 만족할 만한 음성이 되었다면 왼 쪽 위의 File메뉴의 하위메뉴인 Write to AIFC file...을 누른다.

8. 파일저장 대화창이 나오면 저장하고 싶은 폴더로 이동하여 "pa.aifc"로 입력한다.

9. 오른 쪽 아래의 Close단추를 눌러 녹음대화창을 닫는다.

10. 화면 위 기본메뉴의 Read메뉴의 하위메뉴 가운데 첫 번째 메뉴인 Read from file...을 클릭 하고 대화창에서 녹음한 프라트 폴더로 가서 pa.aifc를 선택하여 연다. 보통 8번에서 파일저장을 한 폴더가 프라트 자체의 파일입출력에 자주 사용하는 폴더로 설정이 되어 자동으로 열린다.

11. 객체창의 분석단추가운데 Periodicity- 하위메뉴인 To Pitch...를 선택한다. 대화창의 파라미터 지정은 분석시간 간격(Time step)을 0.005초로하고, 최소 피치 값(Minimum pitch)은 75 Hz, 최대 피치 값(Maximum pitch)은 600 Hz로 기본 값을 그대로 둔다.

12. OK단추를 누른다.

13. 객체창에 분석 결과인 Pitch pa가 선택된 상태에서 분석 단추 Edit을 클릭 한다.

14. 그림 4.7에서 보이는 피치 값을 나타내는 창에 나타난 표지의 의미는 다음과 같다.


그림 4.7 피치 분석 결과 객체 편집창



이 그림 오른 쪽의 y축에는 피치 값의 눈금을 표시해주고 있다. 0에서 9까지의 여러 개의 숫자가 보여지는데 0번은 피치 값이 될 가능성이 가장 낮은 후보이고 9번은 가장 가능성이 높은 후보 값이다. 이 값은 빨간 디스크 모양으로 나타난다. 이 9라는 값은 자기상관계수의 정점 값인 0.9에 10을 곱한 값이다. 즉, 상관계수가 클수록 피치 값이 될 확률이 높아지며 숫자 값이 클수록 피치가 될 확률이 높다. 피치 창의 위에 나타난 intens는 해당분석구간의 상대적인 강도를 나타낸다. 아래에 있는 Unv부분의 막대가운데 흰 부분은 무성음구간(성대가 규칙적으로 진동하지 않음)을 나타내고 파란색으로 나타난 부분은 유성음구간(성대가 규칙적으로 진동한 구간)을 나타낸다. 유․무성 막대 바로 아래의 숫자들은 해당 구간의 지속시간을 나타낸다. 대체로 모음은 유성음으로 발음되기 때문에 음절마다 모음이 있는 구간은 이 막대로 나눠 쉽게 찾을 수 있다. 자음 가운데서도 ‘ㄴ, ㄹ, ㅁ, ㅇ’ 등과 같은 유성자음이 있다. 이런 모음과 유성자음을 중심으로 음절이 뚜렷한 특징을 보이므로 피치 값이 0보다 큰 지역을 음절마디로 분류하여 음성분석을 스크립트를 이용해 자동으로 실시하는 방법도 도움이 된다. Window다음의 숫자는 화면에 제시된 구간의 지속시간을 나타낸다. Total duration은 이 음성의 총 지속시간을 나타내준다. 이들 막대를 마우스로 클릭 하면 피치 값에 해당하는 합성음 “어”를 들어볼 수 있다. 이 발음을 실제 발음과 연이어 들어보면 시작과 끝 부분과 같이 음파의 진폭이 매우 낮은 지역의 피치 값이 제대로 측정되지 않는 경우가 많다. 이 때 피치합성음과 원래의 음성을 연이어 들어보면 쉽게 다름을 알 수 있다.


4.5 피치 값 확인 방법


음성파형을 이용하여 피치 값이 맞는지 정확히 확인하는 방법은 좁은대역의 스펙트로그램을 만들고 음파를 확대하여 성대진동을 나타내는 각각의 펄스의 지속시간을 구하여 보면 된다.

1. 객체창에서 음성파일을 선택하고 분석단추가운데 Edit을 누른다.

2. 편집창 메뉴가운데 View메뉴로 들어가 Show Analysis를 누른 뒤 그림 4.8과 같이 스펙트로그램과 피치의 체크박스를 선택한다.


그림 4.8 분석 결과 보이기 선택 대화창

3. 편집창 메뉴가운데 View메뉴로 들어가 Spectrogram settings를 클릭 한다. 그림 4.9와 같이 대화창이 나오면 View Range의 최대 값을 500으로 설정하고, Window length를 0.029로 지정하고 Dynamic range는 10을 입력한 뒤 OK단추를 누른다.


그림 4.9 스펙트로그램 설정 대화창


4. 편집창의 왼 쪽 아래에 있는 in단추를 눌러 음성파형을 점점 확대하고 그림 4.10과 같이 성대의 펄스를 직접 마우스로 클릭 하여 선택한다. 그림 4.10에서 선택된 구간의 지속시간은 0.006527초이고 주파수로는 153.205이다. 아래에 있는 좁은대역 스펙트로그램의 중심선이 첫 번째 배음이고 153.6으로 된 값이 피치 값이므로 마우스로 선택하는데서 생긴 오류를 감안해보면 컴퓨터로 측정된 153.6 Hz가 옳은 값이라는 결론을 내릴 수 있다.

피치분석결과창의 Edit메뉴의 아래에는 y축의 최대 값을 조절하는 Change ceiling이 있는데 이것을 클릭 하여 600 Hz보다 낮은 값을 입력하면 보다 확대된 모양의 피치그림이 나타난다. 일반적으로 평균피치 값의 1.5배에 해당하는 값을 최대 값으로 지정하면 상대적으로 확대된 모양을 볼 수 있다. 최대 값을 잘못 설정하면 보다 높은 피치 값은 무성음으로 표시되므로 실제 음성과 피치합성음을 들어보고 차이가 날 때는 최대 값을 더 높여야 한다. 덧붙여, 피치분석객체가 선택된 상태에서 Edit메뉴 아래의 Path finder메뉴를 클릭 하면, 앞서 To Pitch(ac)...에서 설명한 문턱 값들을 지정하여 피치 값의 가능성이 낮은 후보들을 제거해준다.

그림 4.10 음성파형의 확대에 의한 피치 확인


 

 어떤 시간 지점의 피치 값을 알려면 빨간 디스크로 나타나있는 지점을 마우스로 클릭 하고 Query메뉴 아래의 Get pitch를 선택하면 정보창에 해당 피치 값이 나타난다. 일반적으로 피치 값이 정상인의 경우에는 5 ms만에 갑작스럽게 10 Hz나 올라가거나 내려가지 않는다. 왜냐하면 정상적인 성대의 진동은 매우 느리고 완만하게 변하기 때문이다. 예를 들어, 다음 그림은 피치 값이 220 Hz로 계속 가다가 110 Hz로 떨어졌다가 다시 220 Hz로 급상승한 모양을 보이고 있는데 이것은 측정상의 오류로 봐야한다.

앞서 제시한 것과 같이 음파에서 성대의 진동구간의 지속시간을 직접 구해 확인해볼 수 있다. 또한 다음 장의 스펙트로그램 분석에서도 좁은대역으로 처리한 결과창에서 정확한 피치 값을 한번 더 확인해 볼 수 있다. 이렇게 갑자기 변한 피치 값을 없애려면 Edit 메뉴 아래의 Path finder메뉴를 이용하거나 개별 값들을 편집하는 방법을 사용하면 된다. 너무 벗어난 값은 마우스로 나머지 후보가운데 해당 값을 클릭 하면 선택이 된다. 무성음 값으로 하려면 Unv로 표시되어 있는 막대 위를 마우스로 클릭 하면 된다. View메뉴에는 음성전체를 확대하거나(Zoom in), 축소할(Zoom out) 수 있고 마우스로 선택한 부분을 확대(Zoom to selection)할 수 있다. 한꺼번에 한 페이지 뒤로 가거나(Scroll page back), 앞으로 가게(Scroll page forward) 할 수 있다. 기능키로는 각각 PageUp, PageDown키를 이용하는 것이 편리하다. 피치 합성음을 들어보려면 View메뉴 아래의 Play메뉴나 피치편집창의 아래 재생 막대를 클릭 하거나, tab키를 누르면 된다. 어느 쪽이든지 편리하고 빠른 방식을 이용하기 바란다. Select메뉴 아래의 Select를 택하면 대화창이 나타나고 Begin of selection과 End of selection에 원하는 시간 값을 지정하면 정밀하게 원하는 부분을 선택할 수 있다. 그 아래 있는 메뉴들은 커서를 정확히 옮겨가는데 활용할 수 있다. Selection 메뉴 아래의 첫 번째 메뉴인 Unvoice는 마우스로 선택한 부분을 한꺼번에 무성음 구간으로 바꾼다. Octave up, Octave down 또는 Fifth up, Fifth down을 이용하여 기준피치 값의 2배로 또는 1.5배로 높이거나 내릴 수 있다. 한 옥타브는 음향적 주파수로 2배가  되는 지점을 말하고 Fifth는 음계 ‘도’를 기준으로 다섯 번 째 음인 ‘솔’음을 말한다. ‘레’의 Fifth는 ‘시’가 된다.

 피치 값 측정에서 “ㅅ”이나 “ㅈ”과 같은 마찰음의 특징이 있는 발음에서는 소음기간을 피치구간으로 처리하여 매우 높은 값으로 나오는 경우가 있는데 이 부분을 주의해야한다. 피치분석은 일정한 분석구간(5 ms)마다 그림과 같은 Hanning window로 하여 상관계수를 구하기 때문에 음파의 시작 부분과 끝 부분에는 윈도우 범위 안에 진폭 값이 적게 포함되기 때문에 정보가 부족하여 분석결과가 정확치 않을 수 있다. 그림 4.9는 26밀리초의 윈도우에 나타난 음성(위 그림)을 Hanning창으로 변형한 음성파형(아래 그림)의 예를 들면 그림 4.11과 같다.

 

그림 4.11 Hanning창으로 변형한 음성파형


 


이렇게 창의 종류별로 비교해 보려면 객체창에 불러온 음성을 마우스로 선택한 뒤, 객체창의 Edit단추를 누르고, 편집창에서 약 26밀리초의 음성부분을 선택한 뒤, File메뉴의 Extract selection을 선택하면 객체창에 일부 음성만 올라가게 된다. 이어서 객체창의 Modify단추 아래의 Multiply by window를 선택하면 여러 종류의 창이 나타난다. 이 중 하나를 택하면 그림 4.11과 같이 창으로 처리된 파형을 볼 수 있다. 결국, 음성에 대한 모든 분석은 이렇게 분리된 한 창에서 피치, 포먼트, 스펙트럼 진폭 등을 구하기 때문에 연속된 음성의 특성을 제대로 반영하지 못하는 단점이 나타나게 된다.


4.6 프라트의 피치분석 평가


프라트의 피치분석이 얼마나 정확한지를 알기 위해서 다음과 같이 처리해 보았다.

1. 프라트 기본메뉴의 New에서 Sound를 선택하고 Create Sound...를 클릭 한다.

2. 대화창에서 파일이름을 sinewave로 하고 공식항에 지정되어 있는 “+ randomGauss(0,0.1)” 부분을 모두 지우고 1/2 * sin(2*pi*377*x)만 남긴 채 OK를 하여 sinewave파일이 객체창에 올라가게 한다.

4. 객체창의 분석단추가운데 Periodicity를 누르고 그 아래 To Pitch(ac)를 마우스로 클릭 한다.

5. 객체창의 분석단추가운데 Edit를 마우스로 누른다.

6. 피치분석창에서 빨간색 디스크 모양을 클릭 하고 Query메뉴의 Get pitch를 누른다.

7. 결과는 377 Hz로 나타나서 정확히 측정되었음을 알 수 있다.


피치 값을 하나씩 피치분석창에서 구할 때 실험자의 실수로 측정할 위치를 잘못 잡을 수도 있고 시간도 많이 걸리게 된다. 가능하면 이 책 후반부에 제시된 스크립트를 활용하여 피치 값을 구하여 하드디스크에 자동으로 저장한 뒤 SPSS나 엑셀과 같은 통계 그림 소프트웨어로 이 값의 유효성을 점검하도록 하기 바란다.



제 5 장 스펙트럼․스펙트로그램 분석


5.1 객체창 분석단추의 스펙트럼 메뉴


스펙트로그램은 성도의 모양 변화를 연속적으로 볼 수 있는 분석 방식이다. 사람의 지문이 다르듯이 음성의 지문도 달라지게 된다. 지정된 한 시간점에 대해서는 스펙트럼(spectrum)이라고 하고 여러 개의 시간지점에서 푸리에 분석된 스펙트럼의 복수를 스펙트라(spectra)라고 한다. 시간선상에 스펙트라를 연이어 표시하고 해당 주파수마다의 진폭의 강도를 함께 나타낸 것을 스펙트로그램이라고 한다. 프라트에는 스펙트럼이나 스펙트로그램을 다양하게 분석하는 방식이 제시되어 있다.

 음성파형의 전체 스펙트럼을 분석하는 과정은 먼저 기본 메뉴에서 저장해둔 음성파일을 불러온 뒤, 객체 창의 분석 단추 가운데 Spectrum-을 선택하면 된다. Spectrum-의 하위메뉴에는 To Spectrum(fft)가 있는데 이것을 선택하면 분석할 음성파일의 스펙트럼 특성을 중복시켜 나타내준다. 바로 아래에 있는 To Spectrogram...메뉴를 선택하면 지정한 시간간격으로 스펙트럼을 구하여 3차원 그래픽으로 나타낸다. 분석할 음성파일을 선택하고 이 메뉴를 선택하면 그림 5.1과 같은 스펙트로그램 생성용 대화 상자가 나타난다.


그림 5.1 스펙트로그램 측정 파라미터 설정 대화 상자

     

이 대화 창의 분석 구간(Analysis widths)은 몇 초 간격마다 창을 만들어 스펙트럼을 구할지를 나타내고, 최대 주파수(Maximum frequency)는 분석한 스펙트로그램의 y축 상 가장 높은 값을 지정하는데 사용한다. 시간간격(Time step)은 시간축에서 해당 음성을 얼마의 간격으로 분석하여 나타내는가를 보여주고, 주파수간격(Frequency step)은 주파수 축의 분석단계를 지정한다. 각 분석구간의 창 모양(Window shape)은 연속된 신호를 단절된 신호로 처리하여 Fast Fourier Transform(FFT)을 하기 위한 것으로 분석 결과에는 약간의 차이가 있지만, 청각적으로 중요한 차이는 없기 때문에 어떤 방식을 사용해도 좋다. 일반적으로는 해밍 창이나 가우시안 창을 많이 사용한다.

프라트의 스펙트로그램 분석은 일반적인 음성 분석 프로그램에서 보듯이 이미 지정된 메뉴방식으로 되어있지 않고 사용자가 원하는 형태로 분석구간과 분석방식을 지정할 수 있기 때문에 거의 모든 종류의 분석을 해 볼 수 있는 장점이 있다. 반면에 배경지식이 없는 초보자에게는 너무 많은 파라미터 값을 지정하는 것이 매우 어려울 수도 있다. 일반적으로 좁은대역의 스펙트로그램은 분석구간을 넓게 잡음으로써 가능하다. 넓은대역의 스펙트로그램은 좁은 분석구간을 지정하면 된다. 예를 들어, 300 Hz의 넓은대역의 스펙트로그램을 구하려면 분석구간을 0.0043 초로 지정하고, 45 Hz의 좁은대역의 스펙트로그램을 만들려면 0.029 초로 지정한다. 이런 관계를 확대하여 생각해보면 0.001초로 하면 약 1000 Hz 대역폭의 분석이 되고, 0.005 초로 하면 약 200 Hz의 넓은 대역의 분석이 될 것이다. 보통 남성의 음성 분석은 0.008초로 하면 125 Hz 대역의 분석으로 포먼트의 띠 모양이 잘 보인다. 여성의 음성분석은 0.005초 이하로 처리하여야 배음보다는 포먼트 윤곽을 쉽게 찾을 수 있다. 일반적으로 피치변화를 관찰하기 위해서는 좁은대역의 스펙트로그램을 사용하면 배음 윤곽을 상세히 볼 수 있기 때문에 억양 분석에 도움이 된다. 반면 피치 값이 120 Hz전후의 남성일 경우에는 0.005초의 간격으로 살펴보아야 배음이 혼합되어진 포먼트의 윤곽을 쉽게 파악할 수 있다. 200 Hz이상의 피치 값을 가진 여성화자의 음성을 분석할 때는 0.003초의 간격을 지정하는 것이 포먼트의 위치를 찾는데 도움이 될 수 있다. 최대 주파수는 보통 음성의 특징이 나타나는 4000 Hz로 지정하는 것이 좋다. 물론 좁은대역의 피치 변화를 크게 확대하여 살펴볼 때는 최대 주파수를 600 Hz로 지정하면 저음에서의 배음 변화를 쉽게 파악할 수 있다. 시간간격(Time steps)은 0.01초가 기본으로 설정되어 있는데 이것은 10 밀리초마다 하나씩 파악하는 것이 된다. 이 숫자가 낮을수록 많은 자료를 분석해야하기 때문에 분석에 걸리는 시간이 길어지게 되며, 보통 모음과 같이 시간마다 변화가 심하지 않는 경우에는 너무 낮은 숫자를 부여할 필요가 없다. 주파수 단계는 주파수 축에서 배음을 살펴보는 간격을 말하는데 좁을수록 상세하게 보여주고 넓을수록 대체적인 포먼트 윤곽을 나타내어준다.

객체창의 Spectrum분석단추 다음에 나오는 To Wavelet은 음성파형의 특징을 하나 하나의 작은 파형의 합으로 분산하여 각각의 성분을 시간축과 로그주파수척도로 나타낸다. To Cochleagram메뉴는 스펙트럼의 정보에서 주파수축을 Bark 청각척도로 변환하여 시간마다 내이의 기저막에 전달되는 음파의 모양을 나타낸다. 저주파 부분의 해상도가 높고 고주파 부분은 해상도가 낮은 그림을 보여준다. 내이의 음성처리에 관해서는 양병곤(1997)을 참조하기 바란다. 달팽이관의 구조에서 살펴보면 타원창에 가까운 쪽이 가늘고 단단하며 주로 고주파의 진동을 받아들이는 것으로 알려져 있다. 정점에 가까운 안쪽은 굵고 연하며 저주파에 해당하는 주파수를 받아들인다고 한다. 그림 5.2는 이러한 달팽이관을 펼쳤을 때 음향적 주파수에 공명하는 위치를 나타내고 있다 (Johnson 1997:76).


그림 5.2 달팽이관의 음향적 주파수 공명위치

                                                                                

 이 그림에서 인간의 음성에서 가장 중요한 정보를 담고 있는 3000 Hz까지의 영역이 달팽이관의 반 이상을 차지하고 있음을 볼 수 있다. 그보다 높은 주파수에 해당하는 부분은 좁은 영역이 할당되어 있음을 알 수 있다.

 다음에 오는 FormantFilter 메뉴는 분석할 음성파일의 피치를 구한 뒤 이 값을 이용해 주파수축을 훑어 가며 여과한 뒤 스펙트럼에너지 밀도를 시간과 주파수축에 dB로 나타낸 그림을 보여준다. To BarkFilter 메뉴는 일정한 시간간격과 Bark로 변환한 주파수 간격으로 추출한 스펙트럼에너지밀도를 시간과 주파수축에 dB로 나타낸 그림을 보여준다.


5.2 스펙트럼 분석의 실제


모음 “아” 발음에 대한 전체 스펙트럼은 다음과 같은 순서로 구한다.

1. 프라트 프로그램을 실행한다.

2. 화면 위 기본메뉴의 New를 선택하고 Record mono Sound...를 클릭한다.

3. SoundRecorder화면이 나타나면 Sample rate를 22050으로 지정한다.

4. 왼 쪽 아래의 Record단추를 누른 뒤 마이크에 대고 “아”하고 발음한다.

5. 왼 쪽 아래의 Stop단추를 누른다.

6. 왼 쪽 아래의 Play단추를 눌러서 녹음한 음성을 들어본다. 녹음 중에 음량 막대에 빨간 표시가 나타났거나 녹음된 음량이 너무 낮을 때는 다시 4, 5번을 되풀이한다.

7. 만족할 만한 음성이 되었다면 오른 쪽 위의 File메뉴의 하위메뉴인 Write to AIFC file...을 누른다.

8. 파일저장 대화창이 나오면 "a.aifc"로 입력한다.

9. 오른 쪽 아래의 Close단추를 눌러 녹음 대화창을 닫는다.

10. 화면 위 기본메뉴의 Read메뉴의 하위메뉴 가운데 첫 번째 메뉴인 Read from file...을 클릭 하고 대화창에서 녹음한 프라트 폴더로 가서 a.aifc를 선택하여 연다.

11. 객체창의 분석단추가운데 Spectrum- 하위메뉴인 To Spectrum(fft)을 선택한다.

12. 객체창에 분석결과인 Spectrum a가 선택된 상태에서 분석단추 Edit을 클릭 하면 그림 5.3과 같은 창이 나타난다.


그림 5.3 모음 ‘아’의 전체 스펙트럼


스펙트럼분석 결과 창에 나타난 표지의 의미는 각각 다음과 같다. 이 그림의 오른 쪽의 y축에 제시된 눈금은 진폭 값의 최대 값과 최소 값을 나타내고 있고 x축에는 주파수 값이 주어져 있다. 마우스로 한 부분을 클릭 하면 해당 부분의 주파수 값과 진폭 값이 그림 위쪽과 오른 쪽에 각각 숫자로 나타난다. 스펙트럼 분석창의 Edit메뉴에 있는 대역통과(Pass band)나 대역정지(Stop band)는 마우스로 선택한 주파수 대역 일부분만 통과시켜 거르거나 정지시켜 준다. 그림 5.4는 1921 Hz부터 4376 Hz까지의 주파수 영역을 마우스로 선택한 뒤, Edit메뉴의 대역정지를 실시한 뒤의 스펙트럼을 보여준다.


그림 5.4 대역정지를 한 스펙트럼


이 스펙트럼 모양의 음파의 소리를 들어보려면 객체창의 분석 단추가운데 Synthesize 아래에 있는 To Sound를 클릭 하고 Sound a로 올려진 파일이 선택된 상태에서 객체창의 분석단추 중 Play를 누르면 된다. 이 과정은 원래의 음성파일 a를 선택한 뒤, 객체창의 분석 단추가운데 Synthesize아래에 있는 Filter를 선택하고 그 아래의 Filter(pass Hann band...)나 Filter(stop Hann band...)를 클릭 하여 통과시키거나 정지시킬 주파수의 시작과 끝 부분을 입력하여 처리한 뒤 객체창의 분석 단추 가운데 Play를 누르는 과정과 동일한 결과를 나타내준다. Filter메뉴를 사용하면 보다 정밀한 주파수 값을 입력하여 처리할 수 있다는 장점이 있다. 이렇게 고주파 부분을 걸러내면 청각장애아들이 실제 듣는 음성이 어떤지, 정상인들에게 시범으로 들려줄 수 있다.

스펙트럼분석결과객체가 선택이 된 상태에서의 객체창의 분석 단추는 그림 5.5와 같이 나타난다. Analyse의 내이 자극 값(To excitation)을 선택하면 내이의 기저막의 자극 전달치에 해당하는 값들을 폰(phon)단위의 강도로 나타내준다. To Formant(peaks)는 사용자가 입력하는 개수의 포먼트를 찾아준다. To Ltas는 장기간 평균스펙트럼(Long term average spectrum)을 나타내는데 이것을 이용하면 진폭 값을 데시벨(dB)로 나타내어준다. 각각의 주파수 값에 대해 1대 1로 진폭 값을 나타내어주는 것은 To Ltas(1to1)이다.

그림 5.5 스펙트럼 분석 객체를 선택한 뒤의 객체창의 분석 단추

            

 

실제 두 개의 음성을 비교하려면, 전체 스펙트럼을 사용하기보다는 다음에 나오는 스펙트로그램을 분석하여 일정한 시간 간격으로 스펙트럼을 찾아 데이터를 만든 뒤, 이들 값들을 분석하여 포먼트나 기타 음성의 특징을 찾아내어 비교하는 것이 더 정확하다. Convert의 Cepstral smoothing...이나 LPC smoothing...을 누르고 대화창에 정점 갯수를 5개 등으로 입력하면 스펙트럼에 대한 평균 처리된 정점 값을 보여준다. 각 정점 값은 주파수가 낮은 것부터 차례로 F1, F2, F3 등으로 부른다. 실제 포먼트 측정은 다음에 나오는 컴퓨터 추정 값을 이용하는 것이 좋다.


5.3 스펙트로그램 분석의 실제


모음 “아” 발음을 녹음하여 스펙트로그램을 만드는 과정을 살펴보자.


1. 프라트 프로그램을 실행한다.

2. 화면 위 기본메뉴의 New를 선택하고 Record mono Sound...를 클릭 한다.

3. SoundRecorder화면이 나타나면 Sample rate를 22050으로 지정한다.

4. 왼 쪽 아래의 Record단추를 누른 뒤 마이크에 대고 “아”하고 발음한다.

5. 왼 쪽 아래의 Stop단추를 누른다.

6. 왼 쪽 아래의 Play단추를 눌러서 녹음한 음성을 들어본다. 녹음 중에 음량 막대에 빨간 표시가 나타났거나 녹음된 음량이 너무 낮을 때는 다시 4, 5번을 되풀이한다.

7. 만족할 만한 음성이 되었다면 오른 쪽 위의 File메뉴의 하위메뉴인 Write to AIFC file...을 누른다.

8. 파일저장 대화창이 나오면 "a.aifc"로 입력한다.

9. 오른 쪽 아래의 Close단추를 눌러 녹음 대화창을 닫는다.

10. 화면 위 기본메뉴의 Read메뉴의 하위메뉴 가운데 첫 번째 메뉴인 Read from file...을 클릭 하고 대화창에서 녹음한 프라트 폴더로 가서 a.aifc를 선택하여 연다.

11. 객체창의 분석 단추가운데 Spectrum- 하위메뉴인 To Spectrogram...을 선택한다.

12. 그림 5.6과 같은 대화창에 Analysis width를 0.007, Maximum frequency를 4000, Time step을 0.002, Frequency step을 20, Window shape는 Gaussian에 체크모양이 되어있도록 한 뒤 OK단추를 누른다.


그림 5.6 스펙트로그램 분석 파라미터 설정 대화창

   

13. Spectrogram a가 선택된 상태에서 객체창 분석 단추가운데 View를 마우스로 선택하면 그림 5.7과 같이 나타난다. 


그림 5.7 모음 ‘아’의 스펙트로그램 편집창


스펙트로그램 분석 결과 창에 나타난 표지의 의미는 각각 다음과 같다. x축은 시간축을 나타내고, y축은 주파수축을 나타낸다. 보다 검게 나타난 부분은 음성에너지가 더 많이 집중된 곳이고 보다 엷게 나타난 지점들은 에너지가 적은 곳이다. 이런 에너지의 집중은 제1장의 성도의 음향적인 특징에서 보였듯이 입안의 공간모양이 달라지면서 생긴 공명도에 따라 표시된다.

그림 5.8 모음 ‘아’의 스펙트럼

스펙트로그램에서 각각의 시간점에서의 스펙트럼을 구하려면, 객체창의 분석 단추가운데 To Spectrum(slice) 단추를 선택한다. 대화창에 보고 싶은 시간점(Time)을 입력하고 OK단추를 누르면 Spectrum a객체가 생성된다. 객체창의 분석 단추가운데 Edit을 눌러보면 그림 5.8과 같은 스펙트럼이 나타난다.

이 스펙트럼창의 x축은 주파수축을 나타내고 y축은 진폭축을 나타낸다. 마우스로 한 지점을 택하면 주파수 값이 위에, 진폭 값은 왼 쪽에 빨간색으로 나타난다. 그림에서는 제3포먼트에 해당하는 정점 값의 주파수 2757 Hz와 진폭 76 dB가 표시되어 있다.

객체창에서 Spectrum a가 선택된 상태에서 객체창의 분석 단추 가운데 To Matrix를 클릭 하면 1줄과 분석구간에 따라 생성된 열 수로 된 배열로 저장된다. 파일의 구조를 보여주기 위해 Matrix a를 객체창의 기본메뉴인 Write-Write to text file...로 저장한 뒤 모든 파일 형태로 아래아한글에서 읽어오면 다음과 같이 첫 부분이 나타난다.


File type = "ooTextFile"

Object class = "Matrix"


xmin = 0

xmax = 4000

nx = 126

dx = 31.650961623312778

x1 = 15.825480811656389

ymin = 1

ymax = 2

ny = 2

dy = 1

y1 = 1

z [][] :

    z [1]:

        z [1] [1] = 0.033895649

        z [1] [2] = 0.038234778

        z [1] [3] = 0.046714656

        z [1] [4] = 0.051830579

        z [1] [5] = 0.049270481

<이하 생략>


여기서 z [1] [3]= 0.046714656은 행렬의 첫 번째 줄의 세 번째 열의 값을 말한다. 이렇게 구한 스펙트럼 정보를 조작하거나 변형하려면 스크립트를 이용하는 것이 좋다.



제 6 장 포먼트 분석


6.1 포먼트 분석 메뉴


프라트의 포먼트 분석은 음성파일을 선택한 뒤 객체창의 분석 단추 가운데 Formants & LPC-를 선택하면 된다. 이 단추 아래에는 그림 6.1과 같이 여러 가지 분석 방식이 제시되어 있다.


그림 6.1 객체창의 포먼트 분석 단추 하위메뉴

         

먼저 To Formant(burg)...를 선택하면 그림 6.2와 같은 대화창이 나타난다.


그림 6.2 포먼트(burg) 분석 파라미터 설정 대화창

  


각각의 파라미터의 의미는 Time step은 몇 초의 시간간격으로 포먼트 값을 구할 것인지를 나타내고, Max. number of formants는 최대 포먼트 갯수를, 최대 포먼트(Maximum formant)는 포먼트 분석할 범위의 최대 값, Window length는 분석할 창의 지속시간을 나타내며 Pre-emphasis from은 입력한 주파수 지점부터 최대 포먼트 값까지 서서히 스펙트럼의 진폭 값을 증가시키는 것이다. 분석 시간 간격을 작게 할수록 시간 축에 대해 촘촘하고 해상도가 높은 그림을 보여준다. 최대 포먼트 갯수는 대체로 2-6까지의 숫자 가운데 하나를 넣으면 되고 이 값을 높일수록 포먼트 갯수가 더 많이 찾아지지만, 음성의 특성을 적절히 나타내는 값으로 보기는 어렵다. 보통 남성화자의 경우에는 최대 값 5000 Hz까지 약 5개의 포먼트가 나타나지만, 여성화자의 경우에는 이보다 적은 4개로 지정해야 바른 측정  값을 보여준다. 아이들은 4개 또는 아주 어린아이들일 경우에는 3개까지로 지정해야할 것이다. 최대 포먼트 값에 따라 포먼트 개수도 달라져야한다. 즉, 최대 포먼트 값이 4000 Hz라면 남성화자의 경우에는 4개의 포먼트가 들어갈 수 있지만, 여성화자인 경우에는 3개정도 밖에 나타나지 않는 발음도 있다. 아주 어린아이인 경우에는 최대 포먼트 값을 8000 Hz까지 지정해야 한다. 이 관계를 이용하면 “오”나 “우”와 같은 모음의 제1, 제2포먼트가 1000 Hz아래에 아주 가까이 접근해 있어 보통 하나로 측정되는데, 대화창에서 최대 포먼트 값을 1000 Hz로 하고 포먼트 갯수를 2개로 하면 옳은 포먼트 값을 구할 수 있다. 프라트에서는 양쪽 끝이 -120 dB로 줄여진 가우시안창을 사용하기 때문에, 창문 길이 값의 2배에 해당하는 길이의 창에서 포먼트 값을 구한다. Pre-emphasis from 값을 입력하면 그 값이 옥타브당 6 dB씩 증폭하는 역저역통과 음성스펙트럼 필터 (inverted low-pass filter)에서 처음 3 dB 증가되는 지점이 된다. 따라서 이 값을 50 Hz로 입력하면 스펙트럼에너지 가운데 50 Hz이하는 증폭되지 않고 한 옥타브위인 100 Hz에서 6 dB 증폭되고, 또 한 옥타브 위인 200 Hz에서는 12 dB 증폭되게 된다. 이렇게 하면 음성스펙트럼이 옥타브당 6 dB씩 떨어지는 것을 상쇄시켜 고주파 영역의 스펙트럼의 진폭이 원래의 음원의 감폭 크기만큼 높아져서 포먼트의 위치를 더 쉽게 찾을 수 있게된다. 좀 더 자세히 말하면, 음원스펙트럼에서는 옥타브당 -12 dB로 떨어지지만 입술에서 방출될 때 방사에너지가 음성을 옥타브당 6 dB씩 증폭시켜서 실제 공기 중에 발화된 마이크로 입력된 신호에서는 옥타브당 -12+6=-6 dB씩 떨어지는 것으로 나타난다. 방사에너지란 큰소리로 외칠 때 입 주위에 양 손바닥을 나팔처럼 만들어 말하면 손바닥으로 생긴 반사면에 의해 소리가 커지는 현상을 말하는데, 얼굴표면이 손바닥만큼 증폭시키지는 않지만 바로 이런 증폭 효과를 나타낸다. 고주파영역의 진폭정보가 낮은 음성일 경우에는 원래의 음성파일을 객체창 분석 단추가운데 하나인 Filter 아래의 Preemphasize...를 실행하여 변형한 후 처리하면 고음 부분이 더욱 더 강조되게 된다. 그림 6.3은 고주파 대역 강조 전후의 스펙트럼을 보여준다. 세 번 째 배음의 진폭이 39.9 dB에서 104.9 dB로 올라갔다.

포먼트 분석을 실행하면 객체창에 Formant a로 나타나는데 이것을 그림으로 그려보려면 먼저 그림창을 선택하여 마우스로 왼 쪽 위 부분을 클릭한 채 오른 쪽 아래로 원하는 크기만큼의 박스가 되도록 끌고 가서 놓는다.


그림 6.3 고주파대역 강조 실행 전․후의 스펙트럼


이어서 객체창의 분석 단추가운데 Draw-를 누르면 그림 6.4와 같이 하위메뉴가 나타난다. Speckle...을 선택하면 지정한 시간간격마다 포먼트 위치에 작은 점이 찍혀진 그림으로 나타나고 그 아래의 Draw tracks...를 선택하면 포먼트 지점 값들이 연속된 선으로 그려진다.


그림 6.4 포먼트 그리기 하위메뉴

      

Speckle...을 선택하고 OK단추를 클릭 하면 그림 6.5와 같은 대화창이 나온다.

그림 6.5 포먼트 그리기 파라미터 설정 대화창


이 대화창에서는 최대 주파수 값을 4000으로 지정하여 제1포먼트에서 제4포먼트까지 좀더 상세히 보이게 하고, Dynamic range에 낮은 숫자를 넣을수록 유성음의 시작과 끝 부분의 소음이 많은 부분의 포먼트 값 들이 걸러져 나타난다. 편집창에서는 차수(number of Poles)에 8 또는 그 보다 낮은 숫자를 입력하여 부가적인 잘못된 포먼트를 제거할 수도 있다. 그림 6.6은 위의 설정으로 처리하여 나타낸 모음 ‘아’의 포먼트 흔적이다.


그림 6.6 모음 ‘아’의 포먼트 흔적

예를 들어, 위의 대화창의 Dynamic range를 10으로 한 뒤 그림을 그려보면 그림 6.7과 같이 시작 부분과 끝 부분의 잘못된 포먼트 값이 걸러져 있음을 볼 수 있다.

그림 6.7 모음 ‘아’의 포먼트 흔적 재처리

 각 지점의 값들을 하나씩 구하려면 객체창의 분석 단추가운데 Query를 눌러 Get value at time...을 선택한다. 대화창에서 포먼트 번호와 분석 값을 구할 시간점을 입력하고 단위는 음향주파수 단위인 Hz와 청각척도로 변환한 Bark중 하나를 택하고 Interpolation은 Linear를 선택해 둔다. Bark를 선택하여 구한 값은 음향 주파수 단위보다는 개인적인 특징을 많이 줄여주기 때문에 음성인식장치구현에 활용할 수 있다. 또한, Interpolation이 들어간 것은 분석자가 입력한 시간 간격으로 처리된 포먼트 값 자료가운데 이 대화창에 입력한 시간점에 해당하는 값이 없다면 앞 뒤 인접한 지점의 값을 더하여 평균을 낸 값을 제시해주기 때문이다. OK단추를 누르면 정보창에 포먼트 값이 숫자로 나타난다. 때로는 --undefined--로 나타나기도 하는데 이것은 음성부분이 아닌 소음구간이 있는 시간점에서 포먼트 값을 요구했을 때 구할 수 없다는 메시지이다. 스크립트를 작성할 때는 만약 구한 파라미터 값이 undefined일 때는 0을 부여하거나 기본 값을 넣도록 하는 조건절을 넣어두어야 실행상의 오류를 피할 수 있다.

To Formant(burg)의 처리과정은 먼저 최대 포먼트 값의 두 배에 해당하는 표본추출속도로 재설정(Sound:Resample...)한 뒤 고주파대역 강조(Sound:Pre-emphasize)를 적용하고, 각 분석창에서 가우시안창을 적용하여 LPC 계수를 Burg방식으로 계산한다 (Press et al. 1992). 이 알고리즘은 먼저 50 Hz이하와 (최대 포먼트 값-50 Hz)에 해당하는 포먼트 값은 제거한다. 이 부분의 포먼트 값도 그대로 두려면 다음의 메뉴인 To Formant(keep all)...을 사용하면 된다. To Formant(sl)...메뉴는 Split-Levinson의 처리방식으로 되는데 지정한 주파수 범위에 강제로 일정한 개수의 포먼트를 찾아내도록 처리해준다.

To LPC(autocorrelation)...은 자기상관방식으로 처리한 뒤 선형예측계수를 지정한 시간간격마다 구하여 포먼트에 해당하는 정점 값을 차례로 나타내준다. 이 방식에서 선형예측계수를 구하기 위한 차수(prediction order)를 지정해야한다. 차수란 간단히 말하면 예측방정식을 구했을 때 y=345+5x+10x2+...+234x10일 때 마지막 x의 지수 값인 10을 말한다. 차수가 높을수록 보다 더 정확한 예측 값이 되지만 계산시간이 많이 소요되고 한 개의 포먼트가 나타날 위치에 두 개 이상이 구해지게 된다. 일반적으로 차수는 포먼트 갯수의 두 배가 되어야하므로, 1000 Hz마다 약 두 개의 포먼트가 나타나기 때문에 (표본추출속도/1000)으로 구한 값을 넣는다. 예를 들어, 16000 Hz일 때는 16을 지정한다. 차수가 낮으면 모음 ‘오’나 ‘우’와 같이 두 개의 포먼트 값이 가까이 접근한 경우에 하나의 포먼트로 처리하는 오류가 발생하기 때문에 주의해야한다. 앞서 분석된 그림 6.7의 음성파일 ‘아’를 객체창에서 선택한 뒤 분석 단추가운데 Formants & LPC-->To LPC(autocorrelation)...을 클릭 하고 대화창에서 차수를 10으로 두었다. 이어서 구해진 LPC계수파일을 객체창의 분석 단추가운데 To Formant하여 실행시키고 Draw-->Speckle을 실행했을 때 그림 6.8과 같이 오류 투성이의 포먼트 모양을 보여주고 있다.


그림 6.8 낮은 차수에서 처리된 모음 ‘아’의 포먼트 흔적


         

제1,2포먼트가 나타날 곳에 한 개의 포먼트가 구해졌고, 제3포먼트 지점에서는 매우 불규칙한 궤적을 나타내고 있다. 따라서, LPC 등에 의한 분석을 할 때 포먼트 값이 항상 정확한지를 확인해야 한다. 가장 좋은 방법은 스펙트로그램에서 진한 띠로 된 부분과 일치하고 있는지를 확인하는 방법이 좋다. 스펙트로그램의 정보는 다른 어떤 분석보다도 상대적으로 정확한 그림을 보여주기 때문이다. 구체적인 활용 예는 스크립트 작성에서 숫자음 ‘일’을 분석한 그림 9.12를 참고하기 바란다. 덧붙여, 성인 남녀 화자의 모음마다 필자가 구한 다음 표의 포먼트 값을 참고하기 바란다 (Yang, 1996).

표 6.1 한국인 남성의 피치(f0) 값, 포먼트 값(Fn)과 표준편차(s.d.)


모음

f0

s.d.f0

F1

s.d.F1

F2

s.d.F2

F3

s.d.F3

162

25

738

87

1372

124

2573

127

165

22

591

75

1849

106

2597

110

167

26

490

105

1968

150

2644

94

172

24

341

29

2219

176

3047

146

170

25

453

47

945

134

2674

156

166

24

459

69

1817

163

2468

134

174

27

369

43

981

141

2565

173

174

26

338

30

2114

140

2729

213

165

25

608

76

1121

110

2683

145

174

26

405

37

1488

176

2497

80

       

표 6.2 한국인 여성의  피치(f0) 값, 포먼트 값(Fn)과 표준편차(s.d.)

모음

f0

s.d.f0

F1

s.d.F1

F2

s.d.F2

F3

s.d.F3

264

26

986

107

1794

108

2957

227

263

29

677

108

2285

169

3063

141

263

26

650

113

2377

77

3068

117

271

29

344

48

2814

168

3471

177

269

31

499

60

1029

143

3068

159

265

29

602

109

2195

152

3013

132

278

28

422

83

1021

139

3024

138

272

30

373

62

2704

95

3222

108

263

28

765

125

1371

108

3009

183

279

30

447

68

1703

106

2997

173

표 6.3 미국인 남성의  피치(f0) 값, 포먼트 값(Fn)과 표준편차(s.d.)

모음

f0

s.d.f0

F1

s.d.F1

F2

s.d.F2

F3

s.d.F3

æ

126

16

687

83

1743

113

2497

137

a

125

15

638

46

1051

74

2318

185

ɔ

128

20

663

62

1026

57

2527

171

e

128

18

469

36

2082

130

2636

168

ɛ

132

24

531

52

1900

84

2561

148

i

136

21

286

32

2317

104

3033

191

ɚ

130

20

490

32

1363

99

1787

165

ɪ

130

15

409

32

2012

110

2671

148

ɑ

127

15

694

89

1121

85

2548

136

o

129

18

498

41

1127

93

2375

131

ʊ

135

21

446

46

1331

102

2380

125

ʌ

127

15

592

45

1331

71

2494

167

u

135

17

333

33

1393

213

2282

114

표 6.4 미국인 여성의  피치(f0) 값, 포먼트 값(Fn)과 표준편차(s.d.)

모음

f0

s.d.f0

F1

s.d.F1

F2

s.d.F2

F3

s.d.F3

æ

209

22

825

81

2059

208

2928

95

a

205

19

782

106

1287

97

2563

173

ɔ

206

19

777

86

1140

91

2895

143

e

209

19

521

70

2536

138

2991

77

ɛ

211

20

631

57

2244

190

2968

84

i

221

23

390

32

2826

140

3416

162

ɚ

218

22

523

69

1550

110

1927

254

ɪ

216

24

466

51

2373

164

3014

94

ɑ

205

18

857

92

1255

85

2877

168

o

207

17

528

73

1206

183

2824

143

ʊ

214

20

491

56

1486

172

2836

154

ʌ

206

18

701

75

1641

89

2901

108

u

228

27

417

29

1511

326

2796

169



6.2 포먼트 측정의 실제


모음 “아” 발음에 대한 포먼트 값을 구하는 과정을 나타내어보면 다음과 같다.

1. 프라트 프로그램을 실행한다.

2. 화면 위 기본메뉴의 New를 선택하고 Record mono Sound...를 클릭 한다.

3. SoundRecorder화면이 나타나면 Sample rate를 22050으로 지정한다.

4. 왼 쪽 아래의 Record단추를 누른 뒤 마이크에 대고 “아”하고 발음한다.

5. 왼 쪽 아래의 Stop단추를 누른다.

6. 왼 쪽 아래의 Play단추를 눌러서 녹음한 음성을 들어본다. 녹음 중에 음량막대에 빨간 표시가 나타났거나 녹음된 음량이 너무 낮을 때는 다시 4, 5번을 되풀이한다.

7. 만족할 만한 음성이 되었다면 오른 쪽 위의 File메뉴의 하위메뉴인 Write to AIFC file...을 누른다.

8. 파일저장 대화창이 나오면 "a.aifc"로 입력한다.

9. 오른 쪽 아래의 Close단추를 눌러 녹음대화창을 닫는다.

10. 화면 위 기본메뉴의 Read메뉴의 하위메뉴 가운데 첫 번째 메뉴인 Read from file...을 클릭 하고 대화창에서 녹음한 프라트 폴더로 가서 a.aifc를 선택하여 연다.

11. 객체창의 분석 단추가운데 Formants & LPC- 하위메뉴인 To Formant(Burg)...를 선택한다.


그림 6.9 포먼트 측정 파라미터 설정 대화창

12. 대화창에 여성화자가 발성했을 때는 그림 6.9과 같이 지정하고 Time step을 0.005, Max. number of formants를 5, Maximum formant를 5000으로 Window length는 0.025, Pre-emphasis from은 50을 그대로 둔 채 OK 단추를 누른다. 남성화자가 발성했을 때는 Max. number of formants를 6으로 지정한다.

13. 분석결과를 그림으로 나타내려면 먼저 그림창을 선택한 뒤 마우스 왼 쪽을 누른 채 원하는 크기의 창을 선택하고, 객체창의 분석 단추 가운데 Draw-->Speckle...을 클릭 한다. 그림 6.10의 대화창에는 4000 Hz까지 나타내도록 한다.


그림 6.10 포먼트 그리기 설정 대화창


그림 6.11은 이렇게 지정한 뒤 그림창에 나타낸 포먼트 흔적이다.


그림 6.11 포먼트 흔적 그림


14. 분석결과에 대한 임의의 시간점에서의 값을 구하기 위해서는 객체창의 분석 단추가운데 Query-단추를 선택하고 대화창에서 원하는 포먼트 번호와 시간점을 입력한 뒤 OK단추를 누른다. 각 포먼트의 강한 정도를 보통 대역폭(Bandwidth)으로 나타내는데 그림 6.12와 같이 포먼트의 정점에서 3 dB아래의 낮은 주파수 부분과 높은 주파수 부분의 끝 값을 서로 뺀 폭을 말한다. 그림은 모음 ‘아’의 지속시간 중 처음부터 약 1/3 지점의 넓은대역 스펙트럼을 보여준다. 제 3포먼트의 위치가 2943 Hz인데 정점의 진폭이 약 80 dB이므로 그보다 3 dB 낮은 77 dB에서의 포먼트 대역값의 차이는 약 370 Hz가 된다. 편집창에서 이 시간점에 마우스를 클릭한 뒤 Query 메뉴아래의 Get third bandwidth를 실행해보면 약 175 Hz가 정보창에 표시된다. 이 값의 차이는 고주파역강조(Preemphasis)처리와 앞에 있는 제 1, 2포먼트 값의 방사에너지 효과가 겹쳐져 있는데 이를 걸러낸 것 때문에 차이가 난다. Fant(1970)의 논문에서도 대역 값을 정확히 구하는 것이 매우 어려움을 지적하고 있으며, 입술 밖에 나온 음성에는 많은 정보가 한꺼번에 모여있기 때문에 대역 값을 분리해 내기가 어렵다. 합성음을 만들 때는 프라트에서 구한 값들이 적절치 않는 경우가 많았는데, 이 부분에 대한 더 많은 연구가 필요하고 대역 값을 상대적으로 비교하는데 사용할 수는 있으나 절대 값으로는 사용하기 어렵다는 점만 지적해 둔다.


그림 6.12 대역폭의 측정 위치



대역폭이 좁을수록 해당 포먼트의 정점의 진폭 값이 높아지고 넓을수록 진폭 값이 낮아진다. 이 대역폭 값은 음성합성에 사용할 수 있으나 실제 합성해보면 구해진 대역폭 값이 여전히 앞 뒤 포먼트의 영향을 받기 때문에 정확도가 떨어짐을 알 수 있다. 포먼트 값의 측정도 단순히 편집창에서 하나씩 확인하기 위해 Query기능을 사용해도 좋지만, 가능하면 스크립트를 작성하여 자동으로 추출하는 것을 권장한다. 아울러, 좁은대역과 넓은대역으로 분석한 스펙트럼을 함께 그려놓고 포먼트 위치를 확인하기 바란다.




제 7 장 강도 값 측정


7.1 강도 값 측정 메뉴


 음성파형에서 강도 값은 소리의 크기를 나타내는 중요한 척도이다. 일반적으로 음성파형을 살펴보면 어떤 시간점에서의 진폭 값이 음수와 양수로 나뉘어져 있다. 따라서 각각의 값들을 그대로 더한다면 0이 되어 최대 정점 값에서 최소 정점 값까지의 진동폭을 측정하기가 곤란하다. 따라서, 음수 값을 양수 값으로 변환하기 위해 보통 진폭 값을 모두 제곱하여 더한 뒤 다시 제곱근(root-mean square)을 구하여 나타낸다. 예를 들어, 다음과 같은 파형의 진폭정보가 있다면


1 3 4 7 9 8 7 5 2 -1 -4 -5 -7 -5 -3 -1


그림 7.1 진폭 값의 그래프

이 파형의 값들을 더한다면 +/- 기호 때문에 적절한 대표 값이 될 수 없다. 부호를 없애려면 다음과 같이 제곱한다.


     1 9 16 49 81 64 49 25 4 1 16 25 49 25 9 1


이것의 합은 424가되고 평균은 27, 제곱근 값을 구하면 5.1478이 되는데 이것으로 적절한 음성의 크기를 나타낸다. 수학적 연산을 줄이기 위해서는 제곱을 하지 않고 절대 값을 구하는 함수(abs)를 이용할 수 있다.

강도를 분석하려면 분석하고자하는 음성파일을 객체창에 불러온 뒤 객체창의 분석 단추가운데 To Intensity-를 선택하면 그림 7.2와 같은 대화상자가 나타난다.


그림 7.2 강도 값 분석 파라미터 설정 대화창


Minimum pitch는 음성신호에서 최소 주기 주파수를 말한다. 이 값을 너무 높여두면 피치 값과 일치되는 진폭 변화를 보여주고 너무 낮게 지정하면 강도 윤곽이 서로 붙여져서 세밀한 변화 모양이 없는 완만한 곡선을 보여준다. 처리되는 알고리즘은 음성신호의 각 시간점의 값들을 제곱하고 Kaiser-20 창(각 프레임 신호의 양쪽이 -190 dB)으로 합친다. Time step은 몇 초 간격마다 강도 값을 구할 것인지 지정한다. 여기서는 임의로 5 밀리초 마다 구해지도록 0.005를 넣었다.

강도 값은 음성합성의 AV(Amplitude variation) 파라미터 값으로 입력하여 활용할 수 있으며, 긴 음성녹음구간에서 음성의 시작점과 끝점을 자동으로 찾아서 분리하여 저장하는데 도움이 된다.


7.2 강도 값 측정의 실제


모음 “아”를 녹음하여 강도 값을 구하는 과정을 나타내어보면 다음과 같다.

1. 프라트 프로그램을 실행한다.

2. 화면 위 기본메뉴의 New를 선택하고 Record mono Sound...를 클릭 한다.

3. SoundRecorder화면이 나타나면 Sample rate를 22050으로 지정한다.

4. 왼 쪽 아래의 Record단추를 누른 뒤 마이크에 대고 “아”하고 발음한다.

5. 왼 쪽 아래의 Stop단추를 누른다.

6. 왼 쪽 아래의 Play단추를 눌러서 녹음한 음성을 들어본다. 녹음 중에 음량막대에 빨간 표시가 나타났거나 녹음된 음량이 너무 낮을 때는 다시 4, 5번을 되풀이한다.

7. 만족할 만한 음성이 되었다면 오른 쪽 위의 File메뉴의 하위메뉴인 Write to AIFC file...을 누른다.

8. 파일저장 대화창이 나오면 a.aifc로 입력한다.

9. 오른 쪽 아래의 Close단추를 눌러 녹음 대화창을 닫는다.

10. 화면 위 기본메뉴의 Read메뉴의 하위메뉴 가운데 첫 번째 메뉴인 Read from file...을 클릭 하고 대화창에서 녹음한 프라트 폴더로 가서 a.aifc를 선택하여 연다.

11. 객체창의 분석 단추 가운데 To Intensity...를 선택한다.

12. 대화창에 Minimum pitch 값을 100으로 두고 Time step은 0.005 (5 밀리초 간격)로 입력한 뒤 OK단추를 누른다.

13. 분석결과를 그림으로 나타내려면 먼저 그림창을 선택한 뒤 마우스 왼 쪽을 누른 채 원하는 크기의 창을 선택하고, 객체창의 분석 단추가운데 Draw를 클릭 하여 그림 7.3과 같이 대화창에 기본 값으로 주어진 부분을 그대로 둔 채 OK단추를 누른다.


그림 7.3 강도 값 그리기 파라미터 설정 대화창


대화창에서 Time range는 어느 시간점부터 어느 시간점까지 결과를 그리는가를 결정한다. Minimum(dB)는 그래프로 나타낼 때 최소 강도 값, Maximum(dB)는 최대 강도 값을 각각 지정한다. 기본으로 두면 자동으로 선택한 그림 영역에 꽉 차게 그려준다. 만약 두 개의 다른 음성파일을 비교하려한다면 기본 값으로 두기보다는 최대 또는 최소 값을 각각 20 dB에서 100 dB까지 처럼 같은 기준을 두고 Garnish를 체크하지 않고 그림을 중첩하여 그려보면 상대적으로 비교해 볼 수 있다.

비교할 때는 음절길이가 다르기 때문에 절대 값의 차이보다는 두 개이상의 음절마다의 강도 정점 값의 비율을 구한 뒤에 이 비율 값을 상호 비교하여야 의미가 있는 결론을 내릴 수 있다. 물론 비율 값의 차이를 해석할 때는 청각적으로 유의미한 차이인가를 실제 음성합성을 통해 점검해보아야 한다. 모음과 같은 경우에는 전체 길이를 20등분하여 각 지점에서의 진폭 값의 누적 값을 음절마다 구해서 비교하는 것도 의미가 있을 것이다.


그림 7.4 모음 ‘아’의 강도 값 분석 결과 그림

       

14. 분석결과에 대한 임의의 시간점에서의 값을 구하기 위해서는 객체창의 분석 단추가운데 Query-단추를 선택하고 하위메뉴 가운데 하나인 Get value at time을 클릭 하면 그림 7.5와 같은 대화창이 나타난다.


그림 7.5 강도 값의 개별 지점 값 구하기 대화창


Time에 원하는 시간점(여기서는 0.5초 지점)을 입력하고 Interpolation에는 기본 값으로 체크된 Cubic을 그대로 둔 채 OK단추를 누른다.



제 8 장 음성조작


8.1 음성조작 메뉴


프라트의 프로그램 가운데 음성조작은 음성의 특징을 지정한 간격으로 분석한 뒤 지속시간과 피치 파라미터를 변형한 뒤 합성하여 들어볼 수 있다. 이 기능을 이용하면 포먼트, 진폭, 대역폭 등의 음향파라미터를 추출하여 합성하는 과정을 거치지 않고 간단하게 지속시간이나 피치 값의 변화를 주어 다양한 음성을 만들어 낼 수 있다. 지속시간과 피치 값 가운데 어떤 파라미터가 청각적인 변화를 가져오는지를 파악하는 지각실험을 할 수 있다. 물론 지속시간이나 피치계층파일을 별도로 작성하여 마우스로 직접 변화시키기보다는 수학적으로 일정한 비율이나 크기만큼 더하거나 빼는 작업을 스크립트로 실행한 뒤에 그 파일을 음성조작파일의 원래파일로 대체하여 과학적인 연구를 해 볼 수도 있다. 음성조작을 하는 과정은 다음과 같다.

먼저 객체창에 불러온 음성파일을 선택한 뒤 객체창의 분석 단추 가운데 하나인 To Manipulation...을 누르면 다음과 같은 파라미터 설정창이 나타난다.


그림 8.1 음성조작 파라미터 설정 대화창

 


Time step은 얼마의 시간 간격으로 피치 분석을 할 것인지를 지정하고 Minimum pitch는 최소 피치 값을, Maximum pitch는 최대 피치 값을 지정한다. 조작객체가 만들어지는 과정은 다음과 같다.

1. 원래의 음성파일을 Sound:To Pitch...로 피치 분석한다.

2. 피치분석결과 객체에서 구해진 피치윤곽(pitch contour)의 정보를 이용해 성문진동(glottal pulse)의 위치를 Sount & Pitch:To PointProcess를 이용해 찾아낸다.

3. 피치윤곽에서 Pitch:To PitchTier를 이용해서 여러 지점의 피치계층(pitch tier)을 만든다.

4. 빈 지속시간계층(DurationTier)을 만든다.

객체창에 결과로 Manipulation a가 나타나고 분석 단추는 그림 8.2와 같이 나타난다.


그림 8.2 객체창의 분석 단추

  

분석 단추 가운데 Manipulation help는 조작에 대한 영문설명이다. 보통은 객체창에서 작업하기보다는 Edit을 눌러 음성파형과 각 계층을 보면서 편집하는 것이 좋다. 각각의 분석메뉴가 편집창에도 나타나기 때문에 설명의 중복을 피하기 위해 그림 8.3과 같은 편집창을 열어보기로 한다.


그림 8.3 모음 ‘아’의 음성조작 편집창

이 편집창에는 위 창에는 음성파형이 있고, 그 파형에 덧붙여 피치 간격으로 Pointprocess한 파랑선 줄무늬가 나타나 있다. 아래 창에는 피치 값이 녹색 선으로 이어져 있다.

위에서 구해진 피치 계층과 지속시간 계층을 변환시키면 다음과 같이 조합하여 합성음을 재생시켜준다. PSOLA방식은 원래의 음성파일에 성대 진동, 피치 계층, 지속시간 계층을 합하여 재생하고, LPC는 원래의 음성파일에서 구한 LPC계수와 성대 진동, 피치 계층을 합쳐서 재생한다.


8.2 음성조작의 실제


“어머니”라는 음성을 녹음하고 피치와 지속시간을 변형하는 과정은 다음과 같다.

1. 프라트 프로그램을 실행한다.

2. 화면 위 기본메뉴의 New를 선택하고 Record mono Sound...를 클릭 한다.

3. SoundRecorder화면이 나타나면 Sample rate를 22050으로 지정한다.

4. 왼 쪽 아래의 Record단추를 누른 뒤 마이크에 대고 “어머니”하고 발음한다.

5. 왼 쪽 아래의 Stop단추를 누른다.

6. 왼 쪽 아래의 Play단추를 눌러서 녹음한 음성을 들어본다. 녹음 중 음량막대에 빨간 표시가 나타났거나 녹음된 음량이 너무 낮을 때는 다시 4, 5번을 되풀이한다.

7. 만족할 만한 음성이 되었다면 오른 쪽 위의 File메뉴의 하위메뉴인 Write to AIFC file...을 누른다.

8. 파일저장 대화창이 나오면 ma.aifc로 입력한다.

9. 오른 쪽 아래의 Close단추를 눌러 녹음대화창을 닫는다.

10. 화면 위 기본메뉴의 Read메뉴의 하위메뉴 가운데 첫 번째 메뉴인 Read from file...을 클릭 하고 대화창에서 녹음한 프라트 폴더로 가서 ma.aifc를 선택하여 연다.

11. 객체창의 분석 단추가운데 To Manipulation...을 선택한다.

12. 대화창에 Time step은 0.005 초 (5 밀리초 간격)로 입력하고, Minimum pitch 값 75와 Maximum pitch 값 600을 그대로 두고 OK단추를 누른다.

13. 분석결과객체인 Manipulation ma를 선택한 뒤, 객체분석 단추창의 Edit을 클릭 하면 그림 8.4와 같이 나타난다.


그림 8.4 ‘어머니’ 발성에 대한 음성조작 편집창




8.3 피치변환


14. Manipulation ma의 편집창의 기본메뉴 가운데 Pitch를 선택하고 그 아래 메뉴인 Stylize (2st)를 클릭 한다. 피치계층을 나타내는 그림에서 둥근 점으로 표시된 곳 가운데 끝점을 마우스로 누른 채 위로 끌고 가서 그림 8.5와 같이 원래의 피치 값에서 203.9 Hz가 되도록 놓는다. 이렇게 하면 이 음성의 피치 값을 임의의 값으로 바꾸는 것이 된다. 그림의 아래에 있는 음성재생 막대를 마우스로 누르면 변형된 피치의 음성을 들어볼 수 있다.

임의의 시간점에서 피치 값을 바꾸어보고 싶으면 마우스로 그 지점을 클릭  하고 Pitch메뉴에서 Add pitch point at cursor를 선택하면 둥근 점이 하나 생성된다. 이 지점을 마우스로 선택하여 위 아래로 옮겨 놓은 뒤 그림의 아래에 있는 재생막대를 마우스로 눌러 변형된 피치의 음성을 들어본다. Add pitch point at time slice를 클릭 하면 마우스가 위치한 지점에 피치변환을 할 수 있는 둥근 원이 나타난다. Add pitch point메뉴를 선택하면 Time과 Frequency를 숫자로 입력하여 정확한 피치 값의 조절에 사용할 수 있다.


그림 8.5 ‘어머니’ 발성에 대한 피치 변환 편집창

 


처음부터 피치지점을 조작할 수 있는 둥근 원을 많이 만들어 놓고 싶을 때는 14번의 첫줄에서 기본메뉴 가운데 Pitch를 선택하고 그 아래 메뉴인 Stylize를 클릭 한다.


그림 8.6 피치 변환 단계 설정 대화창


이어서 그림 8.6과 같은 대화창이 나타나면 몇 Hz간격으로(Frequency resolution) 나누어 표시할지를 지정한다. 이 값이 작으면 매우 촘촘하게 편집할 수 있는 둥근 원이 나타나고 크면 듬성듬성하게 편집할 수 있는 둥근 원이 나타난다. 이어서 편집창의 기본메뉴 가운데 File을 선택하고 하위메뉴인 Extract pitch tier를 클릭 하면 객체창에 PitchTier fromManipulationEditor라는 객체가 올려진다.

피치변환을 할 둥근 점을 없애려면 마우스로 둥근 점을 하나 선택한 다음 기본메뉴 가운데 Pitch를 선택하고 하위메뉴인 Remove pitch point(s)를 클릭 한다. 그 아래 메뉴 가운데 Set pitch range는 최대 피치 값을 지정하여 변환창에서 y축의 최대 값을 높이거나 내려서 조작하기 편하게 만들 수 있다. 그 아래의 Set pitch units는 피치단위를 Hz와 Semitones 가운데 하나로 표시할 수 있게 한다. Semitone은 주파수 값을 로그척도의 음악척도로 변환한 것이다. 계산 공식은 12 x ln(x/1000)/ln2이다. Set dragging strategy는 마우스로 피치를 조작할 때 모든 방향으로(All) 이동할 수 있거나 수평으로만(Only horizontal), 수직으로만(Only vertical), 또는 한 개일 때는 모든 방향으로, 여러 가지 피치 값을 한꺼번에 움직일 때는 수직으로만(Single all, multiple only vertical) 이동할 수 있도록 지정할 수 있다. 자동으로 피치계층을 만들어 변환하려면 아래와 같은 스크립트를 이용하여 새로운 피치계층을 만든 뒤 각 지점마다 숫자 값을 임의의 비율로 높이거나 내리기 바란다.


Create PitchTier... NewPitch 0 10

for point from 1 to 10

newvalue=('point'*10)

Add point... 'point' 'newvalue'

endfor



8.4 재생속도 변환


이번에는 재생속도의 빠름을 아래와 같이 조정하여 보자. 13번까지는 그대로 실행하고 14번부터는 다음과 같이 처리해 보자.

14. Manipulation ma의 편집창의 기본메뉴 가운데 Dur를 선택하고 그 아래 메뉴인 Add duration point at cursor를 클릭 한다. 그렇게 하면 그림 8.7과 같이 재생속도계층을 나타내는 세 번째 그림에서 마우스가 있던 지점에 재생속도를 변형할 수 있는 둥근 점이 한 개 생긴다. 이 둥근 점을 마우스로 누른 채 위로 끌고 가서 놓는다. 이렇게 하면 이 음성의 재생시간 값을 임의의 값의 빠르기로 바꾸는 것이 된다. 그림의 아래에 있는 음성재생 막대를 마우스로 누르면 지속시간이 변형된 피치의 음성을 들어볼 수 있다. 정확한 시간점을 알 때는, 기본메뉴 가운데 Dur를 선택하고 그 아래 메뉴인 Add duration point를 클릭 한다. 파라미터 대화창의 Time에 원하는 시간 값을 입력하고 Relative duration에는 원하는 속도 값을 입력한다. 이 때 1은 원래의 속도를 나타내고, 2는 1/2의 속도로 느리게 재생하고, 0.5는 두 배로 빨리 재생해준다.

그림 8.7 ‘어머니’ 발성에 대한 재생속도 변형


이 속도의 변화를 이용하면 음성의 특징을 변환하지 않고 다양한 속도로 들어볼 수 있다. 외국어 학습에서 보다 빠른 속도의 음성을 듣는 연습을 함으로써 청각기관의 적응과 집중도를 높일 수 있다고 하는데 이런 변환에 의한 청각실험도 시도해볼 만하다. 지속시간변환을 할 둥근 점을 없애려면 기본메뉴 가운데 Dur를 선택하고 하위메뉴인 Remove duration point(s)를 클릭 한다. New duration메뉴는 지금껏 편집하던 지속시간계층 정보를 모두 없애고 빈 새 지속시간계층을 보여주고 Forget duration은 지속시간계층 정보를 모두 없애준다. 더 많은 지속시간계층을 조작하고 싶을 때는 Manipulation ma의 편집창의 기본메뉴 가운데 File을 선택하고 Extract duration tier를 클릭 하면 객체창에 DurationTier fromManipulationEditor라는 객체가 올려진다. 이것을 스크립트를 이용해 변형한 뒤, 객체창에 있는 원래의 Manipulation ma 바로 밑에 불러와 두 개를 동시에 선택하고, 객체창의 분석 단추가운데 Replace duration tier를 클릭 하면 된다. 자동으로 지속시간계층을 만들어 변환하려면 다음 장에 나오는 스크립트를 이용하여 새로운 지속시간계층을 만든 뒤 각 지점마다 숫자 값을 임의의 비율로 높이거나 내리기 바란다.


 



제 9 장 프라트 스크립트


음성분석작업을 수작업으로 하나씩 처리하는데는 많은 시간이 소모되기 때문에 연구자를 쉽게 지치게 만든다. 그래서 음성학을 전공하려면 상당한 끈기가 있어야 했다. 다행히 프라트의 스크립트를 이용하면 이런 지루한 수작업들을 자동으로 처리할 수 있다. 많은 음성자료를 짧은 시간 내에 처리하여 필요한 정보를 뽑아낼 수 있다. 연구자의 역할은 수집된 정보가 바르게 처리되었는지 확인과정을 통해 잘못된 부분만 재점검하고 나머지 정보는 그대로 받아들이면 된다. 프라트의 스크립트는 많은 함수와 정의된 용어로 음성처리과정의 모든 부분을 한 단계씩 실행하면서 이를 C++과 같은 프로그램으로 구현하기 위한 알고리즘 개발에 큰 도움이 될 것이다. 특히, 처리결과를 그림창에 그려서 데이터의 구조를 살펴보고 처리과정이나 문턱 값을 정하는데 도움이 될 것이다. 이 장에서는 스크립팅에 필요한 기본적인 개념과 용어들을 정리하고 필자가 사용해 왔던 몇 가지 종합적인 스크립트를 실제로 이용하는 방법을 보여주고자 한다. 여기에 제시된 스크립트와 나머지 많은 스크립트들은 필자의 홈페이지(Http://www.dongeui.ac.kr/~bgyang)를 방문하여 파일을 다운로드 하여 연구자의 목적에 맞게 수정하여 사용하길 바란다.


9.1 스크립트 작성


스크립트를 만들려면 프라트를 실행한 뒤 기본메뉴의 Control아래 New script를 선택하면 그림 9.1과 같은 편집창이 나타난다.


그림 9.1 스크립트 편집창

  


만든 스크립트를 불러올 때는 그 아래의 Open script를 클릭 하고 파일선택 대화창에서 원하는 폴더로 들어가서 스크립트 파일을 열면 된다.


그림 9.2 스크립트 편집창의 File메뉴

       

       


그림 9.2의 파일메뉴에는 새 스크립트를 만들 때 사용하는 New, 이미 작성한 것을 불러오는 Open...이 있고, 작업 후 같은 이름으로 저장할 때는 Save를, 다른 이름으로 저장할 때는 Save as...를 사용하면 된다. 자주 쓰는 스크립트일 때는 Add to fixed menu를 실행하여 객체창의 기본 메뉴 위에 등록해 놓을 수 있으며 객체창에서 선택된 파일의 종류에 따라 메뉴가 달라지는 동적인 메뉴단추로 등록하려면 Add to dynamic menu...를 선택하면 된다. Close는 스크립트 창을 닫을 때 사용한다. 창의 오른 쪽 위의 네모박스를 클릭해도 닫힌다.


그림 9.3 스크립트 편집창의 Edit메뉴

          


그림 9.3의 Edit메뉴에는 스크립트 작업을 취소하고 원래로 돌아갈 때 Undo를 사용하고, 스크립트의 일부를 잘라 내거나(Cut), 복사하거나(Copy) 붙이기(Paste)기능이 있고 Erase로 임시메모리에 보관하지 않고 지워버릴 수 있다. Clear History는 메모리에 저장된 동작기록들을 임시메모리에서 삭제하고 지금부터 하는 작업을 기록할 때 편리하다. 프라트에서는 모든 작업들이 기록이 되어 History에 저장이 되므로 스크립트를 처음부터 하나씩 모두 타자하여 작성하기보다는 Clear history를 실행하고 원하는 동작을 실행하면 History에 저장이 된다. 이렇게 기록된 자료를 스크립트 창에서 입력하고자 하는 부분으로 커서를 옮겨놓은 뒤 Paste history를 실행하여 붙여 넣기를 한 뒤 일부를 수정한다. 마지막으로 Run메뉴에는 전체스크립트를 실행해주고 일부만을 실행하려면 Run selection을 이용하면 된다.

스크립트를 작성할 때 주의할 점은 각 명령어 대화창에 나오는 파라미터의 입력 숫자는 명령어 다음에 차례로 제시하면 되고, 체크단추는 yes, no로 표시되며, 라디오단추(◎)의 선택은 해당부분의 영어어구로 나타나게된다. 스크립트에 대한 설명부분은 줄 맨 앞에 !, #, ; 가운데 하나의 기호를 넣으면 실행하지 않는다. 이 기호를 사용하여 필요한 설명을 붙일 수 있다. 줄 맨 앞에 ...으로 시작되면 윗줄에 연속된 단어를 말한다.

객체창에 불러온 객체를 마우스로 선택하는 것은 {select 객체이름}을 쓰고 거기에 마우스로 덧붙여 선택하는 동작은 {plus 객체이름}을 제외할 때는 {minus 객체이름}을 사용한다. {}는 스크립트를 나타내는 명령어 가운데 한글이 포함된 경우를 임의로 구별시켜주기 위해 이 책의 본문 중에서만 사용하며 실제 스크립트에서는 없어야 한다. 모든 객체를 한꺼번에 선택하려면 select all을 사용한다. 선택된 음성파일의 이름을 정보창에 나타내려면 다음과 같이 입력해보면 된다.


     name$=selected$("Sound")

     print 'name$'


프라트의 숫자변수가 가질 수 있는 값의 범위는 -10308에서 +10308까지이기 때문에 계산처리상의 오류는 없다고 볼 수 있다. 각 변수에 숫자 값을 대입하려면 count=100과 같이 하면 된다. 변수 값의 첫 글자는 반드시 영문소문자가 되어야하고 그 다음 글자는 문자나 숫자 또는 밑줄을 사용해도 된다. 숫자 값의 자릿수를 표시하려면 숫자 변수 뒤에 ‘count:3’으로 하면 소수점 세 자리까지만 정보창에 결과를 표시해준다. 반올림한 정수로 표시하려면 ‘count:0’을 하면 된다. 일반적으로 유효한 자릿수는 피치나 포먼트일 경우에는 0으로 지정하면 되고 시간일 때는 3을 주어 밀리초까지 나타내도록 하면 된다. 소숫점 이하의 자릿수가 많다고 해서 정확한 것은 아니며, 통계처리에서는 소숫점이 많을수록 유효 단위 값이 달라지기 때문에 비록 유의미한 결과가 나왔더라도 실제 들어보거나 합성하여 비교해보면 무의미한 차이인 경우가 발생하게 된다. 예를 들어, 모음 음절의 지속시간 차이 값이 32.6593847394 ms라면 실제 우리가 관심을 두어야 할 부분은 소숫점을 모두 제외한 32 ms이다.

  문자변수 이름은 끝 부분에 $표시를 해야하며 name$=“Sound a”와 같이 입력할 문자의 양쪽에 인용부호를 넣는다. tab$나 newline$는 변수사이에 탭 키를 누르거나 새 줄로 바꾸어 표시하고자 할 때 사용하는 예약어이다. 참과 거짓의 판단에 사용되는 문자간의 비교에는 a$=b$로 표시하면 a, b 두 변수가 같을 때는 true 값을 돌려주고 a$<>b$로 표시하면 그 반대로 서로 다를 때 true 값을 돌려준다. 물론 크기비교 (<, >, >=, <=)나 문자끼리 더하거나 {a$+b$}, 빼기 {a$-b$}를 사용할 수 있다. 파일이름에 일정한 확장자를 붙이거나 제거하는데 도움이 된다. 아래와 같이 하면 선택한 파일이름에 덧붙여 확장자를 첨가하여 준다.


 name$=selected$("Sound")

 textname$=name$+".txt"

 print 'textname$'

 결과 --a.txt


그 외에도 문자의 길이를 알아내려면 length(name$)로 하면 된다. 전체 문자 가운데 지정한 개수의 문자를 왼 쪽부터 시작하여 꺼내려면 left("name", 3)로 하면 “nam”이 결과로 나오며 오른 쪽부터 시작하여 꺼내려면 right("name", 3)로 하면 “ame”가 결과로 나온다. 물론 중간에서 일부를 꺼내려면 mid("name", 3, 2)를 하면 “me”가 선택된다. 각 문자열의 왼 쪽에서부터의 순서 상 위치 값을 알아보려면 position=index("seoul","o")하면 position 값은 3이 된다. 문자가 없을 때는 0을 돌려준다. 오른 쪽에서부터의 특정한 문자열의 위치 값을 알려면 rindex라는 함수를 이용하면 된다.


9.2 스크립트의 기본 구조


이 절에서는 스크립트를 작성할 때 흔히 쓰이는 기본 용어들과 이를 활용한 구조와 출력 결과를 살펴보기로 한다.


조건절

스크립팅을 하다보면 어떤 조건을 만족할 때 실행하고 만족하지 않을 때는 건너뛰게 하는 조건절을 만들어야할 때가 있다. 예를 들어, 피치 값(f0)이 0보다 크면 "voiced"(유성음)이라 정보창에 인쇄하고 0이하이면 "unvoiced"(무성음)이라 인쇄시키려면 다음과 같이 스크립트를 만들면 된다.


if ‘f0'>0

    print "voiced"

  else

    print "unvoiced"

endif

 

되풀이 작업문

되풀이 작업을 할 때는 for와 repeat, while의 세 가지 방식을 이용한다. 먼저 for구문을 이용하면 아래와 같이 표현된다.


for 변수 값 from 시작 값 to 종료 값

 print 변수 값

endfor


 여기서 지정된 변수 값이 시작 값부터 1씩 증가하면서 종료 값이 될 때까지 차례로 되풀이된다. 변수 값은 흔히 되풀이 작업구문 아래서 파일 이름이나 다른 처리에 사용되는데 이 값을 1씩 감소시키려면 {종료 값-변수 값}을 해두면 된다. 예를 들어, 음성파형 a.aifc를 객체창에 불러와 0.005초마다 음성파형의 진폭 값을 20개 정보창에 인쇄하고 객체창에서 제거(Remove)하려면 다음과 같이 처리한다.


Read from file... HD:a.aifc

clearinfo

for i from 1 to 20

  timepoint=i*0.005

  db=Get value at time... ‘timepoint’ Sinc70

 print 'timepoint:2''tab$''db:3''newline$'

endfor

Remove


이 때 clearinfo는 정보창에 있던 모든 내용을 삭제한다.

이 과정을 repeat를 사용하여 처리한다면 다음과 같이 나타낼 수 있다.


Read from file... HD:a.aifc

clearinfo

i=1

repeat

  timepoint=i*0.005

  db=Get value at time... ‘timepoint’ Sinc70

  print 'tab$''timepoint:2''tab$''db:3''newline$'

   i=i+1

until i=21

Remove

 

이 때 조건절의 until의 숫자를 21로 하지 않으면 19번째 지점까지만 실행되고 끝나게 됨을 유의해야 한다. 얼마나 시행되었는지 창문에서 보려면 i에 20을 넣고 정보창에 인쇄된 i 값을 확인해보기 바란다. 이렇게 스크립트의 실행이 어디까지 진행되었는지 일종의 프로그램 진행 추적(Debugging)기능을 넣으려면 중간 중간마다 print ‘변수 값’하여 확인해 보면 된다. 그리고 마지막에서 두 번째 줄의 i=i+1로 숫자가 하나씩 더해지는 부분을 생략하면 무한으로 동작이 계속되므로 주의해야한다. 이 때는 Control+Alt+Delete 키를 동시에 눌러 [해당작업종료]를 선택하고 프라트를 종료한 뒤 Windows화면에서 다시 시작해야 한다.

또 다른 되풀이 작업으로는 이와 같이 끝 부분에 조건을 붙이지 않고 시작 부분에 조건을 붙여 만족할 때까지 되풀이해서 작업을 하는 while구문을 사용한다. 위의 스크립트를 while로 처리해보면 다음과 같다.


Read from file... HD:a.aifc

clearinfo

i=1

while i<21

  timepoint=i*0.005

  db=Get value at time... ‘timepoint’ Sinc70

  print 'i''tab$''timepoint:2''tab$''db:3''newline$'

   i=i+1

endwhile

Remove


서브루틴(subroutines)

프라트 스크립트에는 서브루틴을 이용하여 자주 되풀이 사용되는 부분을 정의하고 필요한 곳에서 얼마든지 불러낼 수 있다. 우리가 글을 쓸 때도 되풀이되는 부분이 여기 저기에 반복되어 있다면 매우 지저분하고 명확한 개념을 파악하기 어려울 것이다. 서브루틴을 호출하는 방법은 {call 서브루틴이름 변수}이다.

예를 들어, 다음 두 줄이 여러 곳에서 되풀이되어 사용되는 스크립트가 있다고 가정해보자.


  db=Get value at time... ‘timepoint’ Sinc70

  print 'i''tab$''timepoint:2''tab$''db:3''newline$'

위의 두 줄을 스크립트 내의 다른 곳에서도 몇 번 더 사용해야한다면 다음과 같이 서브루틴으로 만들고 while안에서 불러올 수 있다.


Read from file... HD:a.aifc

clearinfo

i=1

while i<21

  timepoint=i*0.005

  call printdb

   i=i+1

endwhile

procedure printdb

   db=Get value at time... ‘timepoint’ Sinc70

   print 'i''tab$''timepoint:2''tab$''db:3''newline$'

endproc


서브루틴에서 값을 처리하여 받아야 할 때는 프로시저 이름 다음에 입력할 숫자나 문자를 입력하면 된다. 다음 서브루틴은 두 개의 값을 받아서 곱한 값과 더한 값을 정보창에 제시하여 준다.


call calculator 3 5

print 'add''tab$''multiple'

procedure calculator x y

   add=x+y

   multiple=x*y

endproc

그림 9.4 숫자 계산 결과 정보창

        

물론 x$, y$로 입력변수를 지정하면 문자 값 변수끼리 연산할 수도 있다.


배열(Series)

문자와 숫자를 결합하여 변수 이름을 지정하고 스크립트에서 사용하고자 할 때는 다음과 같이 지정할 수 있다. 만일 포먼트 값을 따로 지정하여 처리하고자 할 때는 다음과 같이 스크립트를 작성한다.


for i from 1 to 5

 formant'i'=Get value at time... i 'timepoint' Hertz Linear

endfor


위의 되풀이 작업을 실행하면 formant1, formant2, formant3...formant5에 각각의 값들이 입력되어진다. 이렇게 제한된 수의 값들이 아닌 많은 행렬의 자료를 파일로 저장한 뒤에 연산에 사용하려면, 앞으로 설명할 행렬을 만들어 각 셀의 값들을 불러와 작업하는 것이 좋다.

스크립트 작업 가운데 사용자에게 메시지를 보내지 않고 끝나게 하려면 exit이란 단어를 넣으면 된다. 이 때 스크립트 작업에 의해 주어진 파라미터의 값들은 모두 사라진다. 파라미터의 값을 그대로 보존한 채 사용자에게 오류 메시지를 보내면서 작업을 중단하고 싶으면 {exit error-message}로 하면 된다.


call calculator 3 5

error$="Error here"

print 'add''tab$''multiple'

 exit 'error$'

procedure calculator x y

   add=x+y

   multiple=x*y

endproc


이 스크립트를 실행하면 그림 9.5와 같이 8, 15 라는 계산 값을 제시하고는 "Error here"라는 메시지를 창에 제시하고 더 이상 실행이 되지 않는다. 긴 스크립트를 만든 뒤, 끝까지 실행하는데 시간이 많이 걸릴 때 중간 부분까지만 실행하고 결과를 확인해 볼 경우에 사용하면 편리하다.

그림 9.5 오류정보 표시 정보창

   

입력 폼(Form)

그림 9.6과 같이 대화창을 나타내어 사용자의 파라미터 입력을 받아 다양한 처리를 할 수 있다. form을 이용하여 파일 이름을 불러오고 숫자를 지정하는 스크립트를 다음과 같이 쓸 수 있다.


form foldename, filename and number to define for your work.

  word fld foldername

  word fn filename

  integer num 9

endform

그림 9.6 form 파라미터 입력 대화창


이 때 form 다음에 오는 문장은 어떤 용도인지 대화창에 인쇄되는 설명을 나타내고 그 다음 줄에 올 수 있는 표현은 {예약어 변수이름 기본 값}의 순서로 제시된다. 예약어로는 real(실수), positive(양의 정수) natural(양의 자연수), sentence(짧은 문장), text(긴 문자열), boolean(체크박스), choice(선택 값), button(라디오 단추) comment(설명문)가 올 수 있다. endform 아래에 form안에서 정의된 변수 이름을 이용하여 하드디스크에 저장할 파일이름으로 사용할 수 있다.

정보창에 나타내기

기존 정보창에 있는 자료를 지우고 안내문이나 필요한 정보를 나타내려면 {echo Now the script is running....}을 사용한다. 그림 9.7은 이렇게 실행한 결과를 보여준다.

그림 9.7 안내문 출력 정보창

정보창의 자료를 모두 없애는 것은 {clearinfo}라고 입력한다. 문자열을 연속해서 제시하려면 {print 문자열}을 하고, {printtab}이나 {printline 문자열}을 하면 정보창에서 한 줄을 바꾸어 나타내어준다. 이것들을 단어로 표현할 때는 {'tab$'} 또는 {'newline$'}로 표시하면 된다.

다음 스크립트는 구구단을 정보창에 그림 9.8과 같이 나타내어 준다.


clearinfo

for i from 1 to 10

     for j from 1 to 10

       multiple='i'*'j'

      print 'i''tab$'X'tab$''j''tab$'='multiple''newline$'

     endfor

endfor


그림 9.8 구구단 출력 정보창

아주 긴 스크립트를 작성하여 처리시간이 오래 걸릴 때 몇 번 째 까지 진행되고 있는지를 정보창에 표시하고 싶다면 아래와 같은 줄을 더 첨가하면 된다.


    final=1000-'i'

    print Current loop at 'i' / 'final' more loops to go

   (긴 작업 처리과정 스크립트)

    clearinfo


예를 들어, 30번째 작업이 진행되고 있을 때 정보창에 “Current loop at 30 / 970 more loops to go”가 나타나고 그 사이에 있는 긴 작업 처리과정이 끝나면 clearinfo에 의해 이것이 지워지고 “Current loop at 31 / 969 more loops to go”가 표시된다.


문의(Query)

어떤 음성파일을 불러와 지정한 시간점에서의 소리의 크기를 정보창에 나타낼 때는 다음과 같이 스크립트를 작성한다.


Read from file...HD:a.aifc

clearinfo

amp=Get value at time... 0.5 Sinc70

amp$=Get value at time... 0.5 Sinc70

print 'amp:3''tab$''amp$'

결과--0.062 0.062017642587644292 Pascal


이렇게 하면 결과에서 보이듯이 amp로만 하면 뒤에 오는 단위는 생략하고 숫자만 받는 변수가 되며 amp$로 하면 뒤에 따라오는 단위까지 포함한 값을 돌려준다.


파일입출력

일반적으로 음성분석을 할 때 하나씩 값을 구하여 저장하려면 엄청난 시간이 소모된다. 가능하면 파일입출력 기능을 이용하여 하드디스크에 저장하고 나중에 통계프로그램이나 마이크로소프트 엑셀을 이용하여 그래프로 그린 뒤 평균과 표준편차에서 지나치게 벗어난 값들은 재점검하는 것이 좋다. 파일을 저장할 때는 {fileappend ‘filename$’}를 사용한다. 다음은 하드디스크에 파일이 있는지를 확인해보고, 만일 있다면 “There is a file”이란 메세지를 정보창에 나타내고 없다면 파일을 새로 생성하여 자료를 입력해주는 스크립트이다.


filename$="HD:newfile.txt"

if fileReadable('filename$')

    print There is a file with the same name!

 else

 fileappend 'filename$' I saved this file on my computer.

endif


만약에 앞서의 구구단을 정보창에도 표시하고 하드디스크에 multiple.txt라는 이름으로 저장하려면 다음과 같은 스크립트를 사용한다.


clearinfo

filename$="HD:multiple.txt"

for i from 1 to 10

     for j from 1 to 10

       multiple='i'*'j'

          print 'i''tab$'X'tab$''j''tab$'='multiple''newline$'

       fileappend 'filename$''i''tab$''j''tab$''multiple''newline$'

     endfor

endfor


이미 작성한 파일이 더 이상 필요 없을 때는 {filedelete 'filename$'}라는 스크립트를 입력하면 된다. 정보창에 있는 정보를 그대로 파일로 저장할 때는 {fappendinfo 'filename$'}를 사용하면 된다.


사용자와의 통신

스크립트 처리과정을 일단 중지하고 사용자에게 질문을 하여 계속할건지(Continue), 중단할건지(stop) 단추로 선택하게 하는 스크립트는 아래와 같이 작성한다.


pause What do you want?


이것을 실행하면 그림 9.9와 같은 대화창이 나타난다.


그림 9.9 스크립트 일시 중단 대화창


행렬(Matrix)

프라트 프로그램의 객체창의 분석메뉴 가운데 To Matrix 단추로 표시된 행렬이 있다. 행렬이란 마이크로소프트 엑셀과 같은 프로그램에서 각각의 숫자 데이터를 행과 열로 참조된 파일로 나타내는 것을 말한다. 음성파일 자체는 물론이고 분석 결과 객체도 모두 행렬로 나타내어 여러 가지 필요한 연산을 할 수 있다. 음성파일을 행렬로 바꾸면 한 개의 줄과 표본 값의 수만큼의 열로 되어있다. 스펙트럼을 행렬 객체로 바꾸면 두 개의 줄로 되어 있는데 첫 번 째 줄은 실수부이고, 두 번 째 줄은 허수부가 된다. 스펙트로그램을 행렬 객체로 바꾸면 두 개의 줄로 되어 있는데 첫 번 째 줄은 주파수를 나타내고 각 열은 시간 값을 나타낸다. 기본 메뉴에서 New-->Matrix--> Create simple matrix...를 선택하면 그림 9.10과 같은 대화상자가 나타난다.


그림 9.10 행렬 작성 대화창



이 대화상자에서 Number of rows는 몇 개의 줄로 된 행렬을 만드는가를 지정하고 Number of columns는 몇 개의 열로 된 행렬을 지정하는 것이 된다. Formula에는 각 셀에 들어갈 값들을 열과 행의 곱으로 지정하고 있다. 이 공식란에 0을 입력하면 각 셀에 0이 들어가게 된다. OK단추를 누르면 3X3으로 된 9개의 셀이 생성되고 다음과 같은 값들이 객체창에 올라온 Matrix xy에 들어있게 된다.


 

1열

2열

3열

1줄

1

2

3

2줄

2

4

6

3줄

3

6

9


이 값을 확인해 보려면 Matrix xy가 선택된 상태에서 객체창에 있는 분석 단추가운데 Query-->Get value in cell을 선택하고 대화창에 원하는 행과 열을 지정하여 OK단추를 누르면 된다. 물론 스크립트 창에서도 아래와 같이 입력하여 실행하면 이 값들을 차례로 정보창에 인쇄해준다.


clearinfo

select Matrix xy

for i from 1 to 3

     for j from 1 to 3

       val=Get value in cell... i j

        print 'val''newline$'

     endfor

endfor


덧붙여, Matrix xy가 선택된 상태에서 객체창에 있는 분석 단추가운데 Modify-->Set value in cell을 선택하고 대화창에 원하는 행과 열을 지정하여 OK단추를 누르면 각 셀의 값을 임의로 바꿀 수 있게 된다. 모든 값을 0으로 바꾸려면 다음과 같이 스크립트를 만들어 실행시키면 된다.


select Matrix xy

for i from 1 to 3

     for j from 1 to 3

       val=Set value... i j 0

     endfor

endfor


위의 스크립트는 셀을 하나씩 바꾸어 나가는 것인데, 변형할 값이 일정하다면, 한꺼번에 행렬의 데이터를 변환하는 Formula기능을 이용한다. 객체창의 분석 단추가운데 하나인 Modify-->Formula를 실행하고 대화창에 0이나 원하는 숫자를 입력하면 된다. 물론 행렬 값을 모두 -로 바꾸려면 대화창에 -self라고 입력하면 된다. self+self[row, col-1]은 한 셀(self)과 이전 셀(self[row, col-1])을 더하여 결국에는 모든 셀의 값들을 합해준다. 이 행렬객체는 여러 개의 스펙트럼 정보를 평균하여 따로 저장하거나 객체창에서 값들을 저장하였다가 호출하는 경우에 매우 편리하다.

기본메뉴의 New아래의 하위메뉴인 Matrix:Create simple Matrix...가 단순한 행렬을 생성하는 반면 Create Matrix...는 보다 복잡한 정보를 나타낼 수 있다. 이 메뉴를 선택하면 그림 9.11과 같은 대화창이 나타나는데, 각 행렬의 행과 열의 수에 덧붙여 얼마의 간격으로 행과 열이 증가하는지 (dx, dy) 각 셀의 초기 값 (x1, y1), 각 행과 열의 최대 값(xmax, ymax)과 최소 값(xmin, ymin)을 나타낸다. 이 값들은 음성파일이나 스펙트럼 정보를 행렬로 바꿀 때 자동으로 입력되기 때문에 음성처리의 문턱 값으로 활용할 수 있다.

그림 9.11 복합 행렬 파라미터 설정 대화창




9.3 스크립트를 이용한 분석의 실제


그림 9.12는 숫자음 ‘일’을 분석한 뒤 음성파형 부분을 윗 부분에 나타내고 그 아래에는 스펙트로그램을 그린 뒤 포먼트 궤적을 그려 넣고, 피치와 강도변화를 표시하였다. 한글로 설명된 부분은 실제로 스크립트에 입력해서는 안되고 참고로만 하기 바란다.

그림 9.12를 만들기 위해 작성한 스크립트는 다음과 같다.


Read from file... HD:1.aifc 하드디스크에서 음성파일 1을 불러와

select Sound 1 객체창에서 음성파일 1을 선택하고

To Pitch... 0.01 75 600 피치를 분석한 뒤

select Sound 1

To Spectrogram... 0.005 5000 0.002 20 Gaussian 스펙트로그램을 분석하고

select Sound 1

To Formant (burg)... 0.01 5 5500 0.025 50 포먼트를 구하고

select Sound 1

To Intensity... 100 0 강도 값을 구하고

Erase all 그림창의 모든 것들을 깨끗이 지운 뒤


그림 9.12 숫자음 ‘1’의 분석 결과 그림



select Sound 1

Blue 파랑색 선을 선택하고

Line width... 1 선의 굵기는 1로 하고

Viewport... 0.5 6 1 2.5 음성파형 창을 그릴 창문의 크기를 선택하고

Draw... 0 0 0 0 yes 음성파형을 그린다. 마지막의 yes는 x, y축에 제목과 눈금을 표시한다.

Viewport... 0.5 6 2.5 7 스펙트로그램과 포먼트를 그릴 창문을 선택하고

select Spectrogram 1 객체창에서 스펙트로그램을 선택한다.

Paint... 0 0 0 0 30 6 0 yes 기본 값을 받아들이되 스펙트로그램 Range를 30으로 지정하여 연하게 그린다.

select Pitch 1 객체창에서 피치분석 결과를 선택한다.

Red 빨간색을 선택한다.

Draw... 0 0 0 500 no 마지막의 no는 x, y축에 제목과 눈금을 표시하지 않는다.

select Formant 1 포먼트분석 결과를 선택한다.

Yellow 노랑색을 선택한다.

Line width... 2 선의 굵기를 2로 지정한다.

Speckle... 0 0 5000 30 no 점점이 포먼트의 궤적을 표시한다.

Blue 파랑색을 선택한다.

select Intensity 1 강도 값 분석 결과를 선택한다.

Draw... 0 0 0 0 no 선으로 궤적을 표시한다.

Viewport... 5.5 6 8.5 9 선택된 그림창에서 마우스를 옮겨서 그림창의 다른 공간이 선택되게 한다. 이렇게 하면 겹쳐져 그려진 그림을 화면 캡쳐 프로그램을 이용하여 쉽게 아래아한글로 작성 중인 논문에 옮겨갈 수 있게된다.


9.4 복잡한 음성분석 스크립트


  그러면 지금까지의 스크립트의 기본 용어를 활용하여 보다 복잡한 음성분석을 해 보자. 먼저 객체창에 불러온 음성파일의 전체지속시간을 구하여 각각을 20등분하여 각각의 시간점에서의 값들을 측정하는 스크립트를 소개한다.


getnameofselected soundName Sound 객체창에 있는 음성파일의 이름을 받는다.

name$="'soundName'" 이 이름을 name$란 변수에 넣는다.

dur=Get duration 전체음성의 지속시간을 구해 dur란 변수에 넣는다.

finish='dur'-0.04 전체음성의 끝 부분에서 40밀리초의 구간은 버리고 분석의 끝이 될 시간점을 finish란 변수에 넣는다.

duround=round('dur'*1000)지속시간을 밀리초의 단위로 반올림한다.


call setting 각 변수에 기본 값을 부여하고 기본분석을 한다.

call drawall 분석 결과를 그림파일로 나타낸다.

call sylpoint 분석 구간마다 피치 값이 구해지는 음절의 시작점과 끝점을 찾는다.

call analyze 지속시간을 20등분하여 각 시간점에서 피치, 진폭, 포먼트 값 등을 분석한다.

call removeall 분석하면서 생긴 파일들을 객체창에서 모두 제거한다.


procedure sylpoint

 select Pitch 'name$' 피치분석결과 파일을 선택한다.

 timer=0.005 처음 분석할 시간점의 출발지점을 0.005초로 지정한다.

   while  'timer'<'finish' 분석할 시간점이 분석 끝 시간점보다 작으면 while 구문 안의 내용을 실행한다.

    call f00 피치 값을 구한다.

         while 'f0'=0 and 'timer'<'finish' 피치 값이 0이고 분석할 시간점이 분석 끝 시간점보다 작으면 while 구문 안의 내용을 실행한다.

            i='i'+1 카운터 변수를 실행할 때마다 하나씩 증가시킨다.

            timer='i'*0.005+0.04 카운터 값에 5밀리초를 더하여 시간점을 지정한다.

             call f00

         endwhile

     onset'p'='timer' 앞의 연속루프를 빠져 나온 시간점 값을 onset'p'에 입력한다.


     while 'f0'>0 and 'timer'<'finish' 여기서부터는 피치 값이 0보다 큰 값이고 분석할 시간점이 분석 끝 시간점보다 작으면 while 구문 안의 내용을 실행한다.

          i='i'+1

          timer='i'*0.005+0.04

          call f00

          endwhile

          offset'p'='timer'

앞의 되풀이 작업을 빠져 나온 시간점 값을 배열값인 offset'p'에 입력한다.

        p='p'+1   p는 피치가 0보다 큰 음절 수를 나타내는 변수가 된다. 

 print 'p''newline$' 음절 번호를 정보창에 찍어준다.

   endwhile


endproc


procedure f00 피치 값 구하는 서브루틴

   f0=Get value at time... timer Hertz Linear 분석시간점인 timer에서 피치 값을 구해 f0변수에 넣어준다.

     if 'f0'=undefined 피치 값이 구해지지 않으면

        f0=0 변수 f0에 0을 대입한다.

     endif

endproc


procedure analyze 음절을 20등분하여 각 시간점의 음향 값을 구하는 서브루틴

   for j from 1 to p-1 음절수만큼 되풀이해서 실행한다.

   copy onset'j' onsetpnt 시작점의 값을 변수 onsetpnt에 넣는다.

   copy offset'j' offsetpnt 끝점의 값을 변수 offsetpnt에 넣는다.

   syldur='offsetpnt'-'onsetpnt' 끝점과 시작점의 차이를 계산하여 음절의 지속시간을 구한다.

    if 'syldur'>0.05 만약 음절의 지속시간이 50밀리초 이상이면

       sylratio='syldur'/20 음절의 지속시간을 20등분하여

     for k from 1 to 20 변수 k가 20이 될 때까지

       timer='k'*'sylratio'+'onsetpnt' 시작점에 1/20씩 더하여 측정시간점을 옮겨가면서

     call intenser 음성의 강도 값을 구하고

       call pitcher 음성의 피치 값을 구하고

       call formanter 음성의 포먼트 값을 구하고

       call matrix 행렬로 각 셀의 값의 평균과 표준편차를 구한 뒤에

       call rounder 각 값들을 반올림하여

       call printdata 정보창에 결과를 제시한다.

     endfor

     endif

   endfor

endproc


procedure rounder 파라미터 값을 반올림하는 서브루틴

     db=round('db') 변수 db를 반올림한다.

     f0=round('f0')

     fm1=round('fm1')

     fm2=round('fm2')

     fm3=round('fm3')

endproc


procedure matrix 각 파라미터를 배열 값에 넣는 서브루틴

     db'k'='db'

     f0'k'='f0'

     fm1'k'='fm1'

     fm2'k'='fm2'

     fm3'k'='fm3'

endproc


procedure setting 정보창, 그림창의 내용을 지우고 파라미터의 기본 값을 부여하는 서브루틴

     clearinfo 정보창에 들어있는 내용을 모두 지우고

     Erase all 그림창에 있는 그림들을 모두 지우고

     Viewport... 1 7 1 7 그림창의 이 좌표 값을 마우스로 선택하여

     i=1 변수 i의 기본 값으로 1을 대입한다.

     j=1

     k=1

     p=1

     timer=0

endproc


procedure drawall 기본 분석과 그림 그리기 서브루틴

     select Sound 'name$' 음성파일을 선택하여

     To Spectrogram... 0.005 4000 0.002 20 Gaussian  5밀리초마다 스펙트로그램을 구하여 4000 Hz까지 구하고

     Paint... 0 0 0 0 35 6 0 yes 그림창에 스펙트로그램을 그리고 시간과 주파수 값을 표시하고

   select Sound 'name$'

    To Formant (sl)... 0.005 5 5500 0.025 50  0.005초마다 포먼트 값을 구하여

    Speckle... 0 0 4000 30 no 그림창에 포먼트 값을 점으로 그리고 시간과 주파수 값은 표시하지 않고

    Rename... sl 파일이름을 sl이라 변경하고

    select Sound 'name$'

    To Formant (burg)... 0.005 5 5500 0.025 50

    Rename... burg 파일이름을 burg라 변경하고

    select Sound 'name$'

    To Pitch (ac)... 0.005 75 3 yes 0.03 0.45 0.01 0.35 0.14 600 피치 값을 5밀리초 마다 구하여

     Draw... 0 0 0 500 no 그림창에 스펙트로그램을 그리고

     gf0mean=Get mean... 0 0 Hertz 전체음성의 피치 값의 평균을 구하여 변수 gf0mean에 대입하고

     gf0stdev=Get standard deviation... 0 0 Hertz 전체음성의 피치 값의 표준편차를 구하여 변수 gf0mean에 대입하고                                    

     gf0high='gf0mean'+'gf0stdev'변수 gf0high에 평균에 표준편차를 더한 값을 대입하고

     gf0low='gf0mean'-'gf0stdev'

변수 gf0low에 평균에서 표준편차를 뺀 값을 대입하고

     select Sound 'name$'

     To Intensity... 100 0.005 강도 값을 5밀리초마다 구하여

      Draw... 0 0 0 0 no 그림창에 강도변화를 그리고

        gdbmean=Get mean... 0 0

        gdbstdev=Get standard deviation... 0 0 전체음성의 강도 값의 평균을 구하여 변수 gdbmean에 대입하고

     gdbcut='gdbmean'-'gdbstdev'변수gdbcut에 평균에서 표준편차를 뺀 값을 대입하고

     Viewport... 9 9.001 9.001 9.002 그림창의 모서리를 선택하여 그림 선택을 해제한다.

endproc


procedure window 갑작스런 파라미터 값의 변화를 걸러주는 서브루틴

    avrange=0.01 평균창의 길이

    avon='timer'-avrange 시간 점에서 평균창의 길이만큼 빼서 변수 avon에 넣고

    avoff='timer'+avrange 시간 점에서 평균창의 길이만큼 더해주고 변수 avoff에 넣는다.

endproc


procedure intenser 강도 값을 구하는 서브루틴

    select Intensity 'name$' 강도 분석 결과 객체를 선택하여

    call avsddb

     db=Get value at time... timer Cubic 해당 시간점의 진폭 값을 구하여

      if 'db'>'dbhigh' or 'db'<'dblow' 앞서 구한 강도 값의 최대 값과 최소 값 범위를 넘어서면

      db='avdb' 평균 값을 취하여 극단 값을 피하고

     endif

endproc


procedure avsddb 지정된 창문안의 강도 값의 평균과 표준편차를 구하는 서브루틴

    call window

      avdb=Get mean... avon avoff 평균창의 길이 안에 있는 강도 값의 평균 값을 구하고

      sddb=Get standard deviation... avon avoff 평균창의 길이 안에 있는 강도 값의 표준편차를 구하여

      dbhigh='avdb'+'sddb'최대 값의 범위를  변수 dbhigh에 대입하고

      dblow='avdb'-'sddb'최소 값의 범위를  변수 dblow에 대입한다.

endproc


procedure pitcher 피치 값을 구하는 서브루틴

   select Pitch 'name$'

     call avsdf0 피치 값의 평균과 표준편차를 구하여

     call f00

    if 'f0'>'f0high' or 'f0'<'f0low' or 'f0'>350 or 'f0'<70 변수 f0가 이 범위의 값을 넘어서면

    f0='avf0' 평균 값으로 대체하고

   endif

   if 'f0'=undefined

      f0=0

   endif

   if 'f0'>'gf0mean'+2*'gf0stdev'

   f0='gf0mean'+randomInteger(3,0) 피치 값이 표준편차의 2배를 넘으면 자연성을 살리기 위해 전체 평균 값을 난수 값을 더하여 입력하고

   endif

endproc


procedure avsdf0 지정된 창문안의 피치 값의 평균과 표준편차를 구하는 서브루틴

 call window

 avf0=Get mean... avon avoff Hertz 20밀리초의 창에서 평균피치 값을 구하고

  sdf0=Get standard deviation... avon avoff Hertz 20밀리초의 창에서 피치 값의 표준편차를 구하고

  f0high='avf0'+3*'sdf0' 평균에서 3표준편차 떨어진 지점의 최대 값을 지정    

  f0low='avf0'-3*'sdf0' 평균에서 3표준편차 떨어진 지점의 최소 값을 지정

endproc


procedure  formanter 포먼트 값을 구하는 서브루틴

   select Formant sl

   call avsdfm 포먼트 값의 평균과 표준편차 구하기

   call formantlohi 포먼트 값의 최대 값과 최소 값을 넘으면 평균으로 대체

   call formantrim 포먼트 값을 반올림함

 endproc


 procedure formantlohi 포먼트의 최대 값과 최소 값을 구하는 서브루틴

    fm1=Get value at time... 1 timer Hertz Linear 시간점에서 제1포먼트 값 구함

    fm2=Get value at time... 2 timer Hertz Linear

    fm3=Get value at time... 3 timer Hertz Linear

    fm4=Get value at time... 4 timer Hertz Linear

    if 'fm1'>'fm1high' or 'fm1'<'fm1low' 제1포먼트 최대 값과 최소 값을 넘으면

    fm1='avfm1' 평균 값으로 대체

    endif

    if 'fm2'>'fm2high' or 'fm2'<'fm2low'

       fm2='avfm2'

    endif

    if 'fm3'>'fm3high' or 'fm3'<'fm3low'

       fm3='avfm3'

    endif

    if 'fm3'=undefined

     fm3='fm2'+200 제3포먼트 값이 구해지지 않으면 제2포먼트에 200을 더함

   endif

     if 'fm4'>'fm4high' or 'fm4'<'fm4low'

      fm4='avfm4'

    endif

     if 'fm4'=undefined

     fm4='fm3'+300

    endif

 endproc


procedure formantrim 합성용 파일을 만들 때 두 개의 포먼트가 너무 가까우면 합성음이 찌그러지기 때문에 포먼트 값을 어느 정도 분리시키는 서브루틴

      fm1=round('fm1') 포먼트 값을 반올림함

      fm2=round('fm2')

      fm3=round('fm3')

      fm4=round('fm4')

      fm5=4400

     fm6=4990

     if ('fm4'+300)>'fm5'제4포먼트 값과 제5포먼트 값이 근접했으면

      fm4='fm4'-300 제4포먼트 값에서 300을 뺀 값을 지정함

     endif

     if 'fm3'+300>'fm4'

       fm3='fm3'-300

     endif

     if ('fm2'+200)>'fm3'

     fm2='fm2'-200

     endif

     if ('fm1'+200)>'fm2'

      fm1='fm1'-200

     endif

endproc


procedure  avsdfm 지정된 창문 안의 포먼트 값의 평균과 표준편차를 구하는 서브루틴

     call window 해당 시간점에서 앞 뒤 20 밀리초의 시작점과 끝점으로 된 창문 값을 받아서

     avfm1=Get mean... 1 avon avoff Hertz 이 창문 안의 제1포먼트 평균 값을 구하고

     sdfm1=Get standard deviation... 1 avon avoff Hertz 이 창문 안의 제1포먼트 표준편차 값을 구하고

     fm1high='avfm1'+'sdfm1' 제1포먼트의 최대 값을 구하고

     fm1low='avfm1'-'sdfm1' 제1포먼트의 최소 값을 구한다

     avfm2=Get mean... 2 avon avoff Hertz

     sdfm2=Get standard deviation... 2 avon avoff Hertz

     fm2high='avfm2'+'sdfm2'

     fm2low='avfm2'-'sdfm2'

     avfm3=Get mean... 3 avon avoff Hertz

     sdfm3=Get standard deviation... 3 avon avoff Hertz

     fm3high='avfm3'+'sdfm3'

     fm3low='avfm3'-'sdfm3'

     avfm4=Get mean... 4 avon avoff Hertz

     sdfm4=Get standard deviation... 4 avon avoff Hertz

     fm4high='avfm4'+'sdfm4'

     fm4low='avfm4'-'sdfm4'

endproc


procedure removeall 객체창에 분석된 결과들을 모두 제거하는 서브루틴

     select Pitch 'name$' 피치 분석 결과 객체를 선택하여

     Remove 객체창에서 제거한다.

     select Spectrogram 'name$' 스펙트로그램 분석 결과 객체를 선택하여

     Remove

     select Intensity 'name$' 강도 분석 결과 객체를 선택하여

     Remove

     select Formant sl 포먼트 분석 결과 객체를 선택하여

     Remove

     select Formant burg 포먼트 분석 결과 객체를 선택하여

     Remove

endproc



procedure printdata 분석 결과를 정보창에 보여준다.

    print 'timepoint''tab$''f0''tab$''db''tab$''fm1''tab$''fm2''tab$''fm3''newline$'

endproc


procedure writedisk 분석 결과를 하드디스크에 기록한다.

  fileappend HD:'soundName$' 'timepoint''tab$''f0''tab$''db''tab$''fm1''tab$''fm2''tab$''fm3''tab$''fm4''newline$'

endproc



9.5 스펙트럼간의 상관계수를 구하기 위한 스크립트


  음성파일을 서로 비교하여 동일한 사람이 발성한 음성인지 다른 사람의 음성인지를 확인하는 과정에서 스펙트럼을 이용할 수 있다. 물론 스펙트럼 정보의 절대 값의 차이를 함께 조사하는 것이 바람직하겠지만 음성의 크기에 따라 스펙트럼진폭 값이 달라지기 때문에 상관계수를 동시에 구하는 것이 좋다. 다음 스크립트는 상관계수를 구하기 위한 것으로 일반 통계 프로그램으로 처리한 결과와 비교했을 때 차이가 없음을 확인했다.


clearinfo

form Put names of Matrix for correlation coefficient 상관계수를 구하기 위한 두 개의 행렬의 이름을 대화창을 통해 지정한다.

       text mat1 firstName

       text mat2 secondName

endform

select Matrix 'mat1$' 첫 번 째 행렬을 선택하여

nocol1=Get number of columns 총 열 수를 구하여 nocol1변수에 넣고

select Matrix 'mat2$'

nocol2=Get number of columns

if 'nocol1'>'nocol2' 첫 번 째 행렬이 두 번 째 행렬과 열 수가 다르면

    nocol='nocol2' 동일하게 맞추어 주고

   else

    nocol='nocol1'

endif

select Matrix 'mat1$'

    timer=1 기본 값을 지정한다.

   sumx=0 누적합 값을 기본 값 0으로 지정한다.

  while 'timer'<'nocol'+1 횟수 timer변수가 마지막 열 수가 될 때까지

    xn=Get value in cell... 1 'timer' 첫 번 째 줄의 횟수 값에 해당하는 열의 셀 값을 구하고

        sumx='sumx'+'xn'  누적해 나간다.

    timer='timer'+1 횟수 값을 하나 더한다

  endwhile


select Matrix 'mat2$'

   timer=1

   sumy=0

   while 'timer'<'nocol'+1

         yn=Get value in cell... 1 'timer'

        sumy='sumy'+'yn' 

        timer='timer'+1

    endwhile


select Matrix 'mat1$'

      timer=1

       sumxx=0

   while 'timer'<'nocol'+1

         xn=Get value in cell... 1 'timer'

        sumxx='sumxx'+'xn'*'xn' 첫 번 째 행렬의 각 열의 값을 제곱한 것의 누적합을 구한다.

        timer='timer'+1

    endwhile


select Matrix 'mat2$'

   timer=1

   sumyy=0

   while 'timer'<'nocol'+1

         yn=Get value in cell... 1 'timer'

        sumyy='sumyy'+'yn'*'yn'

        timer='timer'+1

    endwhile

        timer=1

       sumxy=0

   while 'timer'<'nocol'+1

      select Matrix 'mat1$'

      xn=Get value in cell... 1 'timer'

      select Matrix 'mat2$'

      yn=Get value in cell... 1 'timer'

        sumxy='sumxy'+'xn'*'yn' 첫 번 째 행렬과 두 번 째 행렬의 각 열의 값을 곱한 것의 누적합을 구한다.

        timer='timer'+1

    endwhile


rxy=(('nocol'*'sumxy'-('sumx'*'sumy')))/(((('nocol'*'sumxx')-('sumx')^2))^0.5*(('nocol'*'sumyy'-('sumy')^2))^0.5)

상관계수를 구하는 공식에 위에서 구한 값들을 입력하여 계산한다.

print sumx  'sumx:0'  sumy 'sumy:0' sumxx  'sumxx:0'   sumyy 'sumyy:0'  sumxy 'sumxy:0' rxy  'rxy:4'

각각의 누적 값과 상관계수  rxy를 구하여 정보창에 인쇄한다.


9.6 라링고그라프의 미분 값 구하기


성대의 진동을 포착하는 라링고그라프에서 나오는 신호를 프라트에 입력할 수 있다. 라링고그라프의 신호에서 성대의 여닫음을 확인하는데 흔히 신호의 앞뒤 값의 차이를 구하여 두 개의 신호를 동시에 보면서 경계선을 찾는다. 다음은 이러한 차이 값을 구한 뒤 편집창을 보여주는 스크립트이다.


getnameofselected soundName Sound 객체창에 불러온 음성파일의 이름을 구하여

newName$="'soundName'"+".degg" 확장자를 넣은 파일이름을 만들어

      Copy... 'newName$' 객체창에 복사하여 넣고

      select Sound 'newName$' 이 파일을 선택한 뒤

          counter=Get number of samples 총 표본수를 구하고

        for i from 1 to counter-1 표본의 처음부터 끝까지

             ival= Get value at index... i 각 지점의 진폭 값을 구하고

             iival=Get value at index... i+1 그 다음 지점의 진폭 값을 구하여

             diff=ival-iival 두 지점의 차이 값을 구한 뒤

             Set value at index... i 'diff' 그 지점의 값을 차이 값으로 대체한다.

         endfor

Edit 편집창을 보여준다.

 

9.7 녹음파일이름 자동 생성


앞서 음성녹음에 관해 설명한 부분가운데 Sound Studio라는 프로그램을 이용하여 자동으로 파일이름을 지정하면서 되풀이하는 필자가 만든 스크립트를 소개한다. 이 애플 스크립트를 사용하면 폴더이름을 본인이 지정하고 저장된 모음 ‘아’를 불러와 재생한 뒤 이에 따라 발음한 뒤 이를 저장한다. 자신이 발성한 음성을 들어보고 마음에 들면 ‘예’를 선택하고 그렇지 않으면 ‘아니오’를 선택할 수 있다. 단, 이 스크립트는 맥킨토시의 Sound Studio에만 작동한다. 프라트에서는 녹음 대화창을 통제하는 스크립트 함수가 없어서 아직까지 만들지 못했다.


tell application "Sound Studio" 

  activate 프로그램을 실행한다.

  open {file "G4:AppleScript:a.wav"} 스크립트 폴더의 음성 ‘a'를 불러온다.

  set bounds of window "a.wav" to {20, 60, 400, 200}                   창을 작게 만들고

  set userNum to 1 되풀이 시작 값을 1로 준다.

  set foldername to (text returned of (display dialog "Enter your initial for a folder name." default answer "bg")) 저장할 폴더이름을 지정하게 한다.

  repeat 5 times 다섯 번 되풀이 한다.

     play document "a.wav" 음성 ‘a'를 재생한다.

     delay (5)     재생이 끝날 때까지  5초간 대기한다.

     set doc to (make new document with properties {sample rate:22050, sample size:16, channels:1}) 모노로 16비트, 22050 Hz로 녹음 세팅을 한다.

     record doc 입력되는 음성 녹음

     delay (5) 녹음이 끝날 때까지 5초간 대기한다.

     stop doc 녹음을 중지

     play document "untitled" 녹음된 내용을 재생한다.

     display dialog "Save or discard?" buttons {"Yes", "No"} default button "Yes" 녹음된 내용에 만족하면 Yes단추를 누르고 아니면 No를 누른다.

     if the button returned of the result is "Yes" then 만일 응답이 Yes면

       set filename to (foldername & userNum as string) 지정된 파일이름과 경로로 파일로 저장한다.

       set fileroute to ("G4:AppleScript:" & filename)

       save document "untitled" in file fileroute as <<class AIFF>>

       set userNum to (userNum + 1) 파일번호를 하나 더한다.

     else 만일 응답이 No라면

       close document "untitled" saving no  녹음하던 창을 닫고

       set answer to "No" 응답변수를 No로 지정하고

       repeat until answer = "Yes" 응답변수가 Yes가 될 때까지 녹음을 되풀이 한다.

                                                                           set doc to (make new document with properties {sample rate:22050, sample size:16, channels:1})

record doc

delay (5)

stop doc

play document "untitled"                                                       delay (1)

display dialog "Save or discard?" buttons {"Yes", "No"} default button "Yes"

set answer to the button returned of the result

if answer = "No" then

  close document "untitled" saving no

end if

       end repeat

       set filename to (foldername & userNum as string)

       set fileroute to ("G4:AppleScript:" & filename)

       save document "untitled" in file fileroute as <<class AIFF>>

       set userNum to (userNum + 1)

     end if

     close document filename saving no 파일을 닫는다.

  end repeat                                                               

end tell





제 10 장 기타 음성 분석방법


이 장에서는 프라트를 이용하여 측정할 수 있는 예를 보여준다. 연구 목적에 따라 다양하게 활용하기 바란다.


10.1 성대진동개시시간 측정


우리말의 파열음 가운데 ㅂ, ㅃ, ㅍ, ㄷ, ㄸ, ㅌ, ㄱ, ㄲ, ㅋ 등은 성대진동개시시간(VOT:Voice onset time)에서 차이가 난다. 영어에서는 유성음과 무성음의 VOT로 구분된다. 이 값을 측정하려면 매우 조용한 사무실에서 녹음한 자료를 사용해야 한다. 그렇지 않으면 성대가 막 열리는 지점의 위치가 파형이나 스펙트로그램에서 쉽게 보이지 않게 된다. 지속시간 측정 값을 해석할 때도 이 값들이 과연 청각적으로도 유의미한 결과를 보여줄 것인지, 통계만을 위한 자료는 아닌지 검증해볼 필요가 있다. 필자가 ‘바, 빠, 파’ 세 개의 발음을 했을 때 음성파형을 나타내어 분석해보면 다음과 같다.

그림 10.1은 ‘바’ 발음의 편집창인데 피치 값도 구하여 함께 표시했다. 성대의 열림이 일어난 지점부터 규칙적인 모음 ‘아’의 진동이 시작되는 지점까지 스펙트로그램과 피치곡선을 동시에 이용하면 좋을 것이다. 그림에서 VOT 값은 22 ms이다.


그림 10.1 ‘바’의 VOT 측정 편집창



‘빠’의 발음은 그림 10.2와 같이 나타난다.

그림 10.2 ‘빠’의 VOT 측정 편집창


    


동일한 피치곡선을 이용하였으나 실제 한 펄스를 더 분석하지 않았기 때문에 오히려 첫 번 째 펄스에서 영점을 교차하는 위치까지를 구했다. 영점 교차 이전의 위치가 정확하지 않기 때문에 실험자는 임의의 값을 구하기보다는 성대의 열림이 있고 난 뒤 규칙적인 파형이 시작되기 전의 첫 번 째 영점 교차하는 지점으로 정의해 두면 객관적인 측정이 가능하다. ‘파’일 경우의 VOT는 그림 10.3과 같다.

그림 10.3 ‘파’의 VOT 측정 편집창


    


이 그림에서 보면 성대의 열림에서 매우 급격하게 기류가 흘렀음을 보여주며 많은 소음이 이어지고 규칙적인 모음 ‘아’의 진동이 시작되기 전 첫 번 째 영점교차지점을 구했다. VOT 값은 약 117 ms가 된다. 여기서는 피치 값이 시작되는 위치가 도움이 된다. 앞서 제시한 피치 값을 구하는 과정을 참고하면 피치 값을 표시하는 범위와 농도를 제한하여 일정한 기준에 의해 VOT 값을 구할 수 있다.


10.2 이중모음의 포먼트


우리말의 이중모음으로는 ‘야, 여, 요, 유, 예, 얘’와 같이 반모음 j로 시작하는 부류와 ‘외, 왜, 웨, 위, 워’와 같이 반모음 w로 시작하는 상승적 이중모음 부류가 있고, 하강적 이중모음인 ‘의’가 있다. 국어 이중모음의 특징으로는 영어와는 반대로 반모음의 작은 에너지에서 급격히 모음의 큰 에너지로 상승하는 모양을 보이고 있다. 반모음 j는 모음 ‘이’에 가까운 조음 모양에서 이어지는 모음의 조음위치에 따라 혀의 이동이 일어나게 되므로 주로 제2포먼트가 하강하는 모양을 두드러지게 보이며 제1포먼트는 상승한다. 반모음 w로 시작되는 경우에는 모음 ‘우’와 가까운 조음 모양으로 입술을 둥글게 했다가 따라오는 모음의 위치로 가기 때문에 항상 제1, 2포먼트의 출발점이 낮게 시작하여 상승하는 경향을 보이게 된다.


그림 10.4 음성 ‘야’의 편집창



따라서, 포먼트 값이 항상 변하기 때문에 피험자가 발성한 음성자료에서 임의로 정한 어느 한 시간점에서 측정한 값을 비교하는 것은 어려움이 있다. 가능하면 전체 지속시간을 일정한 간격으로 나누어 해당 지점에서 포먼트 값을 구하는 것이 바람직할 것이다.

그림 10.4는 필자가 ‘야’라고 발음한 스펙트로그램과 포먼트를 나타내고 있다. 이 그림에서 살펴보면 이중모음 ‘야’의 경우에는 단모음 ‘이’에 단모음 ‘아’가 연이어 발음되는 과정으로 분리할 수 있는데 실제 포먼트의 변화는 두 개의 단모음의 연속으로 나타나 있다. 피치의 변화에서는 140 Hz에서 90 Hz로 하강하였고,  강도 값은 70 dB에서 50 dB로 하강하는 모양을 보였다. 단모음 ‘이’는 모음 ‘아’보다는 상대적으로 짧은 시간을 차지하여 전이음(glide)로 실현되었다. 이와 반대의 구조를 보이는 영어의 ‘I’이란 발음의 분석창을 보면 그림 10.5와 같다.


그림 10.5 영어음성 ‘I‘의 편집창



포먼트는 단모음 ‘아’의 발음에서 선명하고 길게 나타났지만, 전이음 ‘이’의 경우에는 짧게 발음되다가 그쳤다. 피치 값의 궤적은 152 Hz에서 92 Hz로 내려갔는데 끝 부분에서는 측정상의 오류로 보이는 흔들리는 모양을 하고 있다. 강도 값은 68 dB에서 50 dB로 하강했다. 한국인 학생이 영어를 처음 대할 때 국어 발음에 대입하여 영어를 발음할 때는 두 개의 모음을 발음하는 경향이 있다. 예를 들어, ‘time'을 외래어로 표기한 ’‘타임’ 발음은 눈에 띄게 두 개의 모음의 길이가 차이가 난다. 대체로 앞의 모음보다는 뒤의 모음의 길이가 긴 경향이 있어서 외국인이 들으면 어색한 말투로 느끼게 만든다.


10.3 '사'와 '샤'의 절단주파수 구하기


자음의 특징가운데 마찰음 /s, ʃ/는 발성기관의 면적에 따라 절단주파수(Cut off frequency) 값에서 차이가 난다. 절단주파수란 스펙트럼에서 에너지가 진하게 형성되어 있는 낮은 주파수 쪽 경계지점을 말한다. 두 발음은 입술에서 잇몸까지의 거리에 해당하는 것이 /s/라면 그보다 약간 더 안 쪽으로 들어가서 좁힘점이 형성되는 것이 /ʃ/발음이다. 따라서, 발음할 때 사용되는 성도의 길이가 짧은 쪽인 /s/일 때의 절단주파수가 매우 높게 나타난다.

사와 샤 발음을 녹음하여 저장한 뒤, 편집창에서 간단하게 절단주파수를 비교해보려면 Spectrogram settings를 그림 10.6과 같이 설정한다.


그림 10.6 스펙트로그램 분석 파라미터 설정 대화창



     



'사'일 경우에는 절단주파수가 높기 때문에 View range를 8000정도로 설정하여 나타내면 그림 10.7과 같다.

그림 10.7 ‘사’의 절단주파수 구하기 편집창


    

 

'샤'일 경우에는 그림 10.8과 같이 5000까지 설정하면 된다.


그림 10.8 ‘샤’의 절단주파수 구하기 편집창


    


이 그림에서는 절단주파수가 약 2360 Hz로 나타났는데, 마우스로 찍은 위치가 실험자의 오류를 감안한다면 십 자리 이하는 무시하고 반올림해도 된다. 특히, 다음에 오는 모음에 연속된 공동 조음이 되기 때문에 모음구간 직전보다는 소음부의 중심점에서 구하는 것이 좋을 것이다. 아울러 이 값들은 발성한 화자의 조음기관의 길이와 면적에 따라 달라지기 때문에 측정 값을 통계적으로 이용하거나 서로 다른 화자의 값을 비교할 때는 유의해야 한다.


10.4 라링고그라프의 신호 분석


사람의 발성에서 성대의 진동을 나타내는 라링고그라프의 신호를 윈도우용 컴퓨터에 프라트로 입력할 수 있다. 라링고그라프의 신호는 +/- 전극에 따라 신호가 반대로 입력되는 경우가 있다. 규칙성을 나타내는 피치 값에서는 차이가 나지 않지만, 성대의 여닫음 비율을 구할 때는 값의 차이가 상당히 나게 된다. 그림 10.9는 모음 ‘아’를 발성할 때 생긴 라링고그라프의 신호로서 양수 부분의 데이터가 열린 부분이 되고 음수 부분이 닫힌 영역을 나타낸다.


그림 10.9 라링고그라프 신호 편집창




이렇게 거꾸로 입력된 신호음을 우리가 흔히 보는 라링고신호의 형태로 바꾸려면, 프라트 객체창에서 Modify-->Formula를 선택한 뒤 공식 입력창에서 그림 10.10과 같이 -self 를 입력하면 된다.


그림 10.10 음성신호 변환 대화창




이 기능은 선택된 파일의 성문파형 데이터에 -1을 곱하여 아래 위가 그림 10.11과 같이 반대로 뒤집어진 모양으로 만들어 준다.


그림 10.11 위치가 변환된 라링고그라프 신호 편집창


 



이어서 성대의 닫힌 부분을 나타내는 양수 값으로 나타난 위 부분과 음수로 나타난 아래 부분의 데이터를 헤아려 피치 값을 구하는 알고리즘과 전체 길이에서 닫힌 부분이 차지하는 비율(Closed quotient) 등을 구할 수 있게된다.

먼저 선택된 음성의 차이 값을 구하는 앞서의 스크립트를 적용하면 그림 10.12와 같이 나타난다.



그림 10.12 미분 라링고그라프 신호 편집창


 


이어서 라링고그라프 원래의 신호에서 데이터가 음수에서 양수로 변하는 지점을 찾아 그 간격을 구하여 성대의 여닫음을 계산하는 스크립트는 다음과 같다.


getnameofselected soundName Sound   선택된 음성파일의 이름을 구하여 soundName변수에 넣고 

newName$="'soundName'"+"Ocr" 성대여닫음비율을 처리할 객체를 다른 이름으로 지정하고

Copy... 'newName$' 파일을 하나 더 만든 다음

dur=Get duration 전체 지속시간을 dur변수에 넣고

numsample=Get number of samples 총 표본수를 numsample변수에 넣고

samper=Get sample period 표본주기를 samper변수에 넣고

finish='dur'-0.04 분석구간의 끝에서 40밀리초 안 쪽으로 작업 중지할 위치를 정하고

duround=round('dur'*1000) 지속시간을 1000배하여 ms단위로 나타내고

clearinfo 정보창의 내용을 모두 지우고

call setting 기본 값을 부여하고

call startingpoint 시작점을 찾고

call endingpoint 끝점을 찾는다.

call cyclepoint 시작점과 끝점으로 구성된 피치 싸이클을 구한다.


procedure setting 기본 값을 부여하는 서브루틴

   i=1

   j=1

   p=1

endproc


procedure startingpoint 시작점을 찾는 서브루틴

   valindex=Get value at index... 'i' 진폭 값을 구하여

   if 'valindex'<0 음수이면 양수가 될 때까지 되풀이 검색

   while 'valindex'<0 and 'i'<'numsample'      

    i='i'+1

    valindex=Get value at index... 'i'

   endwhile

   else 양수이면 음수가 될 때까지 되풀이 검색한 뒤 양수가 될 때까지 한번 더 되풀이 검색

   while 'valindex'>=0 and 'i'<'numsample'   

    i='i'+1

    valindex=Get value at index... 'i'

   endwhile

   while 'valindex'<0 and 'i'<'numsample'    

    i='i'+1

    valindex=Get value at index... 'i'

   endwhile

   endif

   print starttime 'i''valindex''newline$' 시작 시간 점 값을 인쇄해서 확인시켜 줌

endproc


procedure endingpoint 끝점 찾는 서브루틴

    j='numsample'

    valindex=Get value at index... 'j'

    if 'valindex'<0  음수이면 양수가 될 때까지 되풀이 검색한 뒤 음수가 될 때까지 한번 더 되풀이 검색

   while 'valindex'<0

      j='j'-1

      valindex=Get value at index... 'j'

   endwhile

   while 'valindex'>=0

    j='j'-1

    valindex=Get value at index... 'j'

   endwhile

    else 양수이면 음수가 될 때까지 되풀이 검색

   while 'valindex'>=0

    j='j'-1

     valindex=Get value at index... 'j'

    endwhile

    endif

    endindex='j'+1

    print endtime 'j''endindex''newline$' 끝 시간점 값을 인쇄해서 확인시켜 줌

endproc


procedure cyclepoint 분석 시작 점과 끝 점 사이에서 각 사이클의 성대의 여닫음 비율을 구하는 서브루틴

    while 'valindex'<0 and 'i'<'endindex' 진폭 값이 음수이면 양수가 될 때까지 계속 검색

     i='i'+1

     valindex=Get value at index... 'i'

     endwhile

    while  'i'<'endindex'

     contactonset'p'='i' 성대 접촉이 일어나는 지점의 값

     print contactonset 'i''tab$''valindex''newline$' 접촉 시작 점 인쇄하여 확인시켜 줌

     while 'valindex'>0 and 'i'<'endindex' 양수이면 음수 값이 될 때까지 계속 검색

      i='i'+1

      valindex=Get value at index... 'i'

      print contact 'i''tab$''valindex''newline$' 접촉 부분 값 인쇄하여 확인시켜 줌

     endwhile


    cindex='i'-1

     contactoffset'p'='cindex'

     cvalindex=Get value at index... 'cindex'

     print contactoffset 'cindex''tab$''cvalindex''newline$' 접촉이 끝나는 지점 인쇄하여 확인시켜 줌

    openonset'p'='i' 여기서 부터 열림이 시작되는 지점

   print openonset 'i''tab$''valindex''newline$' 인쇄하여 확인

    while 'valindex'<=0 and 'i'<'endindex' 음수이면 양수가 될 때까지 계속 검색

    i='i'+1

    valindex=Get value at index... 'i'

   endwhile


    oindex='i'-1    

    openoffset'p'='oindex'

    ovalindex=Get value at index... 'oindex'

    print openoffset 'oindex''tab$''ovalindex''newline$' 성대 열림 지점 끝나는 지점 인쇄하여 확인시켜 줌

    call analyze 열림비율 구하는 분석

    p='p'+1

    endwhile

endproc


procedure analyze 열림비율 구하는 분석 서브루틴

    copy contactonset'p' contactonsetpnt

    copy contactoffset'p' contactoffsetpnt

    copy openonset'p' openonsetpnt

    copy openoffset'p' openoffsetpnt

    print contactonsetpnt  'contactonsetpnt'  contactoffsetpnt  'contactoffsetpnt'  openonsetpnt  'openonsetpnt'  openoffsetpnt  'openoffsetpnt''newline$'


  pulsedur='openoffsetpnt'-'contactonsetpnt' 성대진동펄스 지속시간 구하기

  contactdur='contactoffsetpnt'-'contactonsetpnt' 닫힘시간 구하기

  opendur='openoffsetpnt'-'openonsetpnt' 열림시간 구하기

  contactratio=('contactdur'/'pulsedur') 닫힘비율 구하기

  openratio=('opendur'/'pulsedur') 열림비율구하기

  f0=1/('samper'*'pulsedur') 피치 값 구하기

  print Result'tab$''p''tab$''contactratio:3''tab$''openratio:3' f0 'tab$''f0:0''newline$' 결과 인쇄하기

endproc

 

이 스크립트를 실행하면 정보창에 다음과 같은 결과를 보여준다.


starttime 1360.002349853515625

endtime 14451446

contactonset 137   0.043060302734375

contact 138   0.079193115234375

<중간부분 생략>

contact 212   0.0030517578125

contact 213   -0.00189208984375

contactoffset 212   0.0030517578125

openonset 213   -0.00189208984375

openoffset 323   -0.01318359375

contactonsetpnt   137   contactoffsetpnt   212   openonsetpnt   213   openoffsetpnt   323

Result   1   0.403   0.591 f0    119

<중간부분 생략>

contactonsetpnt   324   contactoffsetpnt   399   openonsetpnt   400   openoffsetpnt   510

Result   2   0.403   0.591 f0    119

<중간부분 생략>

contactonsetpnt   511   contactoffsetpnt   587   openonsetpnt   588   openoffsetpnt   697

Result   3   0.409   0.586 f0    119

<중간부분 생략>

contactonsetpnt   698   contactoffsetpnt   774   openonsetpnt   775   openoffsetpnt   884

Result   4   0.409   0.586 f0    119

contactonsetpnt   885   contactoffsetpnt   961   openonsetpnt   962   openoffsetpnt   1071

Result   5   0.409   0.586 f0    119

contactonsetpnt   1072   contactoffsetpnt   1149   openonsetpnt   1150   openoffsetpnt   1258

Result   6   0.414   0.581 f0    119

contactonsetpnt   1259   contactoffsetpnt   1336   openonsetpnt   1337   openoffsetpnt   1445

Result   7   0.414   0.581 f0    119


이렇게 구해진 데이터의 7개 지점을 살펴보면 첫 번 째 두개의 성대진동에서는 닫힘 부분이 0.403이었다가 4-5번 싸이클에서는 0.409로 증가하고 6-7번 싸이클에서는 0.414로 약간씩 증가하고 있음을 알 수 있다. 성대의 미세한 변화과정을 추적하는데 도움이 될 것이다. 앞으로 스크립트를 통해 성대의 특징을 구하는 알고리즘을 찾아보길 권한다.


10.5 음성장애자의 음성분석의 실제


음성장애자의 중증정도에 따라 프라트로 쉽게 측정할 수 없는 경우도 있을 것이지만, 우선 암 조직이 생긴 환자의 목소리를 분석해 보기로 한다. 그림 10.13에서 보듯이 스펙트로그램에 불규칙적이며 소음이 섞인 모양으로 나타나며 목을 조를 때 내는 목소리와 같이 억지로 내는 발성이라서 진폭의 변화도 매우 불안정하게 움직이고 있다.


그림 10.13 음성장애자의 음성 편집창



이 파형을 정상적인 음성분석 파라미터로 지정하여 처리하면 그림 10.14와 같이 매우 불안정한 값들로 추정된다.


그림 10.14 음성장애자의 음성 분석창



피치 값의 변화도 소음 때문에 500 Hz이상에서 출발했다가 190 Hz와 87 Hz 사이에서 춤을 추고 있다. 진폭 값의 변화도 시간점마다 불규칙하게 움직이고 있음을 알 수 있다. 포먼트 추적은 잦은 시간간격이 아닌 timestep을 100으로 지정했기 때문에 양쪽 끝 부분의 추정 값들은 나타나지 않고 있다. 그러면 여기서 피치 값을 제대로 확인해 보기 위해 그림 10.15와 같이 음파의 한 부분을 확대하여 피치 값과의 일치성을 확인해 보자.


그림 10.15 음성장애자의 피치확인 편집창


앞부분을 확대하여 보면 그림과 같이 규칙적인 피치구간을 볼 수 있는데 그 값은 240 Hz로 거의 규칙성을 보인다. 하지만 뒷부분을 확대하여 살펴보면 90 Hz전후의 피치간격을 보인다. 이번에는 그림 10.16과 같이 좁은 대역으로 전체적인 배음 구조를 살펴보기로 한다.

그림 10.16 음성장애자의 좁은대역 스펙트로그램 편집창

좁은 대역으로 살펴보면 약 400 Hz에 해당하는 부분이 피치 값으로 처리된다. 다음 배음의 위치가 약 800 Hz이기 때문에 배음의 간격이 피치 간격으로 나타나므로 맞는 값임을 알 수 있다. 다만, 이 환자의 발음에서는 배음이 뚜렷이 정의되지 않는 희미한 모양을 보이고 있다.

음성장애인의 음성을 교정하기 위해서는 이런 스펙트로그램과 포먼트 진폭 등의 정보를 활용하면 좋다. 스펙트로그램 위에 포먼트의 궤적을 함께 나타낼 수 있는데 이것은 스펙트럼의 모양에서 가장 진하게 나타난 봉우리를 컴퓨터 알고리즘에 의해 자동으로 추적한 것으로 맨 아래에서부터 차례로 제1포먼트, 제2포먼트, 제3포먼트로 부른다. 대체로 제1포먼트는 입을 많이 벌릴수록 높아지고 다물수록 낮아진다. 제2포먼트는 혀가 입안의 앞쪽에 위치해 있을수록 높아지고, 뒤쪽으로 갈수록 낮아진다. 제3포먼트는 입술을 둥글게 할 때 낮아지고 펼 때는 높아진다. 이런 간단한 원칙은 대체로 적용되지만 혀와 턱이 움직이면서 생기는 입안과 목젖 뒤의 공간이 상호작용하며 움직이기 때문에 실제로는 매우 복잡하다. 장애아의 조음치료에는 이러한 관계를 알고 어떤 부분이 문제인지를 찾아서 교정해주는 것이 필요하다. 자음의 발음에서도 입술이 붙었다가 떨어지는 동작이 스펙트로그램에 뚜렷이 나타나기 때문에 부모나 선생님의 발음을 입력하여 어떤 모양이 되는지를 알아낸 뒤 조음치료에 활용한다. 즉, 눈으로 볼 수 있는 시각적인 변화를 알려주기도 하고 동시에 혀끝을 이와 잇몸사이에 댄다는 것을 손가락을 넣어서 촉각적으로 깨닫게 하고, 스펙트로그램으로 정지된 음성의 변화에서 특징을 지적하여 나가는 과정에서 서서히 조음을 치료할 수 있을 것이다. 장애인의 조음훈련을 통해 얼마만큼의 개선이 있었는지를 확인하려면 사전녹음과 일정기간 훈련을 시킨 후의 녹음자료를 비교하여 동일한 문장을 따라하기 등에서 단어의 억양이나, 음절의 길이, 포먼트 값에 의한 음질의 변화 등을 측정하여 상대적으로 진전되었는지를 비교해 볼 수 있다.


 10.6 발음학습프로그램 제작


글자를 읽으면서 반응하게 하기보다는 가능하면 컴퓨터로 일정한 속도로 재생되는 목소리를 듣고 따라하도록 하는 것이 바람직하다. 왜냐하면 실험자의 의도와 상황에 따라 다른 자극 조건이 될 수도 있고 이것이 결과에 영향을 줄 수도 있기 때문이다. 일정한 시간 간격으로 재생되는 장치는 다음과 같은 프라트의 스크립트를 이용하는 것이 좋다.


for i from 1 to 10

  Play say

  Play silence

  Play 'i'

  Play response

endfor


위의 스크립트는 먼저 say라는 파일을 재생하고 silence를 재생한 뒤 첫 번 째 'i'가 1이 되면 1이라는 파일을 재생하고, response를 재생한 뒤 차례로 10번의 숫자로 된 파일을 재생해 준다. 이 스크립트를 실행하기 전에 다음과 같이 파일을 만들어 객체창에 불러내어 본다.

 

1. New-->Record mono sound를 실행한 뒤 “자 다음 말을 따라하세요”라고 발성한 뒤 say라는 음성으로 저장한다.

2. 음성파일을 하나 불러와 Edit을 눌러 편집창에서 연 뒤 약 2초에 해당하는 부분을 선택하고 편집창의 Edit에서 Set selection to zero라고 하면 묵음구간이 된다. 이 부분을 silence.aifc라고 저장한다.

3. 2번 요령으로 5초에 해당하는 부분을 선택한 뒤 묵음으로 만든 뒤에 response.aifc로 저장한다.

4. New-->Record mono sound를 실행한 뒤 “아버지”라고 발성한 뒤 파일이름 1로 된 음성으로 저장한다. 이어서 파일이름 2를 ‘어머니’, 파일 3을 ‘언니’... 등으로 10개를 녹음하여 저장한다.

5. 지금까지 저장한 모든 파일을 Read-->Read from file...메뉴를 클릭 하여 차례로 불러와 객체창에 올려놓는다.

6. Control-->New Script를 열어 위의 스크립트를 복사하거나 타자하여 넣고 스크립트의 맨 오른 쪽에 있는 Run 메뉴를 실행한다.


이렇게 하면 “자 다음 말을 따라하세요”<2초 묵음>‘아버지’<5초 묵음> “자 다음 말을 따라하세요”<2초 묵음>‘어머니’<5초 묵음>“자 다음 말을 따라하세요”<2초 묵음>‘언니’<5초 묵음>... 등으로 연속하여 실행된다. 이 소리를 들으며 5초라는 시간 동안에 받아 적기를 한다든지 여러 개의 그림 가운데 해당 부분을 체크표시를 하게 만들어 청각실험세트로 활용할 수 있다. 이러한 발음 학습프로그램은 장애아에게 일정시간씩 되풀이하여 발음연습을 시키는 용도 외에도 흔히 잘 틀리는 발음을 차례로 되풀이하여 재생되도록 하는 외국어 발음 연습을 위한 일정한 간격의 녹음테이프 제작에 도움이 될 것이다. 여기에 덧붙여 피치를 상대적으로 높이거나 내려서 학습자의 주의를 끌거나 강세 부분의 속도를 느리게 또는 빠르게 하여 청각적으로 주목하게 만드는 보다 복잡한 발음 학습과정도 만들 수 있을 것이다.

5초간의 묵음파일을 만들려면 그림 10.17과 같이 음성파일을 불러온 뒤 마우스 왼 쪽 단추로 시작점을 클릭한 채 오른 쪽으로 끌고 간 다음 5초가 되는 지점에서 놓는다. 이어서, Edit메뉴에서 Set selection to zero를 선택하면 음성파형 부분이 모두 묵음이 된다. 이 구간이 선택된 상태에서 편집창 File메뉴 아래의 Write selection to AIFC file...메뉴를 클릭 하여 response.aifc로 저장하면 된다. 이것을 스크립트에서 불러와 재생하면 5초간 아무런 소리가 들리지 않고 시간이 지나가게 된다.


그림 10.17 묵음 편집창




10.7 개 짖는 소리의 분석


동물의 울음소리를 분석하려면 발성기관의 특징을 충분히 알고 난 뒤 적절한 분석세팅을 지정해야 한다. 새소리와 같이 매우 높은 주파수 성분으로 되어 있을 때는 표본추출속도를 최대인 44100 Hz로 지정하는 것이 좋다. 소나 돼지의 울음소리나 개의 울음소리 등을 분석하여 동물의 아픈 정도나 만족감을 분류하는 방식도 수의학자라면 시도해 볼 만하다. 프라트에서는 기존의 음성분석 소프트웨어에서 제한된 수의 메뉴 때문에 측정하지 못했을 부분을 여러 가지 파라미터 설정의 조합을 통해 각각의 동물에 맞게 지정할 수 있다. 참고로 인터넷에 올려져 있는 개 짖는 소리를 프라트에서 그림 10.18과 같이 분석하여 보았다. 검은 덩어리로 나타나 있는 각각의 파형은 “머엉, 머엉, 멍멍멍”이라는 독특한 박자의 소리를 나타낸다.


그림 10.18 개 짖는 소리의 신호 편집창



앞에서 네번째 부분의 포먼트 모양이 보다 뚜렷하기 때문에 그 부분만을 선택하여 포먼트를 살펴보면 그림 10.19와 같다.



그림 10.19 개 짖는 소리의 신호 확대 편집창



   



그런데 음성파형 이전과 이후에 많은 포먼트 윤곽이 나타나 정확한 포먼트를 찾기가 어렵다. 따라서, 잡음이 심한 개 짖는 소리를 거르기 위해 포먼트 분석 파라미터 설정을 그림 10.20과 같이 변형해 보았다.

 여기서 특기할 것은 Dynamic range를 6 dB로 매우 낮게 하여 울음소리 가운데 또렷한 부분만 포먼트로 분석하게 했고, Number of poles도 7차로 하여 사람의 성도보다는 긴 개의 성도를 반영하였다. 앞서 스펙트로그램에서 개가 짖는 소리는 약 세 개의 포먼트로 나타나 있음을 알 수 있다.

그림 10.20 포먼트 분석 파라미터 설정 대화창


   


 그림 10.21은 이렇게 변형된 설정으로 분석을 실시하여 나타낸 파형과 스펙트로그램이다.


그림 10.21 개 짖는 소리의 포먼트 분석 편집창



비록 음파가 끝나는 부분에서는 제3포먼트에서 변화가 있지만 대체로 개의 입안 공명을 나타내어 준다. 이 값들에 따라 개들을 분류하면 성도의 길이에 따라 특징을 구별할 수 있을 것이다. 한가지 더 주목할 것은 개의 입벌림 정도를 나타내는 제1포먼트가 서서히 증가했다가 내려가는 모양을 보이고 있으며 혀의 움직임을 반영하는 제2포먼트는 실제 개가 짖을 때 약간 펄렁이는 모양을 나타내고 있다. 한번 ‘멍’이라고 짖을 때 지속시간은 약 160 ms이고 다음 짖을 때까지 약 430 ms의 묵음구간이 생겼으며 이 기간동안 숨을 들이키고 다음 짖기 위한 준비를 하였고, 세 번 연이어 짖을 때는 180 ms전후로 짖으며 각 짖음 사이의 시간간격은 160 ms전후이다. 이러한 개들의 짖음의 특징을 분석하면 나름대로 개가 나타내려는 어떤 의미까지도 분류할 수도 있을 것이다. 이런 짖음에 대한 피치 값을 측정하려면 성대의 진동이 규칙적이지 않아 약 300 Hz 전후의 피치곡선이 제대로 나타나지 않는다. 하지만, 끙끙 앓고 있을 때와 같이 성대의 진동이 있을 경우에는 선명한 피치곡선을 구할 수 있으리라 여겨진다.


10.8 새소리 분석


다음은 인터넷의 http:// www.math.sunysb.edu/ ~tony/ birds/ sounds/ fieldsparrow1m.au 파일을 불러와 분석한 예이다. 위의 새소리 파형을 나타낸 그림 10.22에서는 소리의 크기가 약간씩 증가하고 있으며 아래의 스펙트로그램에서는 처음에는 약 3200 Hz의 주파수로 진동하다가, 후반부에서는 약 4000 Hz에서 2800 Hz 사이로 혀를 오르내리면서 변화를 보여주고 있다. 피치분석에서도 동일한 범위의 소리가 나타난다. 이 때 피치분석 설정을 600 Hz로 하면 전혀 나타나지 않게 되므로 새소리의 피치 특징을 분석하려면 최대피치 값을 4000 Hz까지 높여주어야 할 것이다. 기존 연구에 따르면 각 지역의 새들마다 특별한 방언이 존재하고 있으며 한 지역에서 다른 지역으로 이동하면 새로운 방언을 학습하는 모양을 관찰할 수 있었다고 한다.


그림 10.22 새소리 분석 편집창


                  



10.9 통계처리시 유의할 사항


음성파일을 분석하여 그 결과를 통계 처리할 때 몇 가지 유의할 점이 있다. 프라트에서는 다양한 분석도구를 사용하여 소숫점이하 긴 자릿수로 결과가 나오지만 각각의 값들의 유효성을 판단할 때는 숫자만의 유효성이 아닌 청각적인 판단에도 의존해야한다. 포먼트 값의 예를 들면, 실제 통계적으로는 매우 유의미한 차이를 나타냈더라도 청각적으로 들어보면 전혀 다르게 들리지 않는 경우가 많다. 사전 연구에 따르면, 제1포먼트는 150 Hz의 변화 범위에서 동일하게 들었고, 제2포먼트는 300 Hz, 제3포먼트는 800 Hz의 변화에도 동일한 소리로 들었다(양병곤, 1995). 이렇게 고주파수로 갈수록 더 큰 범위의 물리적인 주파수의 차이점을 귀로서는 듣지 못하기 때문에 포먼트 값의 차이를 해석하는데 주의해야 한다. 물론, 외국어학습 성취도를 알아보기위해, 사전녹음과 사후녹음의 분석 결과를 비교하려면 청각적으로는 비록 차이가 나지는 않더라도 측정값을 통해 어느 정도 외국인 학습자로서 근접하는 과정을 눈으로 볼 수 있다.

덧붙여, 서로 다른 크기의 발성기관을 가지고 있는 피험자들이 발성한 음성을 분석할 때 벌써 통계적으로 유의미한 음향적 차이를 보이는 경우가 많은데 이런 절대적 차이는 어느 정도 정규화(normalization)시켜서 비교해야 의미 있는 결론을 내릴 수 있다. 예를 들어, 어린애와, 어른이 섞인 집단에서 수집한 포먼트 값은 상당히 차이가 나기 때문에 통계적으로 비교하면 완전히 다른 집단으로 처리된다. 하지만, 우리가 이들이 발성한 음성을 들을 때 음향적 값으로는 매우 차이가 나지만 귀로는 동일한 모음이나 자음으로 듣는 것은 이들 음향적 값을 청각적으로 정규화 시켜 듣기 때문이다. 정규화에 대한 논의는 필자의 박사학위 논문인 Yang(1990)을 참고하기 바란다.



참고문헌


양병곤. (1995). "합성한 한국어 단모음의 지각실험 연구". 언어 20권 제 3호,

        pp. 127-146.


양병곤. (1998). "성도 변형에 따른 모음 포먼트의 변화 고찰" 음성과학 제 3권,

        pp. 83-92.


Boersma, P. (1993). "Accurate short-term analysis of the fundamental

        frequency and the harmonics-to-noise ratio of a sampled sound",   

        Proceedings of the Institute of Phonetic Sciences of the University

        of Amsterdam 17: 97-110.


Fant, G. (1970). Acoustic Theory of Speech Production. The Hague: Mouton.


Johnson, K. (1997). Acoustic Auditory Phonetics. Cambridge, MA: Blackwell.


Hermes, D.J. (1988). "Measurement of pitch by subharmonic summation",

        Journal of Acoustical Society of America 83, pp. 257-264.


 Press, W.H., S.A. Teukolsky, W.T. Vetterling & B.P. Flannery. (1992).

        Numerical Recipes in C: the art of scientific computing.

        2nd Ed., New York: Cambridge University Press.


Yang, B. (1990). Development of Vowel Normalization Procedures:

        English and Korean. Ph. D. Thesis. The University of Texas

        at Austin.


Yang, B. (1996). "A comparative study of American English and Korean

        vowels produced by male and female speakers." Journal of Phonetics

        24, 245-261.

저자 소개


양 병곤 (현 부산대학교 사범대 영어교육과 교수)

부산대학교 영어영문학과 학사, 문학석사

미국 텍사스오스틴 주립대학 언어학박사

박사학위 논문:  Development of Vowel Normalization Procedures:

                 English and Korean


저서․역서


     Development of vowel normalization procedures: English and

     Korean. 1991. 서울: 한신문화사 <전자파일>

     한국어 이중모음의 음향학적 연구, 1993. 부산: 진영문화사 <전자파일>  

     음성학 입문, 1993. 부산: 진영문화사

     음성언어의 이해(공역), 1995. 서울: 한신문화사

     실험음성학 논문집 I, 1998. 부산: 진영문화사

     Signalyze를 이용한 음성 분석법, 1998. 부산: 진영문화사<전자파일>

     음성학과 음운론, 공역자: 구희산, 고도흥, 김기호, 안상철, 1998.

     서울: 한신문화사

     음성과학, 공역자: 김기호, 고도흥, 구희산. 2000. 서울: 한국문화사

     음성과학용어번역사전. 구희산 외 공편. 2001. 서울:한국문화사.

     음성 및 언어 분석기기 활용법. 고도흥 외 공편. 2001. 서울: 한국문화사.

      


학술논문 전자파일

Http://www.dongeui.ac.kr/~bgyang/kpapers.htm


이 책 원문 전자파일

Http://www.dongeui.ac.kr/~bgyang/praat/praat.pdf




 



프라트를 이용한 음성분석의 이론과 실제

=========================================

발행인     양 병곤

인  쇄     만수출판사(출판등록 제카11-17호)

           Tel: (051) 513-4042, 2662

           E-mail: mansu4042@korea.com

발행일     2010년 12월 13일

책  값     10,000원

=========================================

연락처     614-714

           부산광역시 부산진구 가야동 산 24

           동의대학교 영어영문학과

           양 병 곤 교수

           Tel: (051) 890-1227

           Fax: (051) 890-1222

           Http://www.dongeui.ac.kr/~bgyang

           E-mail: bgyang@dongeui.ac.kr

   


Copyright ⓒ 2010 양병곤


※이 책의 내용을 저자의 허락 없이 상용으로 출판하는 것은 법으로 금지되어 있습니다. 단, 개인의 연구용이나 강의용으로 인쇄하여 사용하거나 인터넷을 통하여 타인에게 전달하는 것은 적극 권장합니다. 이 전자책의 출판비에 조금이라도 도움을 주실 분이 계시면 농협 949-01-125823 양병곤 계좌로 책 값을 송금하여주시면 대단히 감사하겠습니다.