한국어 음성 -> 텍스트 변환해보기
이번에는 구글 Speech API를 사용하는 기술적인 준비사항과 절차를 간단하게 살펴보겠습니다.
본 내용은 https://cloud.google.com/speech/docs/getting-started 를 주로 참조했습니다.
https://cloud.google.com/speech/ 사이트에 가보면 다음과 같이 직접 써 볼 수 있는 예제가 있습니다. 한국어 인식 모드를 별도로 가지고 있습니다.
전체 페이지를 간략하게 보니, 2017년 3월 4일 시점, 다음과 같이 과금 체계가 잡혀 있습니다.
한 달에 60분까지 무료라고 하는데, 구글 클라우드 플랫폼에 처음 가입하면 60일 동안 $300 크레딧을 제공하니, https://console.cloud.google.com/freetrial 를 참조해서 크레딧을 미리 받아 놓으세요. 카드까지 활성화 해 놓지 않으면 Speech API를 사용할 수 없습니다.
첫 글에서 이야기드린 것처럼 프로그래밍 라이브러리를 설치하거나 참조하는 부분은 모두 제외한다 하더라도 인증을 받는 용도로 gcloud 커멘드 도구를 설치해야 합니다. https://cloud.google.com/sdk/ 여기를 참조해서 설치합니다.
구글 Cloud Platform에 신규 프로젝트를 만듭니다. 저는 Speech-01로 만들었습니다. 그리고, https://console.cloud.google.com/flows/enableapi?apiid=speech.googleapis.com 이 링크를 통해 Cloud Speech API를 활성화합니다.
Speech API를 활성화하면 [사용자 인증 정보로 이동] 버튼이 나타납니다.
단계를 따라가면, service account key file(JSON으로 구성된)을 다운로드할 수 있습니다.
그 파일을 특정 위치에 잘 저장하고, 환경변수에
export GOOGLE_APPLICATION_CREDENTIALS=/Users/.../Speech-01-xxxxx.json
을 추가합니다. gcloud 명령의 인증하기 위한 작업입니다.
구글 Speech API에서 인식할 수 있는 인코딩 포맷이 여러 개가 있지만, flac을 선택했습니다. Quick guide에서 flac을 사용하기도 했고, 다른 인코딩 포맷을 지원하는 무료 녹음 앱을 찾기 어려워서^^ audacity를 사용했습니다. http://www.audacityteam.org/
설치와 간단한 사용은 해당 사이트를 참조하세요. 저는 녹음하고 저장할 때 Flac 포맷으로 저장했습니다.
음성 파일을 직접 data binary로 올릴 수도 있지만, uri 주소로 연결해보려 합니다. 그런데, 지금까지는 google storage에 업로드된 것만 인식이 가능합니다.
업로드하려면 Cloud Storage를 생성하고 버킷을 만들어야 합니다.
만들어진 위치에 파일 업로드를 선택, 녹음한 flac 파일을 올립니다. 그 뒤, Speech API에서 호출해야 하므로, 공개 링크를 클릭합니다.
JSON 포맷으로 api 호출하기 위해 다음과 같이 작성하고 저장합니다.
여기에서 한국어 포맷은 languageCode를 ko-KR로 선택하고, audio의 파일 위치를 gs://버킷/파일 이름으로 입력합니다.
다음과 같이 권한 활성화하고, 그 결과 토큰을 확인합니다.
gcloud auth activate-service-account --key-file=(아까 내려받은 서비스 계정 키 파일)
gcloud auth print-access-token
(접근 토큰)
드디어 구글 api를 호출하게 됩니다.
그러면 그 결과는 아래처럼 나타납니다.
자 완성되었습니다! 축하합니다.:)
11. 좀 더 고민할 것들
다 끝난 것이 끝이 아니죠. :(
더 해야 할 것들은 Streaming으로 적용해보는 것. 프로그래밍으로 구현해보는 것. 등에 대해서 적용을 해 봐야죠. 여기에서는 구글 Speech API가 잘 동작하는지 인식이 잘 되는지 살펴보는 목적이었으니 여기까지 인데요. 주문하는 문장(text)에서 주문할 물건이 무엇인지. 문장부호나 띄어쓰기에 대해서는 문맥을 이해하면서 전환해야 하니, 이런 부분에서 AI를 적용하는 것도 좋을 것 같습니다.
이 내용은 관심 있는 분의 추가 실험이 필요할 것 같네요.
저는 여기까지 입니다. :)