brunch

You can make anything
by writing

C.S.Lewis

by 향이 Sep 11. 2017

구글 음성인식으로 녹취를 풀어보자 #1

인공지능과 머신러닝은 우리의 노동을 줄여줄 것인가?

안녕하세요~ 

경향신문 뉴콘텐츠팀에서 각종 쓸데없는 짓을 벌이고 있는 누런돼지 기자입니다.


저희 팀에서는 주로 신문기사 외에 인터랙티브나 동영상 뉴스 등 색다른 콘텐츠들을 독자 여러분께 제공하자고 노력하고 있습니다만... (가끔) 기술로 기자들에게 복지(?)를 제공할 수 있는 방안들도 고민하고 있답니다.


기자들의 노동 중 큰 비중을 차지하고 있는 것 중 하나가 바로 '녹취 풀기'입니다. 직접 만나거나 전화 취재를 할 때 메모를 하긴 하지만, 결국 정확히 기사를 쓰려면 녹취를 하고 그걸 다시 글로 풀어서 다시 한번 확인하는 과정이 필수인데요. 만약 2시간 녹취를 하면 녹취를 푸는 데는 1.5배~2배 이상 시간이 들기 때문에 매우 고통스럽답니다ㅠ (물론 더 빠른 분도 계시지만... 저의 경우에)


그러다 어느 날 퇴근을 하던 도중 "구글에서 음성인식 서비스를 제공한다는데 녹취를 푸는 데 쓰는 건 어떨까?"라는 이상한 생각이 들었습니다. (오~~ 구글 신이시여!!) 바로 시험해 보기로 했습니다. 검색을 해 보니 한 프로그래머께서 친절한 설명을 올려 주셔서 많은 도움이 됐습니다.


자 그럼 시작해 볼까요?



여러 가지 방법이 있겠지만, 저희의 경우 컴퓨터에 저장된 음성파일을 바로 음성인식으로 풀어내야만 녹취를 푸는 서비스를 제공할 수 있을 듯 하여 제가 쓸 수 있는 파이썬(python)이란 언어를 이용해 진행했습니다.


우선 음성 인식 서비스를 이용하려면 아래 사이트에 접속해 구글 클라우드 플랫폼에 가입하셔야 합니다.

https://cloud.google.com


가입을 안 하셨다면 TRY IT FREE 버튼을 눌러봅시다 (진짜 공짜???)



가입하는데 좀 복잡합니다. 역시 공짜는 아닙니다. 일정 수준 이상 쓰면 돈을 내야 합니다. 그래서 카드번호 입력이 필수입니다. 물론 300달러 무료 크레딧도 제공하니 안심해도 될 것 같습니다. 1달러 결제가 되는데 카드번호가 진짜인지 확인하려고 그러는 듯합니다. 곧 환불됩니다.


그런데 카드 번호 입력보다 더 황당한 것은, 우편번호가 주소랑 틀렸다고 해서 계속 머리를 쥐어뜯었는데... 알고 보니 구 우편번호를 넣어야 했던 것입니다...... (구글 네 이놈들... 한국 무시하는 거냐???)


잘 가입하셨다면 아래와 같이 뜹니다.



일단 프로젝트를 생성해야 합니다. 정확한 개념은 모르겠으나, 프로젝트를 생성해야 그 하위의 서비스들을 이용할 수 있는 것 같습니다. (구조를 잘 아시는 분들은 알려주세요 ㅠ) 


프로젝트 선택을 눌러서 새 프로젝트를 생성합니다.

저는 상상력이 부족한 관계로 'speech'라고 이름을 붙였습니다.


프로젝트를 생성하고 나서 왼쪽 위에 'Google Cloud Platform' 옆에 '프로젝트 선택'을 눌러 프로젝트를 선택했습니다.


그 중에서 가운데에 'API 개요로 이동'을 클릭해 봅니다.

이제 사용자 인증 정보가 필요합니다.

사용자 인증 정보는 구글 서비스를 이용하기 위한 로그인 코드 같은 게 아닐까 싶습니다.

저희는 로컬(그러니까 제 컴퓨터)에서 사용할 것이기 때문에 '사용자 인증 정보' 중 '서비스 계정 키'를 생성하겠습니다.


세 번째 메뉴에 '서비스 계정 키'가 보입니다



적당히 이름을 설정합니다. 저는 또 'speech'라고 넣었습니다. 역할은... 무슨 뜻인지 몰라 일단 '소유자'라고 설정했습니다. 그래야 다 될 것 같아서....

설정을 마치면 json 파일 하나가 다운로드 됩니다. 신주단지 모시듯 잘 옮겨뒀습니다.


여기까지 설정을 모두 마쳤습니다.


코드를 작성하기 전에 구글의 speech API의 종류를 알아야 합니다.

영어와 씨름하고ㅠㅠ 여러차례 시도한 끝에 대충 이런 결론에 도달했습니다.



종류는 크게 동기식, 비동기식, 스트리밍으로 나뉘는데요.

동기식은 1분 이내의 짧은 음성을 돌려주는데 제 컴퓨터에 있는 파일(로컬 파일)도 바로 인식이 가능합니다. 하지만 짧은 시간만 가능하기 때문에 쓸모가 있진 않습니다.

게다가 몇 번 시험해 보니 10MB 이상의 로컬 파일은 업로드 자체가 되질 않습니다.


비동기식은 1분 이상도 가능한데, 구글 스토리지에 업로드를 한 뒤에야 음성 인식이 가능합니다. 하지만 일일이 스토리지에 업로드해야 하는 단점이 있네요.


가장 이상적인 것은 로컬 파일을 1분 단위로 자른 뒤 연속적으로 동기식으로 요청을 보내서 합치는 방법이 있을 것인데, 아직 파이썬에서 음성 파일을 자르는 방법은 찾지 못했습니다ㅠ

그래서 일단 둘 다 해 보기로 했습니다. 우선 1분 이내의 로컬 파일을 동기식으로 해 보고, 이어 5분짜리 파일을 구글 스토리지에 올려서 비동기식 방법도 해 보기로 했습니다.


참고로 60분까지는 무료이고, 그 이상은 15초 단위로 요금이 붙는다고 합니다. 15초 이하는 7초라도 15초로 인식된다고 합니다.(갑자기 휴대폰요금이 생각나는 건 왜인지...)



자, 이제 본격적으로 코드를 작성하겠습니다.


우선 파이썬을 위한 구글클라우드 라이브러리를 설치해야 합니다.

pip install google-cloud


(사실 저도 어떻게 하다 다 설치하게 됐는지 잘 모르겠다는 ㅠㅠ)

아래 사이트를 참고해주세요~

https://googlecloudplatform.github.io/google-cloud-python/latest/index.html



먼저 동기식으로 한 번 해 보겠습니다.

구글 speech API의 문서를 참조해 순식간에 CTRL+C 와 CTRL+V를 시전해 봅니다.

(브런치는 소스코드 입력이 안 되는군요..ㅠㅠ 어쩔 수 없이 이미지 컷을 올립니다. 링크로 들어가시면 복붙을 쉽게 하실 수 있습니다.)

https://cloud.google.com/speech/docs/sync-recognize


대충 보면 파일 이름만 다시 지정해 주면 실행될 것 같습니다. 그러나...

요걸 고대로 실행하면 자꾸만 에러가 뜹니다. 왜냐? 인증을 안 했기 때문이죠.

인증하는 방법은 여러가지가 있겠습니다만... 

아까 다운받은 json 파일을 잊으신 건 아니죠?

이 json 파일을 환경변수로 설정해 주면 실행이 됩니다.


또 몇 가지 변수를 바꿔줘야 하는데요.

새로 고친 코드는 이렇습니다.


import io
import os

from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types

# 요놈이 인증 파일( ----로 돼 있는 파일이름은 각자 고쳐쓰세요!)
GOOGLE_APPLICATION_CREDENTIALS = "----.json"

client = speech.SpeechClient()

with io.open("kangsj1m.flac", 'rb') as audio_file:
    content = audio_file.read()

audio = types.RecognitionAudio(content=content)
config = types.RecognitionConfig(
    encoding='FLAC',
    sample_rate_hertz=16000,
    language_code='ko-KR')

response = client.recognize(config, audio)

print('Waiting for operation to complete...')

for k in response.results:
    alternatives = k.alternatives
    for alternative in alternatives:
        print('Transcript: {}'.format(alternative.transcript))
        print('Confidence: {}'.format(alternative.confidence))


간단히 설명드리자면,

우선 예전에 취재차 녹취해 두었던 강신준 교수님의 자본론 강의 파일을 시험 재료로 썼습니다.

약 1분 정도의 분량을 끊어서 flac 형식의 파일로 저장했습니다.(kangsj1m.flac)

구글 음성 인식에선 아직 mp3 등의 파일 형식은 인식이 되지 않는 것 같습니다.

(혹시 방법 아시면 알려주세요 ㅠ)


구글에선 샘플링레이트가 16000일 때 가장 잘 인식한다고 합니다. 그래서 저장할 때 그렇게 맞춰줬습니다.

오디오 변환은 사이트(https://123apps.com/ko/)를 이용하셔도 되고, Audacity 같은 프로그램(http://www.audacityteam.org/)을 이용하셔도 됩니다. 


다만 주의사항은 꼭 샘플링레이트를 똑같이 맞춰주셔야 하고요, 채널은 1채널로 해 주셔야 합니다.


언어코드는 한글이니까 'ko-KR'로 했고요.


밑에 코드가 좀 달라진 이유는 이렇습니다.

우선 구글 음성인식을 요청하면 결과값을 아래와 같은 json 형식으로 돌려줍니다.

transcript 안에 문장이 들어가고, confidence가 인식률을 얘기하는 것 같습니다.



alternatives {

        transcript : "음성인식된 문장",

        confidence :  0.4744572639465332

},

alternatives {

        transcript : "음성인식된 문장",

        confidence :  0.5943343639373779

},

alternatives {

        transcript : "음성인식된 문장",

        confidence :  0.41422176361083984

}



문장(혹은 구글의 인식단위?)별로 alternatives 가 몇 개씩 형성되고 그 안에 결과가 들어있습니다.


따라서 위 구글이 제공하는 코드대로만 하면 배열의 첫번째 값, 그러니까 첫번째 인식결과 문장만 들어가게 되는 것이죠. 그래서 반복(for)문을 돌려서 모든 문장값을 다 출력해야 합니다.


자~ 그럼 과감하게 실행해 봅시다!!


꽤 시간이 걸립니다..........

다운된 줄 알았음 ㅠ


먼 산 한 번 바라보고 모니터를 보니 '떡'하고 떠 있네요.

(처음에는 무척 신기했지만 계속하다보니 무덤덤...)

모두 27초가 걸렸다고 나옵니다... 이거 1시간짜리 하면 1시간 걸릴 수도...


결과값을 모아보니 이렇습니다.


(원문)

그러니 자본주의는 필연적으로 항상 생산이 소비보다 많습니다. 왜 그럴까요. 자본주의에서 만들어지는 모든 물건은 궁극적으로 누군가가 소비를 해야 되는데 여러분 소비라고 하는 것은 누가 소비하느냐, 자본주의에서 소비하는 사람이 누구냐. 인간입니다. 인간이에요. 자본가들이 혹시 자기들의 원료를 사는 것을 소비라고 할지 모르지만, 그것은 아직 최종소비에 도달하지 않은 중간소비인 거거든요. 자본주의에서 궁극적으로 모든 소비는 사람이 하는 거예요. 사람이. 그런데... (잠시 침묵) 사람이 볼까요? 여러분, 사람이 하는 건 요겁니다. 요게 사람이 소비하는 거거든요. 요 5시간의 타인을 위한 노동, 잉여가치라고 하는 것은 소비하기 위해서 노동하는 것이 아니거든요. 왜냐하면 이것은 이 사람에게 돈을 벌어주기 위해서 노동하는 겁니다. 자본가는.


(음성인식 결과)

그러니 자본주의는 필연적으로 항상 생산이 소비보다 많습니다 자본주의에서 만들어지는 모든 물건을 궁극적으로 누군가를 해야 되는데 여러분은 누가 소비하는 유저 소비하는 누구냐 인간이에요 자동차 기름 없이 자기들이 원료를 사는 것을 법이라고 할지 모르지만 그거는 아직 최종 소비에 도달 하지 않은 중간적인 없거든요 모든 사람이 아는 사람인데 사랑 볼까요 이렇게 하는 거거든요  요산 수치 개선을 위한 노동력 가치라고 하는 것을 피하기 위해서 운동하는 것이 아니거든요 왜냐하면 이거는 이상하게 돈을 벌어주기만 하는 겁니다 자본가는


ㅎㅎㅎ

좀 웃깁니다. 문장을 비교해 볼까요.


자본가들이 혹시 자기들의 원료를 

=> 자동차 기름 없이 자기들이 원료를


요 5시간의 타인을 위한 노동, 잉여가치라고 하는 것은 소비하기 위해서 노동하는 것이 아니거든요.

 => 요산 수치 개선을 위한 노동력 가치라고 하는 것을 피하기 위해서 운동하는 것이 아니거든요


갑자기 자본가는 자동차로 변신하고, 요산 수치 개선이 막 튀어나옵니다. 


여기서 알 수 있는 사실.


음성인식이라는 것이 단순히 ㄱ,ㄴ,ㄷ과 ㅏ, ㅑ, ㅓ를 인식해서 기계적으로 변환하는 게 아니라 문맥을 보고 그것을 인공지능(AI)이 판단해서 가장 그럴듯한 말로 변환시켜 준다는 것입니다.

인식률(신뢰도)는 40~50% 사이로 비교적 낮습니다ㅠㅠ 한글이라 그런가.


강연이라서 음성이 좀 흐릿하게 들려서 그런가 싶을 수도 있습니다.

비교적 더 또렷한 통화 녹취 파일을 한 번 사용해 보겠습니다.

과거 제가 취재할 때 한 교수님과 통화했던 파일들 중 하나를 골랐습니다.


30여초 가량의 녹취입니다. 음성인식 부분의 줄 구분은 제가 한 것입니다.


(원문)

A: 제대로 원하는 것만큼 못 얻었지 않습니까. 그러니까 좀 미봉에 그친건데요. 그게...
B: 가장 원하는 것들을 서로 못 얻었단 말씀이죠?
A : 그렇죠. 정상회담이란 것 자체가 저는 막후하고 그 다음에 앞으로가 어떻게 될지 주목해봐야 될 것 같은데. 그... 이... 정상회담 자체는 잔치고 또 중국이 신경을 쓴 것이기 때문에 그 부분에 대해서는 일단 좋은 거라고 볼 수 있는데요.


(음성인식 결과)

A: 제대로 원하는만큼 없잖습니까 내가 친 건데 
B: 예예 원하는 대로 서로 못 하겠다 
A: 그렇지 하고요 정상회담이 자체가 마크하고 그대로 앞으로 어떻게 될지 좀 해 봐야 될 것 같은데 예 그 정상회담 자체는 잔치고 중국의 신기 할 수 있기 때문에 예  그 그 부분에 대해서는 일단 좋은 거라고 볼 수 있는데요


역시 신통치는 않습니다. 

그렇다면 가장 또렷한 음성을 자랑하는, 아예 휴대폰에다 대고 녹음한 파일을 변환해 보겠습니다. 

저희 팀원이 동영상 제작용으로 녹음한 16초 가량의 나레이션 음성입니다.

(지난 편을 보셨다면 어느 장면인지 아실듯ㅋㅋ)


(원문)

개정 전이었다면 김봉석씨의 최종 세액은 1억4894만, 결국 세법 개정에 따라 고액연봉자 김봉석씨가 더 내게 된 세금은 366만원입니다.


(음성인식 결과)

개정 전이었다면 김봉석 씨의 최종 세액은 1억 4893 결국 세법 개정에 따라 고액연봉자 김봉석 시간 보내게 된 사람은 360 6만 원입니다.


과연 결과값은 훨씬 낫습니다. 다만 숫자 인식은 아직도 약간 미흡하다고 볼 수 있네요.



결론적으로 아직까지는 녹취파일을 푸는데 구글 음성인식을 사용하는 건 좀 시기상조라고 볼 수 있네요. 물론 하나도 받아치지 않은 녹취 파일을 풀기 전 초안 상태로 만들 때는 사용할 수 있을 것 같습니다. 맨땅에서 치는 것보다 그래도 뭔가 있으면 시간이 덜 걸리니까요.


그러나 더욱 큰 문제는... 1시간짜리 파일을 돌리면 어느정도 시간이 걸릴 것인가 하는 점입니다.

1시간 짜리 푸는데 1시간 이상 걸리면 너무 비효율적이라 실질적으로 사용하기는 어려울 듯 합니다.

(걍 사람이 하는 게 나을 수도 있으니까요)


그래서...


다음 시간에는 구글 스토리지에 업로딩해서 비교적 긴 시간의 녹취파일을 풀어보도록 하겠습니다.

또 가능하면, 로컬 파일을 그대로 쓸 수 있도록 짧은 파일을 쪼개서 보낸 뒤 합쳐서 인식결과를 얻을 수 있는 로직도 구성해 보겠습니다.



ps. 제가 전문 프로그래머가 아니다 보니 여러가지 미흡한 점이나 잘못 설명한 점이 많을 것 같습니다. 지적해 주시면 언제든 반영하고 저도 배우겠습니다. 많은 지도편달을 부탁드립니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari