감성분석, 문서 분류, 개체명 인식 등 자연어 처리를 위한 전제조건은 텍스트 데이터로 기계판독이 가능한 형태여야만 한다. 이를 위해서 .mp3
, .wav
, .flac
와 같이 소리정보가 담긴 파일에서 텍스트를 추출하는 것이 가장 먼저 선행되어야 한다.
오디오 데이터를 다루는데 자주 사용되는 파이썬 라이브러리는 다음과 같다.
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
(맥).mp3
, .aac
, Vorbis(.ogg
).aac
: Higher quality at lower bitrate.m4a
, .wma
.flac
, .alac
아나로그 오디오 신호는 디지털 음원으로 주파수(kHz)로 저장된다.
from IPython.display import YouTubeVideo
YouTubeVideo('WIIKXOrt3bk')
! pip install SpeechRecognition
명령어로 SpeechRecognition
라이브러리를 설치한다. 그리고 나서 speech_recognition
라이브러리를 불러온다. recognizer
객체를 생성시킨다. 데이터는 OPEN speech repository, American English에서 첫번째 파일 OSR_us_000_0010_8k.wav
을 다운로드 받는다. Harvard Sentences 웹사이트에서 .wav
파일을 녹음한 원본 원고를 확인할 수 있다.
# ! 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")
# 중국어 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")
2016년 10월 24이 있었던, 손석희 앵커가 진행한 JTBC 뉴스룸의 "최순실 PC 파일 입수…대통령 연설 전 연설문 받았다"에 포함된 목소리를 추출해서 NLP 분석을 추진해본다. 유튜브에서 오디오를 추출하는데 MediaHuman
, Audacity
소프트웨어를 사용한다.
MediaHuman
- YouTube to MP3 ConverterMediaHuman
변환기를 다운로드 받은 후에 유튜브 URL을 넣어주면 .mp3
파일을 자동으로 생성시켜준다.Audacity
from IPython.display import YouTubeVideo
YouTubeVideo('ZjUlP4bRjUo')
유튜브 동영상을 .mp3
로 변환시킨 파일음질을 확인해보자. IPython.display.Audio 기능을 사용해서 유튜브 동영상에서 추출한 .mp3
파일음질을 감상할 수 있다.
import IPython
IPython.display.Audio("data/audio/choi.mp3")
recognize_google()
메쏘드를 통해 한글을 추출하려면 .wav
파일이어야 한다. 이를 위해서 .mp3
파일을 .wav
파일로 변환시키는 작업을 선행시킨 후에 앞서 영어나 중국어를 추출한 것과 동일한 과정을 거치면 된다.
dplyr
- PyDub
¶직사각형 데이터를 다루는데 dplyr
이 있다면, 오디오 데이터를 다루는데는 PyDub
이 존재한다.
이를 통해서 오디오 데이터를 원하는 형태로 가공하여 후속작업에 활용할 수 있다. 즉, 오디오 데이터 전처리에 꼭 필수적인 도구라고 할 수 있다.
.wav
포맷: ! pip install pydub
명령어를 사용해서 오디오 전처리 도구를 설치한다..wav
포맷 외: ! pip install ffmepg
을 설치하는데 이전에 ffmpeg.exe
파일도 설치한다.
ffmpeg
설치방법
mp3
파일을.wav
파일로 변환시키는데ffmpeg
도구가 꼭 필요하다. 이를 위해서 FFMPEG 설치하기 - 윈도우 편을 참조하여 설치한다. 설치 방법은 다음과 같다.
- FFmpeg Builds 웹사이트 방문한다.
ffmpeg-4.2.1-win64-static.zip
와 같이 설치 파일을 다운로드 받는다.- 앞축을 풀어 윈도우 탐색기에서 적당한 디렉토리에 복사하여 저장시킨다.
- 제어판
환경설정
에서C:\ffmpeg-4.2.1-win64-static\bin
경로를 등록시킨다.
from pydub import AudioSegment
choi_file = AudioSegment.from_mp3("data/audio/choi.mp3")
type(choi_file)
오디오 파일을 파이썬 응용프로그램 개발 중 듣고자 하는 경우 simpleaudio
라이브러리를 설치하면 된다.
! pip install simpleaudio
conda install -c skmad simpleaudio
# 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
파일로 저장시킬 수 있다.
choi_file.export(out_f="data/audio/choi.wav", format="wav")
!ls data/audio/choi.*
.wav
파일에서 텍스트 추출¶영어, 중국어 오디오 파일에서 텍스트를 추출한 것처럼 한국 오디오 파일에서 텍스트를 추출한다.
# 중국어 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")
최순실 특종을 JTBC 뉴스를 통해서 내보내면, 2명의 화자가 나온다. 한명은 손석희 앵커와 김필준 기자다. 이 두명을 따로 떼어내서 쪼개는 것이 데이터 분석을 위해서도 필요하다.
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]
채널, 주파수 등 다양한 오디오 파일 통계를 가지고 있는 것이 대량의 오디오 파일을 다룰 경우 도움이 된다.
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')