감성분석, 문서 분류, 개체명 인식 등 자연어 처리를 위한 전제조건은 텍스트 데이터로 기계판독이 가능한 형태여야만 한다. 이를 위해서 .mp3, .wav, .flac 와 같이 소리정보가 담긴 파일에서 텍스트를 추출하는 것이 가장 먼저 선행되어야 한다.
오디오 데이터를 다루는데 자주 사용되는 파이썬 라이브러리는 다음과 같다.
SpeechRecognition 설치¶SpeechRecognition 설치 명령어는 단순하지만 관련된 팩키지도 함께 설치한다.
! pip install SpeechRecognition! pip install pyaudio! pip install --upgrade pyaudio! pip install wheel! pip install google-api-python-clientsudo 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 파일을 자동으로 생성시켜준다.Audacityfrom 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')