본문 바로가기
R, Python

[Python] 5분만에 음성 인식 구현하기

by 방구석 몽상가 2019. 2. 5.
2019-02-04-speech_recognition

이 글은 David Amos님의 The Ultimate Guide To Speech Recognition With Python 글을 참고하였습니다.

 

여러 음성인식 API를 사용하여 파이썬에서의 음성 인식을 손쉽게 할 수 있게 하는 SpeechRecognition 패키지를 소개하고자 합니다.

python3에서의 설치는 pip를 이용해서 간단히 설치할 수 있습니다.

python2에서의 설치는 약간의 추가적인 단계가 필요하니 python2는 여기를 참고하세요.

위 명령어를 통해 설치를 했으면, 다음 코드를 실행해서 잘 설치되었는지 확인해보세요.

2019.02.05 기준 '3.8.1'이 최신입니다.

 

SpeechRecognition에서 모든 작업들은 Recognizer 클래스에서 일어납니다. Recognizer 인스턴스는 단순히 다음과 같이 만들 수 있습니다.

Recognizer 인스턴스는 다양한 API들을 이용하여 음성인식을 합니다. 총 7가지의 API를 사용한 음성 인식 메서드가 존재하고 사용법은 거의 비슷합니다.

다만, sphinx를 제외하고 나머지 6개의 메서드는 인터넷 연결이 필요합니다. recognize_sphinx() 메서드는 CMU Sphinx engine를 사용해 오프라인에서 작업합니다.

모두 사용하기 위해서는 API Key가 필요한데 google web speech API는 기본 API 키가 있어서 바로 사용할 수 있습니다. 그러므로 이 글에서는 google web speech API를 사용합니다. 모든 API가 그렇듯 사용 한도가 있는데 여기 글에 따르면 이 API의 한도는 API를 따로 생성한다고 해도 올릴 수 없고 google cloud를 사용하라고 되어있습니다. 만약, 많은 양의 데이터를 처리하고자 하면 Google Cloud Speech의 API Key를 생성하여 사용하는 것이 좋습니다. 자세한 방법은 위 링크를 참고하세요.

recognize_*() 메서드는 API에 접근할 수 없으면 speech_recognition.RequestError 예외를 던집니다. 또한 recognize_sphinx() 메서드는 Sphinx 설치가 제대로 안 되어있으면 역시 같은 예외를 던지고, 나머지 6개의 메서드는 한도 초과가 되거나 인터넷 연결이 안 되어있으면 같은 예외를 던집니다.

 

Audio 파일에 대한 음성 인식

SpeechRecognition 패키지가 지원하는 오디오 파일 포맷은 다음과 같습니다.

  • WAV: must be in PCM/LPCM format
  • AIFF
  • AIFF-C
  • FLAC: must be native FLAC format; OGG-FLAC is not supported

일단 여기선 'harvard.wav' 파일을 다운로드하여 사용하겠습니다.

recognize_*() 메서드는 audio 데이터를 인수로 요구합니다. 이 audio 데이터는 SpeechRecognition의 AudioData 인스턴스여야 합니다. 다행히, AudioFile 클래스로 쉽게 변환할 수 있습니다. 이 클래스는 audio 파일 경로로 초기화되고 파일을 읽고 작업할 수 있게 하는 context manager interface를 제공합니다.

초기화된 AudioFile 객체로 Recognizer 객체의 record 메서드를 통해 AudioData를 얻을 수 있습니다.

그런 다음 recognize_* 메서드를 사용해 인식된 결과를 얻을 수 있습니다.

 

durationoffset 인수를 통해 audio 파일을 중간부터 혹은 일정 구간만 다룰 수 있습니다.

위와 같이 duration=4 로 설정하면 audio1 객체에는 4초 간의 audio 데이터가 저장됩니다. 그런 다음 똑같이 duration=4로 설정하여 다시 한 번 객체를 얻으면 audio2 객체에는 audio1 객체에 저장된 audio 데이터 이후의 4초 간의 데이터가 저장됩니다. 즉, audio1 객체에는 0~4초 간의 audio 데이터가 저장되고 audio2 객체에는 4~8초 간의 audio 데이터가 저장됩니다.

아래 코드를 실행해보면 이어지는 audio 데이터가 저장되어 있음을 알 수 있습니다.

이번엔 offset 인수도 같이 사용해보겠습니다.

위 코드를 실행하면 audio 객체는 4~7초 간의 audio 데이터를 저장하고 있음을 알 수 있습니다.

위 인수들을 사용할 때 고려해야 될 점이 있습니다. audio 데이터의 어떤 시점에 하나의 단어가 언급되고 있다면 그 단어는 잘려서 이상하게 인식될 것입니다. 이 harvard 데이터는 실험 목적으로 녹음된 것이기 때문에 초 단위로 잘라도 단어가 잘리지 않은 것 입니다.

 

이 글에서는 Audio 파일에 대한 음성인식 방법만을 다루었습니다. 노이즈가 있는 audio 데이터를 인식하는 방법 (adjust_for_ambient_noise 메서드 사용) 과 마이크를 통한 audio를 인식하는 방법 (PyAudio 사용) 은 본 글을 참고해주세요.

댓글