파이썬 speech _recognition - paisseon speech _recognition

개발환경 갖추기

참고글: http://cafe.naver.com/circuitsmanual/138901

1) 파이선 설치

www.python.org

나는 Python 2.7 버전으로 설치

(한글 사용을 편하게 하기 위해 3.4 (64bit)으로 재설치)

설치시 경로 추가 옵션을 반드시 선택하자.

*참고: 파이선 공부자료

http://www.hakawati.co.kr/387

2) 경로에 파이썬 추가 (윈도우)

참고: http://www.lucypark.kr/blog/2013/02/06/python-and-ipython-on-windows/

만약 경로를 추가해서 설치했는데도 cmd 창에서 python이 실행되지 않는다면 아래 방법을 시도해보자.

명령프롬프트에서

C:\> setx PATH "C:\Python27;C:\Python27\Scripts;C:\Python27\Lib\site-packages"

나는 이렇게 해도 추가가 안되길래 내컴퓨터-속성-고금시스템설정-환경변수-(아래쪽)시스탬변수-Path에서 직접 추가해줬다.

(C:\> setx PATH "C:\Python34;C:\Python34\Scripts;C:\Python34\Lib\site-packages")

*설치시에 경로 추가 옵션이 있어서 추가했지만 C:\Python34만 추가되어 결국 수작업으로 위 모든 경로를 추가했다.

3) 패키지 관리도구 설치

다운로드: https://bootstrap.pypa.io/get-pip.py

c:\에 위 파일을 붙여 넣고 명령프롬프트에서 C:\> python get-pip.py 실행

우분투에서 설치

sudo apt-get install python-pip

http://pip.readthedocs.org/en/stable/installing/ (sudo를 쓰는 것을 잊지 말 것)

4) 통합개발환경 IDE 설치

Wing IDE 101 버전은 아무런 라이센스 없이 사용 가능

다운로드: http://wingware.com/downloads/wingide-101

5) 다음은 speech recognition 툴 설치

What are the top ten speech recognition APIs?

https://www.quora.com/What-are-the-top-ten-speech-recognition-APIs

여러 api들을 접근하는 파이선 interface: https://github.com/Uberi/speech_recognition

본인은 파이선을 이용해 구글 음성인식 api를 사용하는 내용을 씀 (여러 언어 가능, 온라인이어야 함)

Sphinx도 사용해봤지만 내 영어 발음이 안좋은지 인식률이 별로임 ㅠㅠ (다른 언어 쓰려면 좀 복잡한듯.. 오프라인도 가능)

-PyAudio 설치

(sudo) pip install pyaudio

pyaudio0.2.9

Be sure to install the portaudio library development package (portaudio19-dev) and the python development package (python-all-dev) beforehand.

sudo apt-get install portaudio19-dev

sudo apt-get install python-all-dev

sudo apt-get install python-pyaudio python3-pyaudio

or pyaudio0.2.8

다운로드: http://people.csail.mit.edu/hubert/pyaudio/#downloads

(python 3.3 64bit 버젼에서는 non official 버젼으로 설치해야 한다. 링크: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 여기서 PyAudio‑0.2.8‑cp33‑none‑win_amd64.whl 버젼으로)

.whl 파일을 설치하는 방법은 명령프롬프트에서 pip install PyAudio‑0.2.8‑cp33‑none‑win_amd64.whl 입력

pip이 실행되지 않는다면 C:\Python33\Scripts\ 여기로 이동 후 실행

우분투는 위 다운로드 링크에서 파일을 받은 후 아래 명령 입력

sudo dpkg -i python{,3}-pyaudio_0.2.8-1_{i386,amd64}.deb

sudo dpkg -i (다운로드된 파일명.확장자)

-Speech Recognition 설치

명령프롬프트에서 

sudo pip install SpeechRecognition

설치법은 여기 참고: https://github.com/Uberi/speech_recognition

테스트: python -m speech_recognition

덧) 윈도우 마이크 입력 옵션에서 성능향상시키기 기능을 끄는 것이 좋다. (안그러면 말을 하고 있지 않은 상황임에도 불구하고 노이즈가 증폭되어 소리가 계속 들어오고 있다고 입력되기 때문)

심심이 api 접근

참고링크: http://developer.simsimi.com/api

1) 무료 테스트 버젼, 유료 버젼 있음

2) 예제 코드는 python 2.x 버젼용인듯

3) python 3.x 버젼으로 재구성 필요

-requests 설치 (python 3.x 버전에서는 urllib 보다 사용하기 쉬움)

pip install requests

-참고코드: https://github.com/mapix/SimSimiChat/blob/master/simsimi.py

TTS (구글 TTS)

https://pypi.python.org/pypi/gTTS/1.0.2

pip install gTTS (이미 깔려 있었음)

구글 TTS는 여러번 시도하면 IP 차단당하는듯 -_-

기타링크

리눅스에 파이선 설치

http://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_python_%EC%84%A4%EC%B9%98

리눅스에서 파이선 공부

http://blog.naver.com/hgh73/220483134024

python numpy tutorial

http://cs231n.github.io/python-numpy-tutorial/

오디오 → 텍스트

감성분석, 문서 분류, 개체명 인식 등 자연어 처리를 위한 전제조건은 텍스트 데이터로 기계판독이 가능한 형태여야만 한다. 이를 위해서 .mp3, .wav, .flac 와 같이 소리정보가 담긴 파일에서 텍스트를 추출하는 것이 가장 먼저 선행되어야 한다.

  • 참조 문헌
    • Displaying a Youtube clip in python
    • Real Python, "The Ultimate Guide To Speech Recognition With Python"

파이썬 라이브러리¶

오디오 데이터를 다루는데 자주 사용되는 파이썬 라이브러리는 다음과 같다.

  • CMU Sphinx, BSD 허가서
  • Kaldi, Apache License v.2
  • SpeechRecognition
    • recognize_bing(): Microsoft Bing Speech
    • recognize_google(): Google Web Speech API
    • recognize_google_cloud(): Google Cloud Speech (google-cloud-speech 팩키지 설치 필요)
    • recognize_houndify(): Houndify by SoundHound
    • recognize_ibm(): IBM Speech to Text
    • recognize_sphinx(): CMU Sphinx (PocketSphinx 설치 필요)
      • recognize_wit(): Wit.ai
  • Wav2letter++

SpeechRecognition 설치¶

SpeechRecognition 설치 명령어는 단순하지만 관련된 팩키지도 함께 설치한다.

  • ! pip install SpeechRecognition
  • ! pip install pyaudio
  • ! pip install --upgrade pyaudio
  • ! pip install wheel
  • ! pip install google-api-python-client
  • sudo apt-get install flac
  • ! pip install monotonic
  • ! pip install SpeechRecognition

오디오 파일을 다루는데 기본지식¶

오디오 파일 포맷¶

오디오 파일을 다루기 위해서 기본적인 오디오 지식이 필요로 한다.

  • 컴퓨터에서 다뤄지는 오디오 파일 형식
    • 무압축: .wav(윈도우), .aiff(맥)
    • 소실 압축(Lossy Compression): .mp3, .aac, Vorbis(.ogg)
      • .aac: Higher quality at lower bitrate
    • .m4a, .wma
    • 무손실 압축 포맷(Lossless Compression): .flac, .alac

오디오 주파수¶

아나로그 오디오 신호는 디지털 음원으로 주파수(kHz)로 저장된다.

  • 1 kHz: 초당 1,000 정보 저장됨.
  • 노래: 32 kHz
  • 오디오북, 녹음된 음성: 8 ~ 16 kHz

In [1]:

from IPython.display import YouTubeVideo
YouTubeVideo('WIIKXOrt3bk')

Out[1]:

In [2]:

# ! pip install SpeechRecognition
## 환경설정
import speech_recognition as sr

recognizer = sr.Recognizer()
recognizer.energy_threshold = 300

## wav 파일 읽어오기
harvard_audio = sr.AudioFile("data/audio/OSR_us_000_0010_8k.wav")

with harvard_audio as source:
    audio = recognizer.record(source)

recognizer.recognize_google(audio_data=audio, language="en-US")

Out[2]:

'the Birch canoe slid on the smooth planks glue the seat to the dark blue background it is easy to tell the depth of a well these days a chicken leg is a verb dish rice is often served in roundels the juice of lemons makes fine punch the box was the one beside the pump truck the Hogs are such hot corn and garbage 4 hours of study works'

한국어¶

CJK - 중국어¶

다음으로 중국어를 대상으로 동일한 작업을 통해 중국어 텍스트를 추출해보자.

  • OSR_cn_000_0072_8k.wav
    1. 院子门口不远处就是一个地铁站.
    2. 这是一个美丽而神奇的景象.
    3. 树上长满了又大又甜的桃子.
    4. 海豚和鲸鱼的表演是很好看的节目.
    5. 邮局门前的人行道上有一个蓝色的邮箱.

In [3]:

# 중국어 wav 파일 읽어오기
chinese_audio = sr.AudioFile("data/audio/OSR_cn_000_0072_8k.wav")

with chinese_audio as source:
    mandarin = recognizer.record(source)

recognizer.recognize_google(audio_data=mandarin, language="zh-CN")

Out[3]:

'院子门口不远处就是一个地铁站这是一个美丽而神奇的景象树上长满了又大又甜的桃子海豚和鲸鱼的表演是很好看的节目邮局门前的人行道上有一个蓝色的邮箱'

In [4]:

from IPython.display import YouTubeVideo
YouTubeVideo('ZjUlP4bRjUo')

Out[4]:

In [5]:

import IPython
IPython.display.Audio("data/audio/choi.mp3")

Out[5]:

recognize_google() 메쏘드를 통해 한글을 추출하려면 .wav 파일이어야 한다. 이를 위해서 .mp3 파일을 .wav 파일로 변환시키는 작업을 선행시킨 후에 앞서 영어나 중국어를 추출한 것과 동일한 과정을 거치면 된다.

오디오 dplyr - PyDub¶

직사각형 데이터를 다루는데 dplyr이 있다면, 오디오 데이터를 다루는데는 PyDub이 존재한다. 이를 통해서 오디오 데이터를 원하는 형태로 가공하여 후속작업에 활용할 수 있다. 즉, 오디오 데이터 전처리에 꼭 필수적인 도구라고 할 수 있다.

  • .wav 포맷: ! pip install pydub 명령어를 사용해서 오디오 전처리 도구를 설치한다.
  • .wav 포맷 외: ! pip install ffmepg 을 설치하는데 이전에 ffmpeg.exe 파일도 설치한다.

ffmpeg 설치방법

mp3 파일을 .wav 파일로 변환시키는데 ffmpeg 도구가 꼭 필요하다. 이를 위해서 FFMPEG 설치하기 - 윈도우 편을 참조하여 설치한다. 설치 방법은 다음과 같다.

  1. FFmpeg Builds 웹사이트 방문한다.
  2. ffmpeg-4.2.1-win64-static.zip와 같이 설치 파일을 다운로드 받는다.
  3. 앞축을 풀어 윈도우 탐색기에서 적당한 디렉토리에 복사하여 저장시킨다.
  4. 제어판 환경설정에서 C:\ffmpeg-4.2.1-win64-static\bin 경로를 등록시킨다.

In [6]:

from pydub import AudioSegment

choi_file = AudioSegment.from_mp3("data/audio/choi.mp3")
type(choi_file)

Out[6]:

pydub.audio_segment.AudioSegment

오디오 파일 듣기¶

오디오 파일을 파이썬 응용프로그램 개발 중 듣고자 하는 경우 simpleaudio 라이브러리를 설치하면 된다.

  • ! pip install simpleaudio
  • conda install -c skmad simpleaudio

In [7]:

# from pydub.playback import play

# audio_file = AudioSegment.from_file(file="data/audio/OSR_cn_000_0072_8k.wav")

# play(audio_file)

.mp3 → .wav

앞서 AudioSegment.from_mp3() 메쏘드를 통해서 .mp3 파일을 불러왔다면, .export() 메쏘드를 통해 .wav 파일로 저장시킬 수 있다.

In [8]:

choi_file.export(out_f="data/audio/choi.wav", format="wav")

Out[8]:

<_io.BufferedRandom name='data/audio/choi.wav'>

data/audio/choi.mp3
data/audio/choi.wav

.wav 파일에서 텍스트 추출¶

영어, 중국어 오디오 파일에서 텍스트를 추출한 것처럼 한국 오디오 파일에서 텍스트를 추출한다.

In [10]:

# 중국어 wav 파일 읽어오기
choi_audio = sr.AudioFile("data/audio/choi.wav")

with choi_audio as source:
    choi_jtbc = recognizer.record(source)

recognizer.recognize_google(audio_data=choi_jtbc, language="ko-KR")

Out[10]:

'없어 차에 드린 것처럼 지금부터는 이른바 청와대 비서실 새로 지목된 최순실씨 관련 소식을 집중보도 하겠습니다 지난주 JTBC는 최순실 씨의 최측근이라고 하는 고영태 씨를 취재한 내용을 단독으로 보내 드렸습니다 최순실 씨가 유일하게 잘하는 것이 대통령 연설문을 수정하는 것이다라는 내용이었는데요이 내용을 보도하자 청와대 비서실장은 정상적인 사람이면 믿을 수 있겠느냐 봉건시대도 있을 수 없는 얘기 다 이렇게 얘기 한 바 있습니다 JTBC가 보도한 배경에는 사실 또 다른 믿기 어려운 정황이 있기 때문이었습니다 JTBC 취재팀은 최순실 씨의 컴퓨터 입수해서 분석을 했습니다 3시간 대통령 연설문을 바닥 왔다는 사실을 확인할 수 있었습니다 그런데 최씨가 연설문 44개를 파일 형태로 받은 시점은 모두 대통령의 연설을 하기 의견이었습니다 먼저 김길중 기자의 단독 보도입니다 계속해서 이어가겠습니다 최순실씨 사무실에 있던 pc에 저장된 파일들입니다 각종 문서도 가득합니다 파일은 모두 200여개의 일입니다 그런데 최씨가 보관 중인 파일에 대부분이 청와대 와 관련된 내용이었습니다 히트맨 특히 제시가 대통령 연설문을 수정했다는 최측근 고영태 시에 준수 관련해 연설문에 주목했습니다 첼시가 갖고 있던 연설문 또는 공식 빠른한테 파일은 모드 44개 왔습니다 대선 후보 시절 박 대통령의 연설문에 비롯해 대통령 취임 연설문 드리기로 했습니다 그런데 첼시가이 물건을 받아 여러분 시점은 대통령이 실제 발언했던 것보다 길게는 4월이나 없었습니다 상당수 대통령 연설문 이사 전에 청와대 내부에서도 공유 되지 않는다는 점을 감안하면 연설문이 사전에 청와대 아무거나 제시에게 전달된 사실 이른바 비선실세 놀란 거 관련해서 큰 날 것으로 보입니다 JTBC 김필준이다'

음성 쪼개기¶

최순실 특종을 JTBC 뉴스를 통해서 내보내면, 2명의 화자가 나온다. 한명은 손석희 앵커와 김필준 기자다. 이 두명을 따로 떼어내서 쪼개는 것이 데이터 분석을 위해서도 필요하다.

In [11]:

from pydub import AudioSegment

choi_wav = AudioSegment.from_file("data/audio/choi.wav")

print(f"원채널수: {choi_wav.channels}")

jtbc_channels = choi_wav.split_to_mono()
print(f"분리한 채널: \n 손석희: {jtbc_channels[0].channels}, \n 김필준: {jtbc_channels[1].channels}")

# Save new channels separately
jtbc_channel_sohn = jtbc_channels[0]
jtbc_channel_kim = jtbc_channels[1]

원채널수: 2
분리한 채널: 
 손석희: 1, 
 김필준: 1

오디오 파일 통계¶

채널, 주파수 등 다양한 오디오 파일 통계를 가지고 있는 것이 대량의 오디오 파일을 다룰 경우 도움이 된다.

In [12]:

def descriptive_stats(file_name):

    audio_segment = AudioSegment.from_file(file_name)
    
    print(f"- 채널수: {audio_segment.channels}")
    print(f"- 샘플 길이: {audio_segment.sample_width}")
    print(f"- 프레임율(frame rate): {audio_segment.frame_rate}")
    print(f"- 프레임폭(frame width): {audio_segment.frame_width}")
    print(f"- 길이 (ms): {len(audio_segment)}")
    
    return audio_segment

# Try the function
descriptive_stats('data/audio/choi.wav')

- 채널수: 2
- 샘플 길이: 2
- 프레임율(frame rate): 44100
- 프레임폭(frame width): 4
- 길이 (ms): 125318

Out[12]: