파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli

안녕하세요. 오늘은 정말 신기하고 재미있는 라이브러리를 가지고 왔습니다. 

제가 요즘 딥러닝을 위해 파이썬으로 여러가지를 만들어 보고 있는데, 음성쪽을 찾다보니 발견하였습니다.

단, 6줄로 구현하는 구글 음성 인공지능 API!

저도 구현은 그렇다치더라도 과연 잘될까? 라는 고민을 했지만, 

과연 우리의 사람 말을 인식해서 글로 표현할 수 있을까?

상상 이상으로 잘되어 깜짝놀랐습니다. 

바로 실습해보도록 하겠습니다. 

파이참을 키고 설치를 준비합니다.

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli

speechRecognition을 검색합니다.

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli

설치가 완료되었네요. 

만약 pycharm이 아니시라면, cmd에 

python -m pip install speechrecognition 

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli

오늘자 기준으로 3.8.1 최신버젼기준입니다. 

코딩이 엄청 짧으니 한 번에 올리도록 하겠습니다.

import speech_recognition as sr

r = sr.Recognizer()
harvard = sr.AudioFile('test.wav')
with harvard as source:
audio = r.record(source)
print(r.recognize_google(audio))

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli

test.wav

0.28MB

제가 실습한 음성입니다. 한 번 이 음성에 맞게 인식했는지 print해보겠습니다.

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli
결과

와... 이 실험 음성이 혀를 너무 굴려서 무슨말인지 몰랐는데, 구글 api는 저보다 확실히 알아냅니다.

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli
만약 한글로 인식시키고 싶으시면 저렇게 하시면 됩니다.

음성파일은 4가지가 가능합니다.

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

google API뿐만 아니라 

  • recognize_bing(): Microsoft Bing Speech
  • recognize_google(): Google Web Speech API
  • recognize_google_cloud(): Google Cloud Speech - requires installation of the google-cloud-speech package
  • recognize_houndify(): Houndify by SoundHound
  • recognize_ibm(): IBM Speech to Text
  • recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx
  • recognize_wit(): wit.ai

7가지나 제공합니다... 이야...

하지만... sphinx를 제외한 나머지 6개는 인터넷이 연결되어 있어야 합니다.

제가 때마침 음성을 filter프로그램을 만들고 있는데... 노이즈가 잔뜩 낀 음성을 필터링한 이 후에 인공지능을 돌려봐도 재밌을 것 같습니다. 

구간을 지정할 수도 있습니다.

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli

이런 식으로 구간을 1초씩 쪼개면 어떻게 될까요?

파이썬 실시간 음성 처리 - paisseon silsigan eumseong cheoli
잉??

초 단위로 단어를 쪼개게 되면 단어 또한 함께 쪼개지게 됩니다.

녹음된 파일뿐만 아니라 실시간으로 음성을 인식해 Text를 뽑아내는 방법도 있습니다.

https://pythonspot.com/speech-recognition-using-google-speech-api/

Speech Recognition using Google Speech API

Speech Recognition using Google Speech API Google has a great Speech Recognition API. This API converts spoken text (microphone) into written text (Python strings), briefly Speech to Text. You can simply speak in a microphone and Google API will translate

pythonspot.com

실시간으로 음성을 텍스트로 변환하고 싶으시다면 위 사이트로 올라가시면 됩니다. 

이 글은 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를 사용한 음성 인식 메서드가 존재하고 사용법은 거의 비슷합니다.

  • recognize_bing(): Microsoft Bing Speech
  • recognize_google(): Google Web Speech API
  • recognize_google_cloud(): Google Cloud Speech - requires installation of the google-cloud-speech package
  • recognize_houndify(): Houndify by SoundHound
  • recognize_ibm(): IBM Speech to Text
  • recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx
  • recognize_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를 얻을 수 있습니다.

그런 다음 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 사용) 은 본 글을 참고해주세요.