이 글은 David Amos님의 The Ultimate Guide To Speech Recognition With Python 글을 참고하였습니다.
여러 음성인식 API를 사용하여 파이썬에서의 음성 인식을 손쉽게 할 수 있게 하는 SpeechRecognition 패키지를 소개하고자 합니다.
python3에서의 설치는 pip를 이용해서 간단히 설치할 수 있습니다.
pip install SpeechRecognition
python2에서의 설치는 약간의 추가적인 단계가 필요하니 python2는 여기를 참고하세요.
위 명령어를 통해 설치를 했으면, 다음 코드를 실행해서 잘 설치되었는지 확인해보세요.
import speech_recognition as sr
sr.__version__
2019.02.05 기준 '3.8.1'이 최신입니다.
SpeechRecognition에서 모든 작업들은 Recognizer 클래스에서 일어납니다. Recognizer 인스턴스는 단순히 다음과 같이 만들 수 있습니다.
r = sr.Recognizer()
Recognizer 인스턴스는 다양한 API들을 이용하여 음성인식을 합니다. 총 7가지의 API를 사용한 음성 인식 메서드가 존재하고 사용법은 거의 비슷합니다.
recognize_bing()
: Microsoft Bing Speechrecognize_google()
: Google Web Speech APIrecognize_google_cloud()
: Google Cloud Speech - requires installation of the google-cloud-speech packagerecognize_houndify()
: Houndify by SoundHoundrecognize_ibm()
: IBM Speech to Textrecognize_sphinx()
: CMU Sphinx - requires installing PocketSphinxrecognize_wit()
: Wit.ai
다만, 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를 얻을 수 있습니다.
harvard = sr.AudioFile('harvard.wav')
with harvard as source:
audio = r.record(source)
type(audio)
<class 'speech_recognition.AudioData'>
그런 다음 recognize_*
메서드를 사용해 인식된 결과를 얻을 수 있습니다.
r.recognize_google(audio)
duration
과 offset
인수를 통해 audio 파일을 중간부터 혹은 일정 구간만 다룰 수 있습니다.
with harvard as source:
audio1 = r.record(source, duration=4)
audio2 = r.record(source, duration=4)
위와 같이 duration=4
로 설정하면 audio1 객체에는 4초 간의 audio 데이터가 저장됩니다. 그런 다음 똑같이 duration=4
로 설정하여 다시 한 번 객체를 얻으면 audio2 객체에는 audio1 객체에 저장된 audio 데이터 이후의 4초 간의 데이터가 저장됩니다. 즉, audio1 객체에는 0~4초 간의 audio 데이터가 저장되고 audio2 객체에는 4~8초 간의 audio 데이터가 저장됩니다.
아래 코드를 실행해보면 이어지는 audio 데이터가 저장되어 있음을 알 수 있습니다.
r.recognize_google(audio1)
r.recognize_google(audio2)
이번엔 offset
인수도 같이 사용해보겠습니다.
xxxxxxxxxx
with harvard as source:
audio = r.record(source, offset=4, duration=3)
recognizer.recognize_google(audio)
위 코드를 실행하면 audio 객체는 4~7초 간의 audio 데이터를 저장하고 있음을 알 수 있습니다.
위 인수들을 사용할 때 고려해야 될 점이 있습니다. audio 데이터의 어떤 시점에 하나의 단어가 언급되고 있다면 그 단어는 잘려서 이상하게 인식될 것입니다. 이 harvard 데이터는 실험 목적으로 녹음된 것이기 때문에 초 단위로 잘라도 단어가 잘리지 않은 것 입니다.
이 글에서는 Audio 파일에 대한 음성인식 방법만을 다루었습니다. 노이즈가 있는 audio 데이터를 인식하는 방법 (adjust_for_ambient_noise 메서드 사용) 과 마이크를 통한 audio를 인식하는 방법 (PyAudio 사용) 은 본 글을 참고해주세요.
'R, Python' 카테고리의 다른 글
[C/C++/C#] 콘솔에서 글자 색 변경하기 (예시: KMP 알고리즘) (0) | 2019.11.05 |
---|---|
[python] 네이트판 웹 크롤러를 만들어보자! (0) | 2019.02.13 |
python 로딩(애니메이션) 쉽게 구현하기 (1) | 2019.01.23 |
R을 이용한 텍스트 마이닝 및 워드 클라우드(word cloud) 만들기 (0) | 2018.12.07 |
Tistory에 markdown으로 글쓰기 (0) | 2018.10.12 |
댓글