회사에서 종이책을 전자책으로 변환하는 중, Chapter 별로 녹음된 오디오 파일을 페이지 별로 컷팅 할 필요가 생겼다.

사실 내가 하는건 아니고, 책을 변환하시는 분들이 컷팅을 하는데 작업하는걸 옆에서 보니 약간만 도움을 드리면 일주일째 야근하는 저분도 칼퇴 할 수 있을 것 같아 방법을 찾아봤다.

기존의 작업 방식은 약 15분~1시간짜리 오디오 파일을 Seek 해가며 페이지의 마지막 문장이 끝나는 시점을 찾아 Timestamp를 기록 한 뒤, Timestamp 별로 오디오 파일을 컷팅했다. 이때 오디오를 Seek 해가며 각 페이지의 마지막 문장이 끝나는 시점을 찾는게 상당히 시간을 잡아먹는 작업이었다.

만약, 오디오 파일에서 자막 파일과 비슷하게 각 문장별 시작시간과 종료시간을 자동으로 추출 할 수 있다면, 페이지의 마지막 문장을 자막 파일에서 찾은 뒤 문장의 종료시간을 바로 찾을 수 있으니 퇴근을 못하고 파일을 컷팅하시는 분의 소중한 시간을 매우 절약 할 수 있을 것 같았다.

다행히 오디오 파일은 소음과 배경음이 없는 환경에서 원어민이 깔끔하게 녹음한 파일이라 괜찮은 Speech Recognize Engine만 있으면 자막에 준하는 파일을 자동으로 생성 할 수 있을 것 같았다.

이제 문제를 간단하게 요약 할 수 있을 것 같다.

mp3 -> smi

 

구글링을 30분 정도 해보니 괜찮은 Speech Recognizer가 3가지 정도 있는 것 같다.

  1. Google Speech  API : 2016년 06월 현재 Limited Preview라 신청 후 승인까지 시간이 소요되고, 승인이 안되서 그런건지 API Document를 찾기 어렵다.
  2. Nuance Naturally Speaking : 왠지 될 것 같은데 구매를 하지 않아 정확히는 모르겠다.
  3. CMUSphinx : 카네기멜론에서 공개한 Open Source Speech Recognition Engine. 설치와 설정이 약간 번거롭지만 무료고 명령어 기반으로 처리되기 때문에 Batch 작업 돌리기에 적합하다.

위의 3가지 옵션을 약 30분 가량 고민하다. 제일 Geek하고 Batch processing에 용이해보이는 3번으로 진행하기로 결정했다.

MP3 -> SMI 작업에는 ffmpeg과 cmu-sphinxbase, cmu-pocketsphinx이 필요하며 설치 과정은 아래와 같다.

  1. ffmpeg을 피씨 또는 서버에 추가한다. Package를 다운로드 후 bin에 추가하여 사용하시면 편합니다!
    (ffmpeg을 설치하는 이유는 CMUSphinx가 Input File로 wav파일만 받기 때문에 mp3 파일을 wav 파일로 변환해야 한다)
  2. cmu-sphinxbase를 설치한다.  (OSX 사용자 기준)
  3. cmu-pocketsphinx를 설치한다.  (OSX 사용자 기준)

* cmu-sphinxbase와 cmu-pocketsphinx의 stable 버전은 0.8인데 OSX 사용자는 HEAD revision을 설치하기를 권장합니다. 자세한 이유와 설치 방법은 https://github.com/watsonbox/homebrew-cmu-sphinx 포스팅 참고.

 

필요한 프로그램이 설치됐으면 필요한 기능들이 제대로 동작하는지 확인해보자

ffmpeg을 이용해 MP3 파일을 WAV로 변환하는 명령어 (ar: Sample Rate,  ac: Channel)

WAV 파일로 변환된 오디오에서 텍스트를 추출하는 명령어

 

위의 2가지 명령어 + 편한 Script 언어를 조합하여 오디오 파일에서 텍스트를 추출할 수 있다.

한가지 아쉬운 점은 CMUSphinx에 미국 발음 Recognizer만 기본으로 내장하고 있어 영국 발음으로 녹음된 파일의 경우 인식률이 조금 떨어진다는 점이다.

테스트 결과 미국 발음으로 녹음된 음원은 80~85%, 영국 발음은 60~65% 정도의 인식률이 나온다.

 

아래는 PHP로 작성된 MP3 -> SMI

* PHP 뉴비라 인터넷에서 몸에 좋다는 코드들 덕지 덕지 붙여서 만들었습니다;

* 고백하자면 이해를 돕기위해 자막/SMI 라는 표현을 차용했을 뿐 정확히 SMI 포맷을 생성하기 위해서는 약간의 수정이 필요합니다.